2013-06-22 40 views
3

请原谅,如果这是正常的,但我试图发送iOS使用AFNetworking的发布请求。使用查尔斯监控的要求,我看到一个GET发送:AFNetworking发送为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); 
}]; 

UPDATE

嗯,我必须做的就是这个工作是改变postPath包括尾随“/” - 也许这对大多数人来说都是显而易见的,但我会喜欢对接受答案的解释。

+0

你在客户端使用'setParameterEncoding'发布和服务器上使用'$ POST'(或类似)之前? – Wain

+0

不,这是我所有的与clientWithBaseURL的异常代码:初始化 –

回答

2

那么,我所需要做的就是改变postPath以包含尾随的'/' - 也许这对大多数人来说是显而易见的,但我会喜欢对接受答案的解释。

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

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

+1

需要明确的是,'POST'被改变为'GET'在重定向无关用“错误配置的服务器”和一切与如何客户端处理服务器发送的重定向。即使通过服务器发送307“重定向但不更改方法”响应,我也遇到了与AFNetworking类似的问题。 – user686782

2

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

HTTP/1.0 302的工作原理是从逻辑上预计“POST/FOO”302'd到/ 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。

+0

只是在这里打鸣。 AFNetworking使用307将保持正确的HTTP方法和正文。 –

0

我遇到了类似的问题,其中每个POST请求都被解释为GET请求。事实证明,类似于当你错过了斜线时服务器搞乱了,当你的DNS重定向www.site.comsite.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)我消除了重定向和固定的问题。