单个HTTP请求中的双请求标头

时间:2016-06-13 12:19:13

标签: ios http http-headers

有问题的请求看起来像这样

POST /api/v2/users/push HTTP/1.1 
Host: glowing.com 
Content-Type: application/json 
Accept: */* 
Connection: keep-alive 
Cookie: _ga=GA1.2.840810247.1459550932 
User-Agent: Glow/201605261852 CFNetwork/758.4.3 Darwin/15.5.0 
Accept-Language: en-us 
Accept-Encoding: gzip, deflate 
Content-Length: 402 

POST /api/v2/users/push HTTP/1.1 
Host: glowing.com 
Content-Type: application/json 
Accept: */* 
Connection: keep-alive 
Cookie: _ga=GA1.2.840810247.1459550932 
User-Agent: Glow/201605261852 CFNetwork/758.4.3 Darwin/15.5.0 
Accept-Language: en-us 
Accept-Encoding: gzip, deflate 
Content-Length: 402 

{"app_version":"3.0.2","locale":"en_GB","log_list":...}

标头在请求中出现两次,这导致我们的服务器在解析请求时引发错误。关于这个问题的其他一些注释

  • 我们的应用程序同时具有iOS和Android客户端,可将HTTP请求发送到同一服务器。我们只在iOS客户端遇到此问题。因此,它更可能是客户问题。

  • 我们的服务器每天收到数百万个请求,问题只发生了大约20-30次。

到目前为止,我还没有任何线索如何调试此问题。欢迎任何建议。

更新:

我不确定问题是否在我们的iOS代码中,但这是我们用于将记录发送到服务器的代码。这个网络请求偶尔会出现这个双头问题

NSMutableDictionary *params = [@{@"log_list": logList} mutableCopy];
params[@"app_version"] = [Utils appVersion];
params[@"device_id"] = [Utils UUID];
params[@"locale"] = [Utils localeString];
params[@"model"] = [Utils modelString];


NSData *requestData = [NSJSONSerialization dataWithJSONObject:params options:0 error:nil];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:self.apiURL]];
[request setHTTPMethod:@"POST"];
[request setTimeoutInterval:LOGGING_REQUEST_TIMEOUT];
[request setHTTPBody:requestData];
[request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:error];

2 个答案:

答案 0 :(得分:1)

我从未遇到过NSURLConnection的头文件问题,我在NSURLConnection周围编写了自己的包装器API。您还可以通过打印标题字段进行验证,如下所示。您还可以通过配置默认NSURLSession进行交叉检查,并尝试使用NSURLSession data api's。也许您还应该检查服务器端代码。如果您的代码确实存在问题,请发布您的发现。对我们的开发人员有帮助。

   NSURL *url = [NSURL URLWithString:@"http://your URL here"];
NSURLRequest *request = [NSURLRequest requestWithURL: url];
NSHTTPURLResponse *response;
[NSURLConnection sendSynchronousRequest: request returningResponse: &response error: nil];
if ([response respondsToSelector:@selector(allHeaderFields)]) {
NSDictionary *dictionary = [response allHeaderFields];
NSLog([dictionary description]);
}

答案 1 :(得分:1)

这是一个黑暗中的镜头,但这可能有助于你调试问题。

使服务器回复Connection:close而不是Connection:keep-alive。

我认为某些客户端可能会在服务器回复之前尝试建立超时连接,因此他们会再次尝试连接,认为连接仍然有效。

尝试返回Connection:关闭该特定端点并验证问题是否一直显示