iOS WebService的一个简单的使用Demo

前言

很长时间没有写点东西,两个月左右了吧。一直在看其他的东西,今天说一下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。有问题可以留言说,尽量解决的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容