Ошибка HTTP-загрузки NSURLConnection/CFURLConnection (kCFStreamErrorDomainSSL, -9813)

Я пытаюсь выполнить HTTP-вызов на https. Вот мой фрагмент кода.

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];

Когда я пытаюсь ввести hurl или postman, я получаю правильный ответ, но когда я пытаюсь ввести свой код, я получаю эту ошибку.

Ошибка HTTP-загрузки NSURLConnection/CFURLConnection (kCFStreamErrorDomainSSL, -9813)

Любая помощь или предложения приветствуются.!


person Ruchir Shah    schedule 24.05.2015    source источник
comment
возможный дубликат сбой HTTP-загрузки NSURLSession/NSURLConnection   -  person Tariq    schedule 15.06.2015


Ответы (3)


Ссылка, которую вы упомянули здесь, не является сертификатом 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.

это означает, что ваше имя пользователя, пароль или значения ключей неверны

person Varun Naharia    schedule 24.05.2015
comment
когда я пытаюсь использовать только http, я получаю 403 - Запрещено: доступ запрещен. - person Ruchir Shah; 25.05.2015

Вы неправильно настроили заголовок Content-Length. Правильная длина содержимого — postString в кодировке UTF-8 в байтах. [postString length] возвращает количество кодовых точек UTF-16 (которое не всегда является количеством байтов в UTF-8 и не всегда является количеством символов в строке).

Вы также должны убедиться, что строка сообщения правильно закодирована в URL-адресе для использования с application/x-www-form-urlencoded. Вы найдете ряд сообщений об этом на SO. Однако полное руководство таково: данные формы в кодировке URL. Особо следует обратить внимание на предупреждение, подчеркнутое в первом абзаце, относительно application/x-www-form-urlencoded данных формы:

"Это кодирование набора данных формы во многих отношениях является аберрантным чудовищем, результатом многих лет реализации аварий и компромиссов, что привело к набору требований, необходимых для взаимодействия, но никоим образом не представляет передовой опыт проектирования. В частности, читатели рекомендуется обратить пристальное внимание на искаженные детали, связанные с повторяющимися (и в некоторых случаях вложенными) преобразованиями между кодировками символов и последовательностями байтов."

Сказав это, я бы настоятельно рекомендовал использовать другой Content-Type для передачи данных на сервер, например JSON.

person CouchDeveloper    schedule 27.05.2015

добавьте этот метод в свой класс

-(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];
}
person Mohamad Chami    schedule 03.10.2015