AFNetworking POST作为GET发送

时间:2013-06-22 15:04:49

标签: ios post get afnetworking charles-proxy

如果这是正常的,请原谅我,但我正在尝试使用AFNetworking从iOS发送帖子请求。使用Charles监视请求,我发现发送了一个GET:

GET /api/updateTeamAlert/ HTTP/1.1
Host: www.******r.co
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en;q=1, fr;q=0.9, de;q=0.8, ja;q=0.7, nl;q=0.6, it;q=0.5
Connection: keep-alive
User-Agent: ****** Alerts/1.0 (iPhone Simulator; iOS 6.1; Scale/2.00)

这是正常的吗?我试图找出为什么我的POST参数在服务器上是空的 - 这可能是原因吗?

我正在创建这样的请求:

NSDictionary *params = @{@"device_id":@"test-device", @"innings":@6, @"team":@"WashingtonNationals"};

[_client postPath:@"updateTeamAlert"
       parameters:params
          success:^(AFHTTPRequestOperation *operation, id responseObject)
{
    NSString *responseStr = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
    NSLog(@"Request Successful, response '%@'", responseStr);
}
          failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
    NSLog(@"[HTTPClient Error]: %@", error.localizedDescription);
}];

更新

好吧,我必须做的就是改变postPath以包含尾随的'/' - 也许这对大多数人来说是显而易见的,但我希望对接受的答案有一个解释。

5 个答案:

答案 0 :(得分:2)

  

好吧,我必须做的就是改变postPath以包含尾随的'/' - 也许这对大多数人来说是显而易见的,但我希望对接受的答案有一个解释。

PHP应用程序通常配置错误的服务器在执行重定向时会丢失信息(如HTTP方法)。在您的情况下,将已解析的/添加到特定Web服务的规范路径,但在重定向到该端点时,POST已更改为GET

另一种可能解决此问题的方法是使用AFURLConnectionOperation -setRedirectResponseBlock,并确保重定向请求具有正确的动词。

答案 1 :(得分:2)

@ mattt上面的回答是不正确的。

HTTP / 1.0 302正常工作,因为您逻辑上期望“POST / FOO”302到/ BAR意味着您将获得“POST / BAR”。但是,很少或没有客户端以这种方式实现它,并且通常将方法更改为GET。这有点可以理解,因为新的重定向资源对于用户来说是未知的,并且不应该不情愿地POST到未知资源。

HTTP / 1.1清除它 - 302应该让用户知道重定向。 307使重定向工作正如您所期望的那样,维护方法。

AFNetworking的设置与所有其他淘气客户一样--302改变了GET的方法,让客户有机会提醒用户。我只是自己在AFNetworking遇到了这个问题:我设置了一些断点,逐步完成,然后看着方法在我眼前发生变化。

我还没有测试307的工作方式与AFNetworking一样,但无论如何,302的表现方式是HTTP / 1.1定义它们起作用。

tl; dr - 在HTTP / 1.1中使用307来重定向和维护方法,而不是302.

答案 2 :(得分:0)

我遇到了类似的问题,其中每个POST请求都被解释为GET请求。事实证明,当您错过尾随斜杠时,类似于服务器搞乱,当您的DNS重定向www.site.comsite.com时,请求类型可能会丢失,反之亦然。

就我而言,我的DNS会强制site.com重定向到www.site.com,但我已将基本网址设置为指向site.com。因此,当我在site.com/api向我的API发送请求时,请求被重定向到www.site.com/api并且请求类型丢失,并且服务器默认为GET请求。所以我将www添加到我的基本网址,将我的请求直接发送到www.site.com/api(避免DNS重定向),我的POST请求再次开始工作。

TL; DR:通过添加www(或删除它,取决于您的DNS),我删除了重定向并解决了问题。

答案 3 :(得分:0)

我遇到同样的问题,我使用Laravel作为服务器。

如果我的请求是“http://localhost/api/abc/”,那么从客户端发送的POST方法将成为服务器中的GET方法。 但是如果我的请求是“http://localhost/api/abc”(没有“/”),那么服务器将接收POST方法。

我创建根本原因是因为.htaccess文件中的重定向规则: 在我的.htaccess中有这些行:

# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]

如果请求最后有“/”,这些行会将POST方法更改为GET方法。 要解决这个问题,我只是注释掉这些内容。 希望这有帮助。

答案 4 :(得分:0)

另一种情况是,您将自动设置从HTTP到HTTPS的重定向时,如果此重定向设置正在工作,则POST请求将被重定向为GET请求。只需将API端点更新为HTTPS即可解决这种情况。