我有一台带有一些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的型号是否真的重要。此外,我尝试了同步请求,它也没有用...
答案 0 :(得分:3)
根据http://w3.org/Protocols/rfc2616/rfc2616-sec5.html,HTTP方法区分大小写,因此您应该使用
req.HTTPMethod = @"PUT";
似乎iOS 6会自动将请求方法转换为大写,而iOS 5则不会(可以通过网络监视器检查)。