您的位置:首页 > 移动开发 > IOS开发

IOS:SOAP(Webservice)请求基于AFN2.6之后

2017-04-18 10:52 183 查看
在网上找了很久关于SOAP的请求,然而发现网上全是基于2.0之后封装的。只好自己去做个基于2.6以后 也就是基于AFHTTPSessionManager 请求,2.6以前自行百度好多

//首先创建个自己的类,继承NSObject
//导入
#import <AFNetworking.h>
#import <commoncrypto/CommonCrypto.h>
/**
*  SOAP请求 接口 并不是完整封装需要自己去改
*
*/
+ (void)getSOAPUrl:(NSMutableDictionary *)paraDic success:(void (^)(id responseObject))success failure:(void(^)(NSError *error))failure{
//请求接口
NSString *url = [NSString stringWithFormat:@"%@%@",NEWS_List,Path_WebService_CmsWs];
// 得到发送数据长度
NSString * postData = [self getSOAPXML:Soap_MethodName soapAction:Soap_NameSpace paraDic:paraDic];

NSString *msgLength = [NSString stringWithFormat:@"%ld", (unsigned long)[postData length]];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer = [[AFHTTPResponseSerializer alloc] init];
NSLog(@"manager.responseSerializer = %@", manager.responseSerializer);

[manager.requestSerializer setValue:@"application/soap+xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
//这么写应该几乎全都支持了,遇到的坑,刚开始返回失败,返回信息会提示text/xml,网上会说text/html,并没效果,然而官方提示少text/xml,添加上以后可以请求了
[manager.responseSerializer setAcceptableContentTypes:[NSSet setWithObjects:@"text/html", @"application/json", @"text/json", @"text/javascript",@"text/css", @"text/plain", @"application/x-javascript", @"application/javascript",@"application/soap+xml",@"text/xml",nil]];
[manager.requestSerializer setValue:msgLength forHTTPHeaderField:@"Content-Length"];
// 设置HTTPBody AFN3.0后唯一方法
[manager.requestSerializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) {
return postData;
}];

[manager POST:url parameters:paraDic progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
//把返回的二进制数据转为字符串
NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
// 利用正则表达式取出<return></return>之间的字符串
NSRegularExpression *regular = [[NSRegularExpression alloc] initWithPattern:@"(?<=return\\>).*(?=</return)" options:NSRegularExpressionCaseInsensitive error:nil];
NSDictionary *dict = [NSDictionary dictionary];
for (NSTextCheckingResult *checkingResult in [regular matchesInString:result options:0 range:NSMakeRange(0, result.length)]) {
// 得到字典
dict = [NSJSONSerialization JSONObjectWithData:[[result substringWithRange:checkingResult.range] dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableLeaves error:nil];
}
// 请求成功并且结果有值把结果传出去
if (success && dict) {
success(dict);
}

} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
failure(error);
}];
}
+ (NSString *)getSOAPXML:(NSString *)soapNameSpace soapAction:(NSString *)soapAction paraDic:(NSDictionary *)paraDic {

NSMutableString *soapXml = [NSMutableString string];

[soapXml appendString:@"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"];

// Sopa Header
//有的时候可能是2001根据需要吧
[soapXml appendString:@"<soap:Envelope xmlns:xsi=\"http://www.w3.org/1999/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/1999/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n"];
// Soap Body
[soapXml appendString:@"<soap:Body>\n"];

// Soap Function
[soapXml appendString:[NSString stringWithFormat:@"<n0:%@ xmlns:n0=\"%@\">\n", soapAction,soapNameSpace]];

// Data-根据自己需要去添加
if (paraDic != nil && [paraDic count] > 0) {
// Add Data
NSArray *keys = [paraDic allKeys];

NSString * key;
NSString * value;

for (int i = 0; i < [keys count]; i++)
{
key = [keys objectAtIndex:i];
value = [paraDic objectForKey:key];

// Name
[soapXml appendString:[NSString stringWithFormat:@"<%@>",key]];

// Data
//    <
//
//    <
//
//    小于号
value = [value stringByReplacingOccurrencesOfString:@"<" withString:@"<"];

//
//    >
//
//    >
//
//    大于号
value = [value stringByReplacingOccurrencesOfString:@">" withString:@">"];

[soapXml appendString:value];

// Name End
[soapXml appendString:[NSString stringWithFormat:@"</%@>\n",key]];
}
}

// Soap Function End
[soapXml appendString:[NSString stringWithFormat:@"</n0:%@>\n", soapAction]];

// Soap Body End
[soapXml appendString:@"</soap:Body>\n"];

// Sopa Header End
[soapXml appendString:@"</soap:Envelope>\n"];

//    NSData *resultData;
//
//    resultData = [soapXml dataUsingEncoding:NSUTF8StringEncoding];

return soapXml;
}


本人依然还在学习,不足之处请多多指教,共同交流学习

git:https://github.com/SpadeZach/SOAP.git
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios web service soap