zoukankan      html  css  js  c++  java
  • iOS--对接soap协议接口

    最近在对接soap协议接口,分别使用AFN和系统自带方法进行解析。soap协议具体是什么就不阐述了,可以自行百度。

    说一下需要注意的地方:

    1,iOS与soap协议接口对接,参数要传xml格式的字符串,具体格式看接口说明,务必保持一致;

    2,soap1.1和soap1.2使用思路是一样的,但是设置的参数不一样,具体看代码;

    3,soap协议的返回值也是xml格式的,需要进行xml解析,获取需要节点下的数据(这里强调一点,可以根据某个节点获取需要的数据,但是也可以不管xml的节点,直接通过根节点获取需要的数据,这个是看后台怎么返回的).

    首先看一下要传递的参数格式:说白了就是一个请求体,只不过是xml格式的而已

        NSString *soapMessage = [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> 
                             <xiaoxi xmlns= "http://tempuri.org/ "> 
                             <typeValue>%@</typeValue> 
                            </xiaoxi> 
                             </soap:Body> 
                             </soap:Envelope>",@"147"];

    用系统自带的方法进行解析:

    #pragma mark - 用系统自带的
    - (void)postWithSoapMessage:(NSString *)message {
        
        // url
        NSURL *url = [NSURL URLWithString:XMHTTPADDRESS];
        // request
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        // 设置POST请求方式
        [request setHTTPMethod:@"POST"];
        // SOAPAction  soap1.1必须设置 soap1.2不设置
        [request addValue:@"http://tempuri.org/UserLogin" forHTTPHeaderField:@"SOAPAction"];
        /*
         * Content-Type
         * soap1.1  text/xml; charset=utf-8
         * soap1.2 application/soap+xml; charset=utf-8
         */
        [request addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
        // 请求字节数
        [request addValue:[NSString stringWithFormat:@"%zd", message.length] forHTTPHeaderField:@"Content-Length"];
        // 设置请求体 utf-8编码
        [request setHTTPBody:[message dataUsingEncoding:NSUTF8StringEncoding]];
        // session
        NSURLSession *session = [NSURLSession sharedSession];
        // task
        NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
            // 结果
            NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            
            XMLog(@"result = %@",result);
        }];
        [task resume];
    }

    用AFN进行解析

    //POST请求  这里稍微封装了下,便于自己使用,看主要的就可以....
    - (void)postWithSoapAction:(NSString *)action parameters:(NSString *)soapMessage success:(Success)success failure:(Failure)failure {
        
        afnManager.responseSerializer = [AFHTTPResponseSerializer serializer];
        afnManager.requestSerializer = [AFHTTPRequestSerializer serializer];
        /*
         * 一般情况AFN请求参数只能传字典
         * 但是可以在这个方法里将请求参数变成字符串形式
         */
        [afnManager.requestSerializer setQueryStringSerializationWithBlock:^NSString * _Nonnull(NSURLRequest * _Nonnull request, id  _Nonnull parameters, NSError * _Nullable __autoreleasing * _Nullable error) {
            
            return soapMessage;
        }];
        // 请求设置
        [afnManager.requestSerializer setValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
        [afnManager.requestSerializer setValue:[NSString stringWithFormat:@"%zd", soapMessage.length] forHTTPHeaderField:@"Content-Length"];
        [afnManager.requestSerializer setValue:[NSString stringWithFormat:@"http://tempuri.org/%@",action] forHTTPHeaderField:@"SOAPAction"];
        
        // post请求
        [afnManager POST:XMHTTPADDRESS parameters:soapMessage progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            [SVProgressHUD dismiss];
            if (responseObject) {
                
                NSString *response = [self getJsonStringWithData:responseObject];
                success(response);
            }else {
                XMLog(@"%@",@"请求失败");
            }
            
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            
            failure(error);
        }];
    }

    踩了不少坑,,但是还是搞定了。。。

  • 相关阅读:
    http 请求code状态码
    uni-app实现弹窗遮罩
    小程序分享报错 Cannot read property 'apply' of null;at page XXX onShareAppMessage function
    mac下出现xcrun: error导致git、svn无法使用的解决办法
    uniapp 小程序实现自定义底部导航栏(tarbar)
    Python2.X和Python3.X中Tkinter模块的文件对话框、下拉列表的不同
    Mac 设置git的template
    每天一点点之vue框架开发
    uni-app开发小程序-使用uni.switchTab跳转后页面不刷新的问题
    小程序实现微信朋友圈时间显示效果
  • 原文地址:https://www.cnblogs.com/zhangshan/p/5589610.html
Copyright © 2011-2022 走看看