错误域=NSURLError域代码=-1017"操作无法



我刚刚开始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错误。

Alamofire4.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

如果:

  1. 网络无法访问,并且
  2. 您使用 VPN
  3. 错误代码为 1017

这意味着没有互联网连接

我们还可以使用NEVPNManager来确保我们实际上正在使用我们预期的VPN。

最新更新