这是第一次调webservice的接口,并且后台没太做过移动端的接口,所以遇到了很多让人崩溃的困难。吃一堑长一智,所以这种时候懒得写博客的我就要趁着这股热乎劲把这次的过程记录下来啦~
首先要做的就是,在你的post方法里加上这一段:
//设置路径URL
NSURL * pathUrl = [NSURL URLWithString:url];
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:pathUrl];
request.HTTPMethod = @"POST";
// 设置方法名(问后台)
NSString *methodName = @"方法名";
// 设置请求体
NSString *parameterStr =@"";//这里就是要拼接的参数字符串了
for (NSString *key in parameters.allKeys) {//parameters就是参数字典
parameterStr = [NSString stringWithFormat:@"%@<%@>%@</%@>", parameterStr, key, parameters[key], key];
}
NSString *bodyStr = [NSString stringWithFormat:@"<%@ xmlns=\"%@\">%@</%@>",methodName,(这里的是命名空间字符串,命名空间是啥问后台),parameterStr,methodName];
//soapMsg里的都是死的,不用改,就把之前拼好的bodyStr拼进去就行,也就是只有方法名,命名空间和参数这三种变化的地方
NSString * soapMsg = [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:Body>%@</soap:Body></soap:Envelope>",bodyStr];
NSString *soapAction=[NSString stringWithFormat:@"%@%@",WebServiceNameSpace,methodName];
之后~~~大家是不是大多数都是用AFN啊,我也是,我就以AFN为例说一下了。
其实也没啥,之后就是得设置一下AFN的接收类型和请求头,因为我自己看到网上有人说因为没有设置这些出问题的,当然我也出了啊~但是,如果不设置是不是一定会出这些问题我就不知道了,因为我不设出问题了,可是网上有人不设没问题的。
设置接收类型:
self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/xml", @"text/html", @"text/plain", nil];
设置请求头:
// 设置请求头
[manager.requestSerializer setValue:[pathUrl host] forHTTPHeaderField:@"Host"];
[manager.requestSerializer setValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];//这里必须设的,不然会报415错误
[manager.requestSerializer setValue:[NSString stringWithFormat:@"%zd", soapMsg.length] forHTTPHeaderField:@"Content-Length"];
[manager.requestSerializer setValue:soapAction forHTTPHeaderField:@"SOAPAction"];
最后,设置HTTPBody:
[manager.requestSerializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) {
return soapMsg;
}];
然后就是请求了[manager POST:url parameters:soapMsg progress:^(NSProgress *downloadProgress) {…………………………
番外:
因为如果请求成功了的话返回的是xml,怎么解析嘞?
// 把返回的二进制数据转为字符串
NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
NSLog(@"%@",result);
// 利用正则表达式取出<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);
}
敲黑板!划重点:
以上这些你都设置好了之后,如果请求后出现,你这边请求成功了,后台的方法也走,并且:
1.你这边传的参数后台收到的是null
2.后台报警告:Received WS-I BP non-conformant Unquoted SoapAction
3.后台和安卓调这个接口能收到参数
不要怕,这十有八九就是后台的问题,请把这篇文章【http://www.zhangc.cn/post/74.html】发给你的后台,让他看看再说,然后再试试能不能行。(嘤嘤嘤,就因为第三条我自己上网又是找资料又是各种尝试的,改来改去都觉得我写的没毛病,两天后,可能是上天垂怜,后台有事出去了,把他电脑放我这让我看控制台的打印,这我才发现他报了第二条的警告……,然后我就上网查了,一查就查到了,真是醉了,好了收。我们要互相理解,谁都有犯错的时候,下次注意就行了,让世界充满爱吧~哈哈哈Hhhh.............=)
出现安卓能调通,iOS调不通的原因我也不太清楚了,后端我不太懂,是因为都是Java吗?!