有问题的请求看起来像这样
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];
答案 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:关闭该特定端点并验证问题是否一直显示