我刚刚开始iOS开发,我正在尝试与我的api交换数据。当我执行 POST 请求时,一切正常,但是当我尝试执行 GET 请求时,出现以下错误:
错误域=NSURLError域代码=-1017"操作无法 完成。(NSURLErrorDomain error -1017。用户信息=0x145a2c00 {NSErrorFailingURLStringKey=http://myAPI.com/, _kCFStreamErrorCodeKey=-1, NSErrorFailingURLKey=http://myAPI.com, _kCFStreamErrorDomainKey=4,NSUnderlyingError=0x145b21d0"无法完成操作。(kCFErrorDomainCFNetwork error -1017.("}
有人可以解释出了什么问题以及我如何解决它吗?
我的要求:
-(void)hitApiWithURL:(NSString*)url HTTPMethod:(NSString*)HTTPMethod params:(NSDictionary*)params successBlock:(successTypeBlock)success failureBlock:(errorTypeBlock)failure{
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];
[sessionConfig setHTTPAdditionalHeaders:@{@"Content-type": @"application/json"}];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:url]];
[request setHTTPMethod:HTTPMethod];
// The body
NSError *error = nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:params options:0 error:&error];
[request setHTTPBody:jsonData];
NSURLSessionDataTask *dataTaks = [session dataTaskWithRequest:request];
[dataTaks resume];
NSLog(@"dataTask started");
}
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didCompleteWithError:(NSError *)error {
if (error) {
//Gives my error
}
else {
// do something:
}
}
如果您忘记提及HTTPMethod,也可能发生错误,我遇到了问题" NSURLErrorDomain Code=-1017",不知何故我忘记添加行"请求。HTTPMethod = "POST"。
添加该行后,我的代码运行良好。
你的 JSON 参数有问题:
kCFURLErrorCannotParseResponse = -1017
当您使用正文集 ( setHTTPBody
( 执行GET
请求时,会发生此错误
这不是这种情况的直接解决方案,但可能会帮助某人解决-1017
错误。
将Alamofire
从4.8.0
升级到5.2.2
后,我遇到了这个问题。问题出在HTTPHeader
。
var authorizationHeader: HTTPHeader {
guard let session = user?.session else {
return HTTPHeader(name: "", value: "")
}
return HTTPHeader(name: "Authorization", value: "Bearer (session)")
}
显然,发送带有空键值 i-e HTTPHeader(name: "", value: "")
HTTPHeader
会触发此错误。我调整了我的代码以返回nil
它解决了这个问题。
对于任何其他-1017
收到错误代码的人 - 我通过在 http 请求中手动设置 http 标头来修复它。我认为服务器在解析 HTTP 标头时遇到问题,因为我的标头没有这样的引号,而不是字符串"Authorization" : "qii2nl32j2l3jel"
:Authorization : "1i2j12j"
.祝你好运。
像这样:
NSMutableDictionary* newRequestHTTPHeader = [[NSMutableDictionary alloc] init];
[newRequestHTTPHeader setValue:authValue forKey:@""Authorization""];
[newRequestHTTPHeader setValue:contentLengthVal forKey:@""Content-Length""];
[newRequestHTTPHeader setValue:contentMD5Val forKey:@""Content-MD5""];
[newRequestHTTPHeader setValue:contentTypeVal forKey:@""Content-Type""];
[newRequestHTTPHeader setValue:dateVal forKey:@""Date""];
[newRequestHTTPHeader setValue:hostVal forKey:@""Host""];
[newRequestHTTPHeader setValue:publicValue forKey:@""public-read-write""];
//the proper request is built with the new http headers.
NSMutableURLRequest* request2 = [[NSMutableURLRequest alloc] initWithURL:request.URL];
[request2 setAllHTTPHeaderFields:newRequestHTTPHeader];
[request2 setHTTPMethod:request.HTTPMethod];
请轻松检查此链接
Alamofire.request(method, "(URLString)" , parameters: parameters, headers: headers).responseJSON { response in }
在发布方法中,您还添加了
parameters:parameters, encoding: .JSON
(如果您在 GET POST 中添加了编码行,则会出现错误"无法解析响应"(
第二,请检查标题。
["authentication_token" : "sdas3tgfghret6grfgher4y"]
然后解决了这个问题。
当我发送一个空标题时,例如 [":":"]。触发此错误 1017。
解决方案,如果您已声明:
let 标头 = [":"]
最好的一个选项设置为 nil:
let 标头 = 无
然后,您可以:
sessionManager.request("www.example.com",方法: .post,参数:参数,编码:编码,标头:标头(.responseJSON { response in....
还有一种情况是使用 VPN 登录您的应用程序。
当你使用 VPN 时,你的互联网流量会通过 VPN 的服务器路由。如果您失去互联网连接或无法访问 VPN 服务器(这是我的用例(,VPN 可能会发回您的应用程序无法处理的响应,从而导致 NSURLErrorCannotParseResponse (-1017( 错误。
在某些情况下,VPN 可能会返回应用未预料到的自定义错误消息或代码,因此无法正确解析。
我确保error.code == NSURLErrorCannotParseResponse
实际上是真的,即 1017。
剩下的唯一事情就是检查您最喜欢的可访问代码是否可以访问网络:
NetworkReachabilityManager(host: "https://www.google.com")?.isReachable
如果:
- 网络无法访问,并且
- 您使用 VPN 和
- 错误代码为 1017
这意味着没有互联网连接
我们还可以使用NEVPNManager来确保我们实际上正在使用我们预期的VPN。