2

我有一个带有一些 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 的型号是否真的很重要。另外,我尝试了同步请求,但它也没有奏效......

4

1 回答 1

3

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

req.HTTPMethod = @"PUT";

似乎 iOS 6 自动将请求方法转换为大写,而 iOS 5 没有(可以使用网络监视器检查)。

于 2013-03-18T16:27:17.237 回答