首先有几点说在前面
- 一般,在请求URL的后面带有WSDL字样的需要调用WebService
- URL样式例子:http://ip:port/navigable/webservice/loginSerice?wsdl或者.wsdl
- wsdl (Web Services Description Language)网络服务描述语言
- 调用WebService默认使用POST请求
soap字符串
使用常见的AFNetworking 进行请求,请求分为两个部分,URL和parameter,URL就是后台给你的接口,这个parameter需要填写入一个完整的带有参数的soap字符串。
soap字符串格式如下:
1.命名空间在根目录上
<?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/" xmlns:前缀名(如:nsl)="webservice命名空间"> //前缀名一般是nsl,webservice命名空间找后台要 <soap:Header> //此处填写头内容 //有请求头就加上,没上就可去悼soap:Header标签 </soap:Header> <soap:Body> <前缀名:方法名> <参数名1>参数值1</参数名1> <参数名2>参数值2</参数名2> ....... </前缀名:方法名> </soap:Body> </soap:Envelope>
下面给一个根据参数userId请求数据的例子
- 前缀名是
nsl
- 命名空间是
http://cxfServer.fh.com
NSString * soapBodyStr = [NSString stringWithFormat:@"<nsl:queryCheckList>\ <userId>%@</userId>\ </nsl:queryCheckList>",userId]; 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/\"\ //自己填写的前缀名和命名空间 xmlns:nsl=\"http://cxfServer.fh.com/\">\ <soap:Body>\ //使用已拼接好的字符串soapBodyStr再次拼接进来 %@</soap:Body>\ </soap:Envelope>",soapBodyStr];
这样作为参数的soap字符串就拼接好了。
2.还有一种情况是命名空间在方法名上
则soap字符串格式如下:
<?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:Header> <soap:Body> <方法名 xmlns="webservice命名空间"> <参数1>参数值1</参数1> <参数2>参数值2</参数2> </方法名> </soap:Body> </soap:Envelope>
同样使用上面的例子,则soap字符串如下:
NSString * soapBodyStr = [NSString stringWithFormat: @"<queryCheckList xmlns="http://cxfServer.fh.com/\">\ <userId>%@</userId>\ </queryCheckList>",userId]; 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:Body>\ //使用已拼接好的字符串soapBodyStr再次拼接进来 %@</soap:Body>\ </soap:Envelope>",soapBodyStr];
使用AF进行完整请求
soap字符串已经完整拼接完成,下面进行该请求数据了
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer = [AFXMLParserResponseSerializer serializer]; // 设置请求超时时间 manager.requestSerializer.timeoutInterval = 60; // 返回NSData manager.responseSerializer = [AFHTTPResponseSerializer serializer]; // 设置请求头,也可以不设置 [manager.requestSerializer setValue:@"application/soap+xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; [manager.requestSerializer setValue:[NSString stringWithFormat:@"%zd", soapStr.length] forHTTPHeaderField:@"Content-Length"]; // 设置HTTPBody [manager.requestSerializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) { return soapStr; }]; [manager POST:url1 parameters:soapStr success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) { // 把返回的二进制数据转为字符串 NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; //使用自己写的请求方法resultWithDiction进行解析 NSDictionary * dic = [self resultWithDiction:result]; //通过Block传回数据 success(dic); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { if (failure) { NSLog(@"%@",error); failure(error); } }];
一个完整的调用WebService的请求就完成了。