zoukankan      html  css  js  c++  java
  • iOS调用WebService接口

    首先有几点说在前面

    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的请求就完成了。

  • 相关阅读:
    Class 'ViewCell' has no initializers
    xcode:关于Other Linker Flags
    NSString编码形式是UTF–16
    手写识别方案汇总
    将一个 view 进行截图
    程序员最核心的竞争力是什么?
    sqlite3
    创建NAT 64网络
    Snagit安装步骤
    cnblogs插件jiathis
  • 原文地址:https://www.cnblogs.com/jx66/p/6971561.html
Copyright © 2011-2022 走看看