AFNetworking 2 空 POST 响应但没有错误
AFNetworking 2 empty POST response but no errors
这是一个非常棘手的问题:
我向服务器发出 POST 请求(登录)。
服务器将回答:
- ok 状态码:200 + JSON 数据
- 错误状态代码:401 + plain/text
代码:
func login (id: String, password: String){
self.responseSerializer = AFJSONResponseSerializer()
self.responseSerializer.acceptableContentTypes = nil
self.responseSerializer.acceptableStatusCodes = NSIndexSet(index: 400)
//self.responseSerializer.acceptableStatusCodes = nil
var param = ["id": lbid, "password": password]
POST(APIURL.URL_LOGIN, parameters: param,
{ (operation : NSURLSessionDataTask!, response : AnyObject!) -> Void in
//var finalResponse : Dictionary = Dictionary<String, String>()
var tmp = response as String
self.defaults.setObject(tmp, forKey: "USERSSID")
self.defaults.setBool(true, forKey: "USERLOGGEDIN")
println("Success login")
}) { (operation : NSURLSessionDataTask!, error : NSError!) -> Void in
println(error)
}
}
它执行失败博客,我得到这个错误:
Code=-1011 "Request failed: no error (200)" UserInfo=0x7f9fa1534760 {com.alamofire.serialization.response.error.response=<NSHTTPURLResponse: 0x7f9fa15791e0> { URL: https://************ } { status code: 200, headers {
Connection = "Keep-Alive";
"Content-Length" = 107;
"Content-Type" = "application/json";
Date = "Wed, 04 Mar 2015 21:47:51 GMT";
"Keep-Alive" = "timeout=7, max=150";
Server = Apache;
"Set-Cookie" = "SID=************; expires=Mon, 02-Mar-2020 21:47:51 GMT; path=/;domain=.*********";}},NSErrorFailingURLKey=https://***********,com.alamofire.serialization.response.error.data=< CORRECT POST BODY>, NSLocalizedDescription=Request failed: no error (200)}
如果我删除这段代码:
self.responseSerializer.acceptableStatusCodes = NSIndexSet(index: 400)
然后应用程序崩溃了。但是服务器响应状态代码为 200...
我不知道如何解决这个问题。
你可以帮帮我吗?
在这里我得到了正确的body。但是为什么在正常成功的博客里不行呢?
编辑:
self.responseSerializer.acceptableStatusCodes = NSIndexSet(index: 200)
=> 应用程序崩溃
self.responseSerializer.acceptableStatusCodes = nil
=> 应用程序崩溃
self.responseSerializer.acceptableStatusCodes = NSIndexSet(index: 401)
=> 应用程序没有崩溃,但执行失败块。错误消息中的状态代码为 200,错误数据包含正确的 POST 响应 body。
=> 我可以从错误数据中提取消息...但这是一个如此简单的任务。它必须正常工作。
无法使用 Alamofire,因为我想使用 ssl 证书!
最终编辑:
不要不知道为什么,但是错误自己消失了。
如果您还没有这样做,请查看 Postman(一个 Google Chrome 应用程序)。这是调试 AFNetworking 问题的最佳方法,方法是模拟相同的请求并确保数据正确通过。很多次,我一直在解决一个问题,然后使用 Postman 并发现这是服务器正在做的事情。
我发现了一些内容:
acceptableStatusCodes
The acceptable HTTP status codes for responses. When non-nil,
responses with status codes not contained by the set will result in an
error during validation.
在Objective C中:
self.responseSerializer.acceptableStatusCodes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 100)];
之前的post对修复它很有用。我正在搜索越来越多,但没有任何帮助。我尝试添加不同的代码并厌倦了很多次。终于看到上面的post,果然解决了问题。我花了 2 天时间找到解决方案。
最初得到错误 -1011 和 400 错误。我使用以下方法解决了:
manager.responseSerializer.acceptableStatusCodes = [NSIndexSet indexSetWithIndex:400];
再次遇到类似这样的不同错误:“200 没有错误”。我用下面的代码解决了:
manager.responseSerializer.acceptableStatusCodes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 100)];
有效!!酷!!
因此,我建议你们添加以下代码集:
manager.responseSerializer.acceptableStatusCodes = [NSIndexSet indexSetWithIndex:400];
manager.responseSerializer.acceptableStatusCodes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 100)];
感谢 Whosebug!!!!
这是一个非常棘手的问题:
我向服务器发出 POST 请求(登录)。
服务器将回答:
- ok 状态码:200 + JSON 数据
- 错误状态代码:401 + plain/text
代码:
func login (id: String, password: String){
self.responseSerializer = AFJSONResponseSerializer()
self.responseSerializer.acceptableContentTypes = nil
self.responseSerializer.acceptableStatusCodes = NSIndexSet(index: 400)
//self.responseSerializer.acceptableStatusCodes = nil
var param = ["id": lbid, "password": password]
POST(APIURL.URL_LOGIN, parameters: param,
{ (operation : NSURLSessionDataTask!, response : AnyObject!) -> Void in
//var finalResponse : Dictionary = Dictionary<String, String>()
var tmp = response as String
self.defaults.setObject(tmp, forKey: "USERSSID")
self.defaults.setBool(true, forKey: "USERLOGGEDIN")
println("Success login")
}) { (operation : NSURLSessionDataTask!, error : NSError!) -> Void in
println(error)
}
}
它执行失败博客,我得到这个错误:
Code=-1011 "Request failed: no error (200)" UserInfo=0x7f9fa1534760 {com.alamofire.serialization.response.error.response=<NSHTTPURLResponse: 0x7f9fa15791e0> { URL: https://************ } { status code: 200, headers {
Connection = "Keep-Alive";
"Content-Length" = 107;
"Content-Type" = "application/json";
Date = "Wed, 04 Mar 2015 21:47:51 GMT";
"Keep-Alive" = "timeout=7, max=150";
Server = Apache;
"Set-Cookie" = "SID=************; expires=Mon, 02-Mar-2020 21:47:51 GMT; path=/;domain=.*********";}},NSErrorFailingURLKey=https://***********,com.alamofire.serialization.response.error.data=< CORRECT POST BODY>, NSLocalizedDescription=Request failed: no error (200)}
如果我删除这段代码:
self.responseSerializer.acceptableStatusCodes = NSIndexSet(index: 400)
然后应用程序崩溃了。但是服务器响应状态代码为 200...
我不知道如何解决这个问题。 你可以帮帮我吗? 在这里我得到了正确的body。但是为什么在正常成功的博客里不行呢?
编辑:
self.responseSerializer.acceptableStatusCodes = NSIndexSet(index: 200)
=> 应用程序崩溃
self.responseSerializer.acceptableStatusCodes = nil
=> 应用程序崩溃
self.responseSerializer.acceptableStatusCodes = NSIndexSet(index: 401)
=> 应用程序没有崩溃,但执行失败块。错误消息中的状态代码为 200,错误数据包含正确的 POST 响应 body。 => 我可以从错误数据中提取消息...但这是一个如此简单的任务。它必须正常工作。
无法使用 Alamofire,因为我想使用 ssl 证书!
最终编辑: 不要不知道为什么,但是错误自己消失了。
如果您还没有这样做,请查看 Postman(一个 Google Chrome 应用程序)。这是调试 AFNetworking 问题的最佳方法,方法是模拟相同的请求并确保数据正确通过。很多次,我一直在解决一个问题,然后使用 Postman 并发现这是服务器正在做的事情。
我发现了一些内容:
acceptableStatusCodes
The acceptable HTTP status codes for responses. When non-nil, responses with status codes not contained by the set will result in an error during validation.
在Objective C中:
self.responseSerializer.acceptableStatusCodes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 100)];
之前的post对修复它很有用。我正在搜索越来越多,但没有任何帮助。我尝试添加不同的代码并厌倦了很多次。终于看到上面的post,果然解决了问题。我花了 2 天时间找到解决方案。 最初得到错误 -1011 和 400 错误。我使用以下方法解决了:
manager.responseSerializer.acceptableStatusCodes = [NSIndexSet indexSetWithIndex:400];
再次遇到类似这样的不同错误:“200 没有错误”。我用下面的代码解决了:
manager.responseSerializer.acceptableStatusCodes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 100)];
有效!!酷!!
因此,我建议你们添加以下代码集:
manager.responseSerializer.acceptableStatusCodes = [NSIndexSet indexSetWithIndex:400];
manager.responseSerializer.acceptableStatusCodes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 100)];
感谢 Whosebug!!!!