1. 程式人生 > >IOS:SOAP(Webservice)請求基於AFN2.6之後

IOS:SOAP(Webservice)請求基於AFN2.6之後

在網上找了很久關於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 // &lt; // // < // // 小於號 value = [value stringByReplacingOccurrencesOfString:@"<" withString:@"&lt;"]; // // &gt; // // > // // 大於號 value = [value stringByReplacingOccurrencesOfString:@">" withString:@"&gt;"]; [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; }