iOS ASIHTTPRequest 多次重复请求的问题

        在最近的开发项目中,在向JAVA服务器发送请求时,被发现iOS会有发送两次请求的情况。提交信息到服务端时,偶而会发生重复写入的信息(不知道是不是跟服务端的配置与语言特性之类的关系....)。而iOS端,无论你如何调试,都只看到一个请求一个返回,翻了所有的ASIHTTPRequest文档,尝试过很多方法都没办法切底解决。


在偶而的机会找到原来问题如下: 原文


        因为API接口请求的格式多数是把参数放在url后面,也比较容易直接在浏览器上查看和给服务端的同事调事,所以我默认就选择GET方式。然而,默认的GET方式采用的是connection: keep-alive(长连接方式)HTTP持久连接(HTTP persistent connection,也称作HTTP keep-alive或HTTP connection reuse)是使用同一个TCP连接来发送和接收多个HTTP请求/应答,而不是为每一个新的请求/应答打开新的连接的方法。
换句话说,在请求服务没有及时响应的时候,客户端会在同一个tcp连接中再次请求服务器。导致的结果就是,客户端的现象:请求了一次。得到了一次response。 服务端收到两次请求,给出了一次返回。

ps:这里的“没有及时响应”,不是ASIHTTPRequest里面的Timeout的概念(30秒服务器没有响应,结束当前tcp连接,建立新的tcp连接)。这里是指服务端没有立刻发送确认ack的包。

解决办法其实很简单:默认设置POST方式:

[request setRequestMethod:@"POST"];

或者

request.shouldAttemptPersistentConnection = NO;(不支持长连接)


然后我又去了解了一下它们有什么区别:原文


HTTP请求:GET与POST方法的区别

 HTTP 定义了与服务器交互的不同方法,最基本的方法是 GET 和 POST。事实上 GET 适用于多数请求,而保留 POST 仅用于更新站点。根据 HTTP 规范,GET 用于信息获取,而且应该是 安全的和 幂等的。所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET 请求一般不应产生副作用。幂等的意味着对同一 URL 的多个请求应该返回同样的结果。完整的定义并不像看起来那样严格。从根本上讲,其目标是当用户打开一个链接时,她可以确信从自身的角度来看没有改变资源。比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。反之亦然。POST 请求就不那么轻松了。POST 表示可能改变服务器上的资源的请求。仍然以新闻站点为例,读者对文章的注解应该通过 POST 请求实现,因为在注解提交之后站点已经不同了(比方说文章下面出现一条注解);
 
在FORM提交的时候,如果不指定Method,则默认为GET请求,Form中提交的数据将会附加在url之后,以?分开与url分开。字母数字字符原样发送,但空格转换为“+“号,其它符号转换为%XX,其中XX为该符号以16进制表示的ASCII(或ISO Latin-1)值。GET请求请提交的数据放置在HTTP请求协议头中,而POST提交的数据则放在实体数据中; 


GET方式提交的数据最多只能有1024字节,而POST则没有此限制。


问题终于得到了解决,我也为我之前没有很好的封装 ASIHTTPRequest 买单,因为的确它封装得够好的:

- (IBAction)grabURLInBackground:(id)sender
{
   NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
   __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
   [request setCompletionBlock:^{
      // Use when fetching text data
      NSString *responseString = [request responseString];

      // Use when fetching binary data
      NSData *responseData = [request responseData];
   }];
   [request setFailedBlock:^{
      NSError *error = [request error];
   }];
   [request startAsynchronous];
}

在这一次后,我会进行二次封装,取数据 GET,提交用POST,也把错误Log之类的加进去。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值