美文网首页iOS Developer
基于 SOAP1.2(简单对象访问协议)进行网络请求

基于 SOAP1.2(简单对象访问协议)进行网络请求

作者: EagleOne | 来源:发表于2016-12-03 16:41 被阅读1076次

    什么是 SOAP(Simple Object Access Protocol)

    简单对象访问协议是交换数据的一种协议规范,是一种轻量的、简单的、基于XML(标准通用标记语言下的一个子集)的协议,它被设计成在WEB上交换结构化的和固化的信息。

     AFHTTPSessionManager *manager =  [[AFHTTPSessionManager alloc]initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
     
        //因为返回的不是标准的 XML 或者 JSON 格式,所以用 AFHTTPRequestSerializer
        AFHTTPRequestSerializer *serializer = [AFHTTPRequestSerializer serializer];
        manager.requestSerializer = serializer;
        
        //缓存策略
        serializer.cachePolicy = NSURLRequestUseProtocolCachePolicy;
        serializer.timeoutInterval = 30.0f;
        
        //设置请求头
        [serializer setValue:@"application/soap+xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
        [serializer setValue:@"application/soap+xml" forHTTPHeaderField:@"Accept"];
       
       //SOAP协议采用 的类似这样的请求体,这个即是下面的 SOAP 消息
       // <?xml version="1.0" encoding="utf-8"?>
    //  <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
    //    <soap12:Body>
    //    <E_GetUserInfo xmlns="http://tempuri.org/">
    //    <CardNo>H13932169</CardNo>
    //    </E_GetUserInfo>
    //    </soap12:Body>
    //    </soap12:Envelope>
    
        NSString* msgLength = [NSString stringWithFormat:@"%lu",soapRequestConfigureModel.SOAPMsg.length];
        
        //请求的内容长度
        [serializer setValue:msgLength forHTTPHeaderField:@"Content-Length"];
        //指定请求的服务器的域名和端口号
        [serializer setValue:@"221.224.118.58" forHTTPHeaderField:@"Host"];
        //自定义请求体 HTTPBody 这步是必须的
        [manager.requestSerializer setQueryStringSerializationWithBlock:^NSString * _Nonnull(NSURLRequest * _Nonnull request, id  _Nonnull parameters, NSError * _Nullable __autoreleasing * _Nullable error) {
            return soapRequestConfigureModel.soapMsg;
        }];
    
        manager.responseSerializer = [AFHTTPResponseSerializer serializer];
        //参数传 SOAPMsg
         [manager POST:BaseURL parameters:SOAPMsg progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            
        }];
    

    构建模块

    • 一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素:
    • 必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息
    • 可选的 Header 元素,包含头部信息
    • 必需的 Body 元素,包含所有的调用和响应信息
    • 可选的 Fault 元素,提供有关在处理此消息所发生错误的信息

    语法规则

    • 这里是一些重要的语法规则:
    • SOAP 消息必须用 XML 来编码
    • SOAP 消息必须使用 SOAP Envelope 命名空间
    • SOAP 消息必须使用 SOAP Encoding 命名空间
    • SOAP 消息不能包含 DTD 引用
    • SOAP 消息不能包含 XML 处理指令

    消息基本结构

    <?xml
     version="1.0"?>
    <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
     
    <soap:Header>
    </soap:Header>
    
    <soap:Body>
    <soap:Fault>
    </soap:Fault>
    </soap:Body>
    
    </soap:Envelope>
    
     <?xml version="1.0" encoding="utf-8"?>
       <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
        <soap12:Body>
        //命令以及包含的参数
        <E_GetUserInfo xmlns="http://tempuri.org/">
        <CardNo>H13932169</CardNo>
        </E_GetUserInfo>
        
        </soap12:Body>
        </soap12:Envelope>
    

    相关文章

      网友评论

        本文标题:基于 SOAP1.2(简单对象访问协议)进行网络请求

        本文链接:https://www.haomeiwen.com/subject/klecmttx.html