带有sendAsynchronousRequest的iPad 1“400 BadRequest”,全部在iPad 3上运行

时间:2013-03-18 16:06:08

标签: ios objective-c ipad nsurlconnection

我有一台带有一些api的服务器,我正在使用这个api和iPad作为客户端。代码如下:

    NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://***/api/user"]];
    req.HTTPMethod = @"put";
    req.HTTPBody = data; // it is string data from json dictionary

    [NSURLConnection sendAsynchronousRequest:req queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

        NSString *userData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
//...
    }];

一切正在iPad 3上运行,但是当我试图在iPad 1上测试该代码时,出现了错误。更具体一点:我的服务器只返回JSON,即使有一些错误,所以我可以看到错误是在客户端还是在服务器端。因此,通常,userData应包含一些带字典的字符串:

{ "auth": 1, "email":"some@mail.com", "error": 0} 

有时服务器可以返回(如果我尝试向其发送不正确的身份验证数据):

{ "auth": 0, "email":"", "error": 400, "errorMessage":"Bad Request"} 

但我在iPad 1上获得的是html字符串:

<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx/1.2.1</center>
</body>
</html>

我有点困惑,因为有完全相同的选项,相同的互联网连接,但iPad 1和iPad 3的行为是不同的。重要提示:iPad 1有iOS 5.1.1,iPad 3有6.1。应该有一个非常简单的解决方案,但我无法弄清楚。我不确定iPad的型号是否真的重要。此外,我尝试了同步请求,它也没有用...

1 个答案:

答案 0 :(得分:3)

根据http://w3.org/Protocols/rfc2616/rfc2616-sec5.html,HTTP方法区分大小写,因此您应该使用

req.HTTPMethod = @"PUT";

似乎iOS 6会自动将请求方法转换为大写,而iOS 5则不会(可以通过网络监视器检查)。