平時(shí)調(diào)接口都是直接用 AFN 把接口地址放到 post 方法中就可以獲取到需要的數(shù)據(jù),但如何調(diào)用 java或.net 的 webservice 接口,以登錄方法為例:
地址是asmx的:
22.png
這時(shí)候需要通過(guò) AFN 發(fā)送 soap 請(qǐng)求。
- 構(gòu)建 soap 請(qǐng)求體
NSString *soapbody = [[NSString alloc] init];
for(NSString *str in pratams.allKeys)
{
soapbody = [soapbody stringByAppendingString:[NSString stringWithFormat:@"<%@>%@</%@>\\",str,[pratams objectForKey:str],str]];
}
2.根據(jù)后臺(tái)soap格式,拼接 soap 字符串(命名空間可能需要修改 )
//使用命名空間: http://tempuri.org/
NSString *soapStr = [NSString stringWithFormat:
@"<?xml version=\"1.0\" encoding=\"utf-8\"?>\
<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\
xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\
<soap:Header>\
</soap:Header>\
<soap:Body>\
<%@ xmlns=\"http://tempuri.org/\">\
%@\
</%@>\
</soap:Body>\
</soap:Envelope>",soapMethod,soapbody,soapMethod];
- 對(duì) AFN 相關(guān)參數(shù)進(jìn)行設(shè)置
AFHTTPSessionManager *manager = [ AppDelegate shareManager];
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
// 設(shè)置請(qǐng)求超時(shí)時(shí)間
manager.requestSerializer.timeoutInterval = 10;
// 返回NSData
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
// 設(shè)置請(qǐng)求頭,也可以不設(shè)置
[manager.requestSerializer setValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[manager.requestSerializer setValue:[NSString stringWithFormat:@"%zd", soapStr.length] forHTTPHeaderField:@"Content-Length"];
// 設(shè)置HTTPBody
[manager.requestSerializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) {
return soapStr;
}];
- post 方法
[manager POST:@"地址" parameters:soapStr progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// 把返回的二進(jìn)制數(shù)據(jù)轉(zhuǎn)為字符串
NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
// 利用正則表達(dá)式取出<return></return>之間的字符串
NSString *regularStr = [NSString stringWithFormat:@"(?<=%@Result\\>).*(?=</%@Result)",soapMethod,soapMethod];
NSRegularExpression *regular = [[NSRegularExpression alloc] initWithPattern:regularStr 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];
}
// 請(qǐng)求成功并且結(jié)果有值把結(jié)果傳出去
if (success && dict) {
success(dict);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (failure) {
failure(error);
//請(qǐng)求失敗
}
}];
完整代碼如下:
+ (void)SOAPData:(NSDictionary *)pratams soapMethod:(NSString *)soapMethod success:(void (^)(id))success failure:(void (^)(NSError *))failure
{
NSString *soapbody = [[NSString alloc] init];
for(NSString *str in pratams.allKeys)
{
soapbody = [soapbody stringByAppendingString:[NSString stringWithFormat:@"<%@>%@</%@>\\",str,[pratams objectForKey:str],str]];
}
//使用命名空間: http://tempuri.org/
NSString *soapStr = [NSString stringWithFormat:
@"<?xml version=\"1.0\" encoding=\"utf-8\"?>\
<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\
xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\
<soap:Header>\
</soap:Header>\
<soap:Body>\
<%@ xmlns=\"http://tempuri.org/\">\
%@\
</%@>\
</soap:Body>\
</soap:Envelope>",soapMethod,soapbody,soapMethod];
AFHTTPSessionManager *manager = [ AppDelegate shareManager];
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
// 設(shè)置請(qǐng)求超時(shí)時(shí)間
manager.requestSerializer.timeoutInterval = 10;
// 返回NSData
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
// 設(shè)置請(qǐng)求頭,也可以不設(shè)置
[manager.requestSerializer setValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[manager.requestSerializer setValue:[NSString stringWithFormat:@"%zd", soapStr.length] forHTTPHeaderField:@"Content-Length"];
// 設(shè)置HTTPBody
[manager.requestSerializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) {
return soapStr;
}];
[manager POST:@"地址" parameters:soapStr progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// 把返回的二進(jìn)制數(shù)據(jù)轉(zhuǎn)為字符串
NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
// 利用正則表達(dá)式取出<return></return>之間的字符串
NSString *regularStr = [NSString stringWithFormat:@"(?<=%@Result\\>).*(?=</%@Result)",soapMethod,soapMethod];
NSRegularExpression *regular = [[NSRegularExpression alloc] initWithPattern:regularStr 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];
}
// 請(qǐng)求成功并且結(jié)果有值把結(jié)果傳出去
if (success && dict) {
success(dict);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (failure) {
failure(error);
[[FunctionManager sharedHandel] showAlert:@"網(wǎng)絡(luò)連接失敗" duration:1.0];
}
}];
}
調(diào)用(比如登錄):
NSDictionary * paramDict = @{@"userName":_nameTextField.text,@"passWord":_passwordTextField.text};
[AFNwebManager SOAPData:paramDict soapMethod:@"getUserList" success:^(id responseObject) {
NSLog(@"%@",responseObject);
//獲取到數(shù)據(jù),進(jìn)行操作
} failure:^(NSError *error) {
//獲取失敗
}];
如果地址是wsdl的:
33.png
注意 soap 請(qǐng)求體的標(biāo)簽可能會(huì)不一樣,可以下載并借助 soapUI (下載后將接口網(wǎng)址放上去,會(huì)生成對(duì)應(yīng)的 soap 格式)
完整代碼:
- (void)SOAPData:(NSDictionary *)pratams soapMethod:(NSString *)soapMethod success:(void (^)(id))success failure:(void (^)(void))failure
{
NSString *soapbody = [[NSString alloc] init];
for(NSString *str in pratams.allKeys)
{
soapbody = [soapbody stringByAppendingString:[NSString stringWithFormat:@"<%@>%@</%@>\\",str,[pratams objectForKey:str],str]];
}
////.net http://tempuri.org/
//java 與。net的標(biāo)簽不一樣,需要借助soapUI查看
NSString *soapStr = [NSString stringWithFormat:
@"<?xml version=\"1.0\" encoding=\"utf-8\"?>\
<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ser=\"http://service.zhwy.com/\">\
<soapenv:Header>\
</soapenv:Header>\
<soapenv:Body>\
<ser:%@>\
%@\
</ser:%@>\
</soapenv:Body>\
</soapenv:Envelope>",soapMethod,soapbody,soapMethod];
self.manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
// 設(shè)置請(qǐng)求超時(shí)時(shí)間
self.manager.requestSerializer.timeoutInterval = 10;
// 返回NSData
self.manager.responseSerializer = [AFHTTPResponseSerializer serializer];
// 設(shè)置請(qǐng)求頭,也可以不設(shè)置
[self.manager.requestSerializer setValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[self.manager.requestSerializer setValue:[NSString stringWithFormat:@"%zd", soapStr.length] forHTTPHeaderField:@"Content-Length"];
// self.manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/xml",@"text/json", @"text/plain", @"text/html", nil];
// 設(shè)置HTTPBody
[self.manager.requestSerializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) {
return soapStr;
}];
self.task = [self.manager POST:HTTP_STR1 parameters:soapStr progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// 把返回的二進(jìn)制數(shù)據(jù)轉(zhuǎn)為字符串
NSString *result = [[NSString alloc] initWithData:(NSData *)responseObject encoding:NSUTF8StringEncoding];
// 利用正則表達(dá)式取出<return></return>之間的字符串
NSString *regularStr = [NSString stringWithFormat:@"(?<=return\\>).*(?=</return)"];
NSRegularExpression *regular = [[NSRegularExpression alloc] initWithPattern:regularStr options:NSRegularExpressionCaseInsensitive error:nil];
NSDictionary *dict = [NSDictionary dictionary];
// NSString *str;
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];
NSString *jsonStr = [result substringWithRange:checkingResult.range];
//注意接口傳過(guò)來(lái)的數(shù)據(jù)帶有"字樣,需要替換成“ " ”(引號(hào))
jsonStr = [jsonStr stringByReplacingOccurrencesOfString:@""" withString:@"\""];//替換字符
NSData *jsonData = [jsonStr dataUsingEncoding:NSUTF8StringEncoding];
dict = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableLeaves error:nil];
// str = [result substringWithRange:checkingResult.range];
}
// 請(qǐng)求成功并且結(jié)果有值把結(jié)果傳出去
if (success && dict) {
success(dict);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if(failure)
{
failure();
}
NSString *errorStr ;
if(error.code == -1001)
{
errorStr = @"網(wǎng)絡(luò)請(qǐng)求超時(shí)";
}
else if (error.code == -999){
return ;
}
else if (error.code == -1009)
{
errorStr = @"網(wǎng)絡(luò)未連接";
}
else
{
errorStr = @"服務(wù)器連接異常";
}
for (UIView *view in [UIApplication sharedApplication].keyWindow.subviews) {
if ([view isKindOfClass:[MBProgressHUD class]]) {
[view removeFromSuperview];
}
}
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:[UIApplication sharedApplication].keyWindow animated:YES];
hud.mode = MBProgressHUDModeText;
hud.label.text = errorStr;
hud.backgroundColor = [UIColor colorWithWhite:0.f alpha:0.5f];
hud.offset = CGPointMake(0.f, 200);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[MBProgressHUD hideHUDForView:[UIApplication sharedApplication].keyWindow animated:YES];
});
//HLog(@"error-----------%@",error);
}];
}