NSURLConnection / CFURLConnection HTTP加载失败(kCFStreamErrorDomainSSL,-9813)

时间:2015-05-24 05:23:49

标签: objective-c iphone http nsurlrequest nsmutableurlrequest

我正在尝试在https上进行HTTP调用。这是我的代码片段。

NSMutableURLRequest *request = [[NSMutableURLRequest alloc]
                                initWithURL:[NSURL
                                             URLWithString:@"https://testservice.fiamm.com/token"]];

[request setHTTPMethod:@"POST"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-type"];

NSString *postString = @"username=TestIphone&Password=T3st1ph$n&Grant_type=password";

[request setValue:[NSString stringWithFormat:@"%d", [postString length]] forHTTPHeaderField:@"Content-length"];

[request setHTTPBody:[postString
                      dataUsingEncoding:NSUTF8StringEncoding]];

// Fetch the JSON response
NSData *urlData;
NSURLResponse *response;
NSError *error;

// Make synchronous request
urlData = [NSURLConnection sendSynchronousRequest:request
                                returningResponse:&response
                                            error:&error];

// Construct a String around the Data from the response
NSString *strFiamm = [[NSString alloc] initWithData:urlData encoding:NSUTF8StringEncoding];

当我尝试投掷或邮递员时,我得到了适当的回复,但是当我尝试使用我的代码时,我得到了这个错误。

NSURLConnection / CFURLConnection HTTP加载失败(kCFStreamErrorDomainSSL,-9813)

任何帮助或建议表示赞赏。!

3 个答案:

答案 0 :(得分:0)

您在此处提到的链接不是https证书,因此请使用简单的http而不是https

编辑#1

我尝试了这些值

http://testservice.fiamm.com/token
username=TestIphone
Password=T3st1ph$n
Grant_type=password

,输出

403 - Forbidden: Access is denied.
You do not have permission to view this directory or page using the credentials that you supplied.

表示您的用户名密码或键值不正确

答案 1 :(得分:0)

您没有正确设置Content-Length标头。内容的正确长度是以{1}为单位以UTF-8编码的字节。 postString返回UTF-16代码点的数量(既不是UTF-8中的字节数,也不是字符串中的字符数)。

您还应确保将帖子字符串正确地进行网址编码,以便与[postString length]一起使用。您可以在SO上找到关于此的一些帖子。但是,权威性指南是:URL-encoded form data。您应特别注意第一段中强调的关于application/x-www-form-urlencoded表单数据的警告:

"这种形式的数据集编码在很多方面都是异常的怪物,是多年实施事故和妥协的结果,导致了互操作性所需的一系列要求,但绝不代表良好的设计实践。特别要提醒读者注意扭曲的细节,包括字符编码和字节序列之间的重复(在某些情况下是嵌套的)转换。"

话虽如此,我强烈建议使用另一个Content-Type将数据传递给服务器,例如JSON。

答案 2 :(得分:0)

在您的课程中添加此方法

-(void) connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *) challenge {

    if ([challenge.protectionSpace.authenticationMethod isEqualToString: NSURLAuthenticationMethodServerTrust])
    {

        NSURL* baseURL = [NSURL URLWithString:@"yourURL”];

        if ([challenge.protectionSpace.host isEqualToString:baseURL.host])
        {
            SecTrustRef trust = challenge.protectionSpace.serverTrust;

            NSURLCredential *cred = [NSURLCredential credentialForTrust:trust];

            [challenge.sender useCredential:cred forAuthenticationChallenge:challenge];

        }
        else
        NSLog(@"Not trusting connection to host %@", challenge.protectionSpace.host);

    }
    [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}