IOS:SOAP(Webservice)请求基于AFN2.6之后
2017-04-18 10:52
183 查看
在网上找了很久关于SOAP的请求,然而发现网上全是基于2.0之后封装的。只好自己去做个基于2.6以后 也就是基于AFHTTPSessionManager 请求,2.6以前自行百度好多
本人依然还在学习,不足之处请多多指教,共同交流学习
git:https://github.com/SpadeZach/SOAP.git
//首先创建个自己的类,继承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 WebService Soap 请求遇到服务器400错误
- 第二篇:利用shell脚本执行webservice请求——基于soap
- IOS -- 基于WebService WSDL 的请求
- IOS 使用Http模拟SOAP请求Webservice时内容Unicode编码的实现
- iOS - AFNetworking3.0 发送SOAP请求到Webservice
- iOS WebService SOAP 请求的实现
- iOS iPhone通过get和post方式请求asp.net webservice
- Android基于SOAP协议向WebService交互数据,修改请求超时时间
- 用python发布基于soap的webservice
- WebService之WSDL和SOAP实例(基于JAVA)
- ios网络编程专题总结(重要)---webservice,xml,json,soap,asihttp
- iOS请求webservice
- iOS开发之iPhone通过get和post方式请求asp.net webservice
- WebService大讲堂之Axis2(10):使用soapmonitor模块监视soap请求与响应消息
- 【iOS SOAP】基于第三方开源项目:wsdl2objc
- 抓取Webservice Soap请求
- iOS请求webservice(转)
- WebService大讲堂之Axis2(10):使用soapmonitor模块监视soap请求与响应消息 (zhuan)
- WebService大讲堂之Axis2(10):使用soapmonitor模块监视soap请求与响应消息
- WebService大讲堂之Axis2(10):使用soapmonitor模块监视soap请求与响应消息