美文网首页iOS
iOS WebService的一个简单的使用Demo

iOS WebService的一个简单的使用Demo

作者: 沉默学飞翔 | 来源:发表于2017-01-06 15:55 被阅读917次

    前言

    很长时间没有写点东西,两个月左右了吧。一直在看其他的东西,今天说一下WebService的请求怎么写。
    首先,这里你只会看到怎么用(使用的系统的NSURLSession),不会看到有关于WebService的理论知识点。知识点网上有很多,这里只说怎么使用(打死我都不会告诉你,其实是我也不会相关的知识点)。

    嗯哼
    没有相关dmeo看,字写再多都扯淡。

    正文

    代码片段

    首先我先把代码贴出来
    OC:

    - (void)webServiceConnectionNameSpace:(NSString *)nameSpace withUrlStr:(NSString *)urlStr withMethod:(NSString *)method{
    
        // 创建SOAP消息,内容格式就是网站上提示的请求报文的实体主体部分
        NSString *soapMsg = [NSString stringWithFormat:
                             @"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
                             
                             "<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/\">\n"
                             
                             "<soap:Body>\n"
                             
                             "<%@ xmlns=\"%@\">\n"
                             
                             "<byProvinceName>%@</byProvinceName>\n"
                             
                             "</%@>\n"
                             
                             "</soap:Body>\n"
                             
                             "</soap:Envelope>\n",method,nameSpace,@"北京",method];
        NSLog(@"%@", soapMsg);
        // 创建URL
        NSURL *url = [NSURL URLWithString: urlStr];
        //计算出soap所有的长度,配置头使用
        NSString *msgLength = [NSString stringWithFormat:@"%lu", (unsigned long)[soapMsg length]];
        //创建request请求,把请求需要的参数配置
        NSMutableURLRequest  *request=[[NSMutableURLRequest alloc]init];
        // 添加请求的详细信息,与请求报文前半部分的各字段对应
        //请求的参数配置,不用修改
        [request setTimeoutInterval: 10 ];
        [request setCachePolicy:NSURLRequestReloadIgnoringCacheData];
        [request setURL: url ] ;
        [request setHTTPMethod:@"POST"];
        [request setValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
        //soapAction的配置
        [request setValue:[NSString stringWithFormat:@"%@%@",nameSpace,method] forHTTPHeaderField:@"SOAPAction"];
        
        [request setValue:msgLength forHTTPHeaderField:@"Content-Length"];
        // 将SOAP消息加到请求中
        [request setHTTPBody: [soapMsg dataUsingEncoding:NSUTF8StringEncoding]];
        
        // 创建连接
        NSURLSession *session = [NSURLSession sharedSession];
        
        NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
            
            if (error) {
                NSLog(@"失败%@", error.localizedDescription);
            }else{
                
                NSString *result = [[NSString alloc] initWithData:data  encoding:NSUTF8StringEncoding];
                
                NSLog(@"结果:%@\n请求地址:%@", result, response.URL);
                
                //系统自带的
                NSXMLParser *par = [[NSXMLParser alloc] initWithData:[result dataUsingEncoding:NSUTF8StringEncoding]];
                [par setDelegate:self];//设置NSXMLParser对象的解析方法代理
                [par parse];//调用代理解析NSXMLParser对象,看解析是否成功
            }
        }];
        
        [task resume];
    }
    
    //获取节点间内容
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
        NSLog(@"%@", string);
    }
    

    Swift:

    /*
         nameSpace:命名空间
         urlStr:请求接口
         method:方法体
         */
        func webServiceConnect( nameSpace:String, urlStr:String, method:String){
            
            //soap的配置
            let soapMsg:String = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"+"<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/\">\n"+"<soap:Body>\n"+"<"+method+" xmlns=\""+nameSpace+"\">\n"+"<byProvinceName>"+"北京"+"</byProvinceName>\n"+"</"+method+">\n"+"</soap:Body>\n"+"</soap:Envelope>\n"
            
            let soapMsg2:NSString = soapMsg as NSString
            //接口的转换为url
            let url:URL = URL.init(string:urlStr)!
            //计算出soap所有的长度,配置头使用
            let msgLength:NSString = NSString.init(format: "%i", soapMsg2.length)
            //创建request请求,把请求需要的参数配置
            var request:URLRequest = NSMutableURLRequest.init() as URLRequest
            //请求的参数配置,不用修改
            request.timeoutInterval = 10
            request.cachePolicy = .reloadIgnoringLocalCacheData
            request.url = url
            request.httpMethod = "POST"
            //请求头的配置
            request.addValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type")
            request.addValue(msgLength as String, forHTTPHeaderField: "Content-Length")
            request.httpBody = soapMsg.data(using: String.Encoding.utf8)
            //soapAction的配置
            let soapActionStr:String = nameSpace + method
            request.addValue(soapActionStr, forHTTPHeaderField: "SOAPAction")
            
            //开始网络session请求的单例创建
            let session:URLSession = URLSession.shared
            //开始请求
            let task:URLSessionDataTask = session.dataTask(with: request as URLRequest , completionHandler: {( data, respond, error) -> Void in
                
                if (error != nil){
                    
                    print("error is coming")
                }else{
                    //结果输出
                    let result:NSString = NSString.init(data: data!, encoding: String.Encoding.utf8.rawValue)!
                    print("result=\(result),\n adress=\(request.url)")
                }
            })
            
            //提交请求
            task.resume()
        }
    

    讲解

    (个人的理解)

    WebService的请求比普通的接口请求复杂的地方就是soap和soapAction的配置。

    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:Body>
    <getSupportCity xmlns="http://WebXml.com.cn/">
    <byProvinceName>北京</byProvinceName>
    </getSupportCity>
    </soap:Body>
    </soap:Envelope>
    

    一句一句解读一下

    <?xml version="1.0" encoding="utf-8"?>
    

    这个没啥说的吧,就xml的版本和编码。

    <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的固定部分,直接用就行了。我这个是1.0版本的,有2.0版本的。至于用哪个看你们的服务器端了。

    <soap:Body>
    <getSupportCity xmlns="http://WebXml.com.cn/">
    <byProvinceName>北京</byProvinceName>
    </getSupportCity>
    </soap:Body>
    

    body包裹着这次请求所需要的参数,和普通的接口参数不同的是WebService的参数都是放在xml里面。

    <getSupportCity xmlns="http://WebXml.com.cn/">
    

    这句很关键的,首先,知道这次请求的方法体是什么,然后请求的命名空间是什么。这两个参数都是需要后台给你的,不是随意写的。认真想想也是哈,你给人家参数,人家后台要知道这个参数对应的是哪一个方法里面的哪一个参数吧。就好比说你去一所学校找个叫张三的人,学校叫张三的可能很多,你要知道是哪个班的张三才行吧,一个道理都是。

    <byProvinceName>北京</byProvinceName>
    

    这个是你上传的参数字段,参数的名字是后台给你的。一定要对应,有的后台可能比较懒,一个参数名对应几个参数,这都需要注意。

    soapAction

    这个我个人理解就是你的命名空间和方法体的字符串拼写。

    [request setValue:[NSString stringWithFormat:@"%@%@",nameSpace,method] forHTTPHeaderField:@"SOAPAction"];
    

    这个一定不能缺少,不然请求会成功,但是会显示错误:


    错误界面

    其他的就没啥说的了,NSURLSession请求就行了。
    然后可以通过NSXMLParser去解析xml,代理去拿到返回的请求数据内容(直接得到的data转换为字符串会发现得到的是含有soap的内容)。
    最后请求成功:


    成功界面

    结语

    这次WebService只是我需要用一下它然后去做的,方方面面都没有考虑只是简单的使用了一下。所以和题目一样,这是一个简单的使用dmeo。有问题可以留言说,尽量解决的。

    相关文章

      网友评论

      本文标题:iOS WebService的一个简单的使用Demo

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