专为新手写的:关于IOS HTTP请求的问题和常报的几个错,AFNetworking版

来源:互联网 发布:vb中chr是什么意思 编辑:程序博客网 时间:2024/06/08 19:11

先声明一下,本人也是新手,这几天因为搞http请求的问题都没睡好觉了。

因为HTTp请求可能会遇到比较麻烦是因为它不是单机,还有一个服务器的问题,所以简单的事情变得很多问题出来了。

本人也是新手,所以有误导的地方请谅解,如果你有发现问题,回复一下我,谢谢大家一起提高!

IOS做HTTP请求时,一般有GET,POST方式,这两种方式如果你看专业的文章,有挺大差别的。这个我们就不谈了,我们只管实现上。

HTTP请求一般一般来说就两种,系统自己的API和第三方。

系统方面的都有文档可以参考,但基本上英文不好的,看到的都是NSHTTPRequestmanager的文章,这个苹果早就以改API了,如果是IOS9的系统就别看了,会了也不支持。

现在苹果替代的API是NSHTTPSessionManager,这方面我就帮不了你了,百度吧。

系统的API用起来就是麻烦点,要设置这种参数什么的。

另外就是用第三方框架啦,当然第三方框架也是基于系统API写了。

有很多啦,用的多的有ASIHTTPRequest,AFNetworking,MKNetworkkit。

网上很多的贴子,都是大牛们写的,他们都很厉害,都是点到为止。

但新手来说,不是人人都喜欢工具党。但对于新手来说,能够把功能完成知道流程,后面才是读API优化不是吗?

第三方的介绍网上很多,我就不多说,我知道的上面提到的三个框架,ASI己经很久没更新了,AF一直在更新而且苹果更新了HTTP的API它也更新了AFHTTPSessionManager,

MK网络上有下载的但是很早很早的版本了,新版去作者的网站下,但要收钱了。

我用的是AFNetworking:(如何下载:https://github.com/AFNetworking/AFNetworking/releases)

怎么用呢:下面用5句代码搞定如何访问的问题(AFNetworking 3,web服务端是用.net写的)

//第一句实例化,没什么好说的。


第1句、AFHTTPSessionManager *session = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:@"http://192.168.1.1/"]];
 //你这样写也行:AFHTTPSessionManager *session = [[AFHTTPSessionManager alloc] init]];     //但一定要INIT,如果不加网址,那么在后面的第五行

的代码里就要写全网址的部分(详看后面第五条代码)


第2句、session.requestSerializer = [AFHTTPRequestSerializer serializer];

//第二句是发送请求的序列化程序:这里有变动的地方是等号后面这一句也有多种选择:AFHTTPRequestSerializer,AFJSONRequestSerializer,AFPropertyListRequestSerializer(plita格式的)

具体要看后端的webService服务页的部分是哪一种方式了(C# 写的asp.net),一般都有SOAP 1.1,SOAP 1.2,HTTP GET和HTTP POST,如是是post方式就后第一个AFHTTPRequestSerializer方式。

 


第3句、   session.responseSerializer = [AFHTTPResponseSerializer serializer];

  //第三句接收端的序列化程序,也有几种,但这个序列化方式和webserivce返回要一样。

我试了几种类型是这样的,如果在ASP的方法中返回值写成void,如 public void test(string para){Context.response.writ("返回值")},这种方式,接收的序列化器用用AFHTTPResponseSerializer serializer],接收时的直接是:返回值或UTF8编码过的返回值。你直接把返回值,再反UTF8编码回来就是你原来的返回值了。(ASP默认UTF8返回)

如果方法里有写返回值:比如,我写的一个webservice方法是:public string test(string para){ return "返回值"},这种方式用[AFHTTPResponseSerializer serializer],也不会报错,但返回时,除了正常的返回值,还会带一个XML头,并有可能返回值是系统会编码成BASE64的,这样的话接收到的返回值,你要还要做的操作是去掉,XML头和BASE64解码;(ASP默认是BASE64编码的)

这样的话,你就可以使用AFXMLParserResponseSerializer serializer了;

//如果这里选错了,在NSlog里面报错差不多是这样的:Error Domain=com.alamofire.error.serialization.response Code=-1016 "Request failed: unacceptable content-type: text/xml"
(unacceptable content-type: text/xml")就是说后面这个接收的序列化器类型错误,你改变这个接收的就可以了;

//如是是报unacceptable content-type: text/xml"错误的,网上还有说是到AF的API里面加上这种类型都,一般是见意的,你网上可以看看文章。其实没有必要,楼主直接用http方式的没有问题。

 


第4句、    NSDictionary *params=[[NSDictionary alloc] init];
    params =@{@"Password":@"123456"};
4、    NSMutableDictionary *parameters = [[NSMutableDictionary alloc]init];
    [parameters setObject:@"123456" forKey:@"Password"];

//第四句有两条是一个意思,你选一条,就是说传参数啦,怎么设置参数,这个是考xcode基础的,不懂的回去看书,找字典类型的使用。

第四句要说的是这两种方式要注意了,如果是字典方式是先服务器请求传参的字段,后面跟数据,即:(Password:123456)

而可变字典是写法是:(setObject:123456 forKey:Password)

写错的话报错可能是:Error Domain=com.alamofire.error.serialization.response Code=-1011 "Request failed: internal server error (500)"
服务器无法连接,当然也有可能是你请示的网址输错,或网站真打不开。最好把网址复制出来在IE里面先打开确定能打开;




5、  [session POST:@"/webservice.asmx/login" parameters:params progress:nil success:^(NSURLSessionDataTask *task, id responseObject) {
        NSLog(@"执行成功成功");
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"失败%@",error);
    }];

  //第五句就是发送请求,通过POSt或Get等方式请求一个网址。1、这个网址可以也全,2、如果不写全就像我这样写的话,(只写除网站名以后的部分这种方式,那么前面提到的第1句代码就不能直接init了,要用initWithBaseURL:[NSURL URLWithString:@"http://192.168.1.1/"])

//  注意网址不要写错了(写错也是报service error(500)):复制网址到IE打开(另外.net的web服务网址不要写成了这样:192.168.1.1/webservice.asmx?op=login,是webservice.asmx/(方法名))

 



最后如果有问题:通过NSlog里面可以查看到,通过输出日志结果找问题;

后面再复完整的五条代码:



    AFHTTPSessionManager *session = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:@"http://192.168.1.1/"]];
    session.requestSerializer = [AFHTTPRequestSerializer serializer];
    session.responseSerializer = [AFHTTPResponseSerializer serializer];
    NSMutableDictionary *parameters = [[NSMutableDictionary alloc]init];
    [parameters setObject:@"123456" forKey:@"Password"];
    [session POST:@"/webservice.asmx/login" parameters:parameters progress:nil success:^(NSURLSessionDataTask *task, id responseObject) {
        NSLog(@"执行成功代码“);
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"失败%@",error);
    }];


//谢谢你看完,有错的地方请你留言给我,我会更正,方便大家,也希望大家不会在简单的问题是绕太多的弯路,把更多的时间用到有用的地方。


0 0
原创粉丝点击