奇怪的AFNetworking失败的URL请求

时间:2013-07-30 23:49:18

标签: ios afnetworking

我正在尝试将用户POST到rails支持的服务器,但我收到一个奇怪的错误。当我按提交时,我在日志中得到404错误,并且读出该页面不存在。像这样:

Error: Error Domain=AFNetworkingErrorDomain Code=-1011 "Expected status code in (200-299), got 404" UserInfo=0xc03c140 {NSLocalizedRecoverySuggestion=<!DOCTYPE html>
<html>
<head>
  <title>The page you were looking for doesn't exist (404)</title>
  <style type="text/css">
    body { background-color: #fff; co...

下面,在日志中打印失败的URL

AFNetworkingOperationFailingURLRequestErrorKey=<NSMutableURLRequest: 0xc033300> { URL: http://example.herokuapp.com/users }, 

因此,日志记录此页面不存在,但如果我复制并粘贴网址 - 页面确实存在,并且我已经能够从webview发布到该页面。 出于某种原因,afnetworking或nsmutbleURLrequest声称该页面不存在,当它发生时...... 我的意思是我不想说电脑错了,但是这里发生了什么? 我已经清理了xcode并退出了,没有像这样解决这个问题。 有人有过这种情况吗?

这是我用来发出请求的代码:

+ (void)createUserWithUsername:(NSString *)signature
                         email:(NSString *)email
                      password:(NSString *)password
                         block:(void (^)(User *user))block
{
    NSDictionary *parameters = @{@"signature": signature,
                                 @"email": email,
                                 @"password": password
                                 };

    [[APIClient sharedClient] postPath:@"/users" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
        User *user = [[User alloc] initWithDictionary:responseObject];

        if (block) {
            block(user);
        }
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
        if (block) {
            block(nil);
        }
    }];
}

这就是json从我在网络方面取得的成功帖子看起来的样子

{"created_at":"2013-07-18T04:05:36Z","email":"grant@gmail.com","id":1,"signature":grant,"updated_at":"2013-07-18T04:05:36Z"}

因此,在使用Charles将成功与失败的帖子请求进行比较后,我发现失败的帖子会出现406错误。此错误可能是正确的,因为成功和失败的帖子都具有相同的帖子路径。所以我认为它不像之前所说的404。 但406?在失败请求的日志中,没有引用其内容类型为json的问题。 这是控制台日志

headers {
    "Cache-Control" = "no-cache";
    "Content-Type" = "application/json; charset=utf-8";
    Date = "Wed, 31 Jul 2013 17:24:53 GMT";
    "Proxy-Connection" = "Keep-alive";
    Server = "thin 1.5.1 codename Straight Razor";
    "Set-Cookie" = "_gold_session=BAh7Basdfasdk; path=/; HttpOnly";
    "Transfer-Encoding" = Identity;
    "X-Rack-Cache" = "invalidate, pass";
    "X-Request-Id" = c9c17573dde8b4767ba519aed6e04959;
    "X-Runtime" = "0.008262";
    "X-Ua-Compatible" = "IE=Edge,chrome=1";
} }}
2013-07-31 10:24:57.828 Gold[57543:a0b] User: (null)

以下是来自Charles的服务器日志的比较,显示失败的帖子请求和成功的请求。

这是来自iphone的失败帖子的请求

    POST /users HTTP/1.1
Host    mysterious-5550.herokuapp.com
Content-Type    application/json; charset=utf-8
Accept-Encoding gzip, deflate
Content-Length  40
Accept-Language en;q=1, fr;q=0.9, de;q=0.8, zh-Hans;q=0.7, zh-Hant;q=0.6, ja;q=0.5
Accept  application/json
Connection  keep-alive
User-Agent  Gold/1.0 (iPhone Simulator; iOS 7.0; Scale/2.00)

这是失败的回应:

HTTP/1.1 406 Not Acceptable
Cache-Control   no-cache
Content-Type    application/json; charset=utf-8
Date    Wed, 31 Jul 2013 18:26:12 GMT
Server  thin 1.5.1 codename Straight Razor
Set-Cookie  _gold_session=BAh7BkkiD3Nlc3Npb25faWQGOgZFVEkiJTU2OGY2MWZhMzdmNzY2OGRjZGU0ZmQ1Y2Q5YmZiNzAxBjsAVA%3D%3D--3ab7521533c9e8f0f5b4a4d5da4d9f294bdeaba5; path=/; HttpOnly
X-Rack-Cache    invalidate, pass
X-Request-Id    900d86dd0719d0a00eacf803e90fa780
X-Runtime   0.007971
X-Ua-Compatible IE=Edge,chrome=1
transfer-encoding   chunked
Connection  keep-alive

这是网上成功发帖的要求

POST /users HTTP/1.1
Host    mysterious-5550.herokuapp.com
Content-Length  217
Cache-Control   max-age=0
Accept  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Origin  http://mysterious-5550.herokuapp.com
User-Agent  Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1580.0 Safari/537.36
Content-Type    application/x-www-form-urlencoded
Referer http://mysterious-5550.herokuapp.com/users/sign_up
Accept-Encoding gzip,deflate,sdch
Accept-Language en-US,en;q=0.8
Cookie  _gold_session=BAh7B0kiD3Nlc3Npb25faWQGOgZFVEkiJTQ5MGY5MzMzMmNlMzkxZDI4NTllNDU0ZGQ0ZTE5MDg2BjsAVEkiEF9jc3JmX3Rva2VuBjsARkkiMStZRTNwbGRKQ1VJWXY4aXZtbUMybGt3ejFLcnBZSU5zY053WEcwa2kydDg9BjsARg%3D%3D--2dd8e808965ccc2da457abc94c58c39d080f62ab

这是来自网络的成功帖子的回复

HTTP/1.1 302 Moved Temporarily
Cache-Control   no-cache
Content-Type    text/html; charset=utf-8
Date    Wed, 31 Jul 2013 18:30:11 GMT
Location    http://mysterious-5550.herokuapp.com/
Server  thin 1.5.1 codename Straight Razor
Set-Cookie  _gold_session=BAh7CUkiD3NlFlvdSBoY88c959; path=/; HttpOnly
X-Rack-Cache    invalidate, pass
X-Request-Id    c94b3d921dfe451c562c171524b78b3f
X-Runtime   0.750712
X-Ua-Compatible IE=Edge,chrome=1
transfer-encoding   chunked
Connection  keep-alive

虽然内容类型不同(text / html v json),但我认为这不是问题所在。两种类型都应该被接受 - 通常xcode会说出意想不到的内容类型。 你能看到其他任何可能导致406错误的不兼容的东西吗?

2 个答案:

答案 0 :(得分:0)

此代码看起来很好。

首先,进入postPath:parameters:success:failure:方法并在最后一行之前设置断点。在控制台中键入po request,并确保该URL符合您的预期。

如果网址不符合您的预期,请检查您的initWithBaseURL来电,并确保在“用户”之前需要该主要斜杠。

如果URL符合您的预期,则需要与服务器管理员一起调试,因为服务器可能需要其他一些信息,如身份验证或Accept标头。请注意,404不是在这种情况下返回的正确状态代码,因此您可能希望打开有关何时使用哪些状态代码的讨论。

https://github.com/AFNetworking/AFHTTPRequestOperationLogger对此有很大帮助 - 它可以记录您的请求以及它们返回控制台的内容。

答案 1 :(得分:-2)

服务器应用程序可能需要更多信息,如cookie和返回404。