【问题标题】:AFNetworking POST being sent as GETAFNetworking POST 作为 GET 发送
【发布时间】:2013-06-22 15:04:48
【问题描述】:

如果这是正常的,请原谅,但我正在尝试使用 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 以包含尾随的 '/' - 也许这对大多数人来说是显而易见的,但我希望对已接受的答案做出解释。

【问题讨论】:

  • 您在发帖前是否在客户端使用setParameterEncoding,并在服务器上使用$POST(或类似名称)?
  • 不,这是我所有的代码,除了 clientWithBaseURL: 来初始化

标签: ios post get afnetworking charles-proxy


【解决方案1】:

好吧,我所要做的就是更改 postPath 以包含尾随的 '/' - 也许这对大多数人来说是显而易见的,但我希望对已接受的答案做出解释。

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

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

【讨论】:

  • 需要明确的是,重定向中的POST 更改为GET 与“配置错误的服务器”无关,而是与客户端如何处理服务器发送的重定向有关。即使服务器发送了 307“重定向而不更改方法”响应,我也遇到了与 AFNetworking 类似的问题。
【解决方案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。

【讨论】:

  • 只是在这里插话。使用 307 的 AFNetworking 将保持正确的 HTTP 方法和正文。
【解决方案3】:

我遇到了一个类似的问题,每个 POST 请求都被解释为 GET 请求。事实证明,类似于服务器在您缺少尾部斜杠时出现问题,当您的 DNS 将 www.site.com 重定向到 site.com 时,请求类型可能会丢失,反之亦然。

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

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

【讨论】:

    【解决方案4】:

    我面临同样的问题,我使用 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 方法。 为了解决这个问题,我只是注释掉这些行。 希望这有帮助。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-03
        • 1970-01-01
        • 1970-01-01
        • 2015-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多