iOS开发中 xml 数据请求

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS开发中 xml 数据请求相关的知识,希望对你有一定的参考价值。

参考技术A NSString *soapStr = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"utf-8\"?>\

<soap:Envelope xmlns:xsi = \"htttp://www.网址.com"\

xmlns:soap = \"http://网址\">\

<soap:header>\

</soap:header>\

<soap:Body>\

// 这中间基本就是要写的参数,在Body 之间就是参数

</soap:Body>\

</soap:Envelope>"]; 

NSURL *url=[NSURL URLWithString:@"你自己wsdl文档中对应的endpoint address"];

NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];

// 访问方式[request setHTTPMethod:@"POST"];

// 设置请求头(请求头也可以不设置,前两个设不设置都一样,应该默认的,但是SOAPAction我怎么都设置不对,不设置也可以,干脆不设置了)

// [request addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];//  [request addValue:[NSString stringWithFormat:@"%zd", soapStr.length] forHTTPHeaderField:@"Content-Length"];

//    [request addValue:@"nameSpace/methodName" forHTTPHeaderField:@"SOAPAction"];

// body内容 [request setHTTPBody:[soapStr dataUsingEncoding:NSUTF8StringEncoding]];

NSURLSession *session = [NSURLSession sharedSession];

NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)

NSString *result = [[NSString alloc] initWithData:data  encoding:NSUTF8StringEncoding];

NSLog(@"进入成功回调Session-----结果:%@----请求地址:%@", result, response.URL);

if (error)

NSLog(@"Session----失败----%@", error.localizedDescription);



];

[task resume];

// 传入一个字典只有唯一(key - value)的数组,

// eg: NSArray *array = @[@@"addr":@"777",@@"999":@"666",@@"000":@"111"];

+ (NSString*)convertDicArrayToXML:(NSArray*)arrayandElement:(NSString*)element

    if (array.count<=0)

     return nil ;

   

    NSMutableString *mString = [NSMutableString string];

    [mStringappendFormat:@"<%@ xmlns=\"http://tempuri.org/\">",element];

    for (NSDictionary*dic in array)

        [mStringappendFormat:@"<%@>", dic.allKeys.firstObject];

        [mStringappendFormat:@"%@", dic.allValues.firstObject];

        [mStringappendFormat:@"</%@>\t\t", dic.allKeys.firstObject];

   

    [mStringappendFormat:@"</%@>", element];

    return mString;



+ ( void )xmlRequestPOSTWithSoapBody:(NSString*)bodyStringandElement:(NSString*)elementsuccess:( void (^)( id responseObject))successfailure:( void (^)(NSError*error))failure

//    DLog(@"....bodyString = %@", bodyString);

    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>%@</soap:Body>\

</soap:Envelope>",bodyString];

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    manager.responseSerializer = [AFXMLParserResponseSerializer serializer];

    // 设置请求超时时间

    manager.requestSerializer.timeoutInterval = 15;

    // 返回NSData

    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    // 设置请求头,也可以不设置

    [manager.requestSerializer setValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];

    [manager.requestSerializer setValue:[NSString stringWithFormat:@"%zd", soapStr.length] forHTTPHeaderField:@"Content-Length"];

    [manager.requestSerializer setValue:[NSString stringWithFormat:@"http://tempuri.org/%@",element] forHTTPHeaderField:@"SOAPAction"];

    // 设置HTTPBody

    [manager.requestSerializersetQueryStringSerializationWithBlock:^NSString*(NSURLRequest*request,NSDictionary*parameters,NSError* __autoreleasing *error)

        return soapStr;

    ];

    [managerPOST:webService_Urlparameters:soapStrprogress:^(NSProgress* _Nonnull uploadProgress)

    success:^(NSURLSessionDataTask* _Nonnull task, id   _Nullable responseObject)

        //DLog(@"responseObject = %@", responseObject);

        // 把返回的二进制数据转为字符串

        NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];

       // DLog(@"result = %@", result);

        // 利用正则表达式取出之间的字符串

        NSString*resultString = [NSStringstringWithFormat:@"(?<=%@Result\\>).*(?=</%@Result)",element,element];//@"(?<=return\\>).*(?=</return)"

        NSRegularExpression *regular = [[NSRegularExpression alloc] initWithPattern:resultString  options:NSRegularExpressionCaseInsensitive error: nil ];

        NSDictionary *dict = [NSDictionary dictionary];      for (NSTextCheckingResult*checkingResult in [regularmatchesInString:resultoptions:0range:NSMakeRange(0, result.length)])

            // 得到字典

            dict = [NSJSONSerialization JSONObjectWithData:[[result substringWithRange:checkingResult.range] dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableLeaves error: nil ];

       

        if (success)

            success(dict);

       

       // DLog(@"dic = %@", dict);

    failure:^(NSURLSessionDataTask* _Nullable task,NSError* _Nonnull error)

        DLog(@"error = %@", error);

        if (failure)

            failure(error);

       

    ];



调用一下:

+ ( void )mallListWithType:(NSString * _Nullable )type

                 success:( void (^ _Nullable )( id _Nullable responseObject))success

                 failure:( void (^ _Nullable )(NSString* _Nullable strError))failure

    NSString *element = @"ZHWS_GetActivityMallAdList";

    NSArray*bodyArray =@[

        @@"Type":type

    ];

    NSString*bodyString = [ self convertDicArrayToXML:bodyArrayandElement:element];

    [ self xmlRequestPOSTWithSoapBody:bodyStringandElement:elementsuccess:^( id responseObject)

        DLog(@"... 活动相关、商场广告、广告列表 = %@", responseObject);

        if (responseObject)

            success(responseObject);

       

    failure:^(NSError*error)

        if (error)

            //failure(error.mj_JSONString);

       

    ];



近期项目刚好用到这个,之前也没有用过,所以顺手就记录一下。如有错误,看到的小伙伴请指正。

参考链接:https://blog.csdn.net/djh996064549/article/details/79635551

iOS开发——XML/JSON数据解析


本文授权转载:神兽gcc()


除了XML和Json,文中还涉及到的一些知识:第三方类库的使用,获取本地文件内容,网站API使用,GCD多线程编程,不做详细介绍,在代码出现的地方会注明。


先安利一波:



大数据时代,我们需要从网络中获取海量的新鲜的各种信息,就不免要跟着两个家伙打交道,这是两种结构化的数据交换格式。一般来讲,我们会从网络获取XML或者Json格式的数据,这些数据有着特定的数据结构,必须对其进行解析,得到我们可以处理的数据。所谓“解析”,就是从事先规定好的格式串中提取数据。解析的前提是数据的提供方与获取方提前约定好格式,数据提供方按照格式提供数据,数据获取方按照格式获取数据。


iOS开发中,几乎只要是与网络相关的应用,都离不开对网络数据的解析与应用。现总结几种常用方式来解析网络数据:


  • Json格式:

  • NSJSONSerialization,官方提供的Json数据格式解析类,iOS5以后支持

  • JSONKit(第三方类库)

  • SBJson

  • TouchJson

  • XML格式:

  • NSXMLParse,官方自带

  • GDataXML,Google提供的开元XML解析库


按照目前的发展,Json正在逐步取代XML成为网络数据的通用格式,所以我们重点来看Json格式的数据解析先。


准备工作


在看如何使用Json和XML之前,我们还有些事情要做,一是准备我们要解析的数据,二是搭建一个界面来看实际效果,毕竟我们解析了数据就是要在应用中展示出来的。


Json数据准备


关于如何获取网络的数据在这里就不多赘述了,你只需要获得一个从网站为开发者提供的API接口中获得我们想要的url就好了。我这里调用了豆瓣电影的API,随便选了在豆瓣电影首页的电影——《前任2:备胎反击战》,来看看豆瓣对这部电影的描述,由于标签太多,我这里只打算从中获取电影名称,体裁和剧情简介三部分打印出来。


我们可以先提前在浏览器中打开看一下这个待会我们将要得到的东西:

是不是很乱。。。没错,网站返回的东西虽然看上去好像有点规律,但是还是难以辨别,这里不用担心,我们可以使用一个叫做的东西来优化一下它的显示,这里有一个在线的。我们把网站返回给我们的数据copy到这里,点击校验,如果没有什么问题的话,为了方便展示,我把它copy到了Sublime中,我们看一下结果你会发现它变成了下面这个样子,这样看起来就舒服多了,我们也可以非常清楚地看到每一对“Key——Velue”对,以及每个Velue的类型,弄清楚了,待会儿方便我们查询和显示。

iOS开发——XML/JSON数据解析

找到了目标,下一步我们先做个界面的模子出来,展示我们解析过的数据。大概就是下面这个样子,点击不同的按钮,可以以不同的方式解析获得的数据并在TextView中打印。

iOS开发——XML/JSON数据解析

界面搭好之后不要忘了关联到代码。

iOS开发——XML/JSON数据解析

XML数据准备


我们在项目中新建一个xml文件,编写其中的内容,待会儿解析内容并打印到TextView。

iOS开发——XML/JSON数据解析

XML内容为Person,有几个学生的信息,包括学号,姓名,性别和年龄,一会儿根据这些创建模型。

iOS开发——XML/JSON数据解析

NSJSONSerialization


接下来就正式开始。苹果官方给出的解析方式是性能最优越的,虽然用起来稍显复杂。


首先我们在上面已经有了我希望得到的信息的网站的API给我们的URL,在OC中,我要加载一个NSURL对象,来向网站提交一个Request。到这里需要特别注意了,iOS9的时代已经来临,我们先前在旧版本中使用的某些类或者方法都已经被苹果官方弃用了。刚刚我们向网站提交了一个Request,在以往,我们是通过NSURLConnection中的sendSynchronousRequest方法来接受网站返回的Response的,但是在iOS9中,它已经不再使用了。从官方文档中,我们追根溯源,找到了它的替代品——NSURLSession类。这个类是iOS7中新的网络接口,苹果力推之,并且现在用它完全替代了NSURLConnection。关于它的具体用法,还是蛮简单的,直接上代码(ViewController.m文件):


(c)2006-2024 SYSTEM All Rights Reserved IT常识