IOS:SOAP(Webservice)請求基於AFN2.6之後
阿新 • • 發佈:2019-01-25
在網上找了很久關於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;
}