2017-01-04 2 views
3

Я пытаюсь вызвать службу, используя Alamofire, используя метод .get. В запросе нет ничего особенного, кроме параметров, только заголовка авторизации.Ошибка домена = NSPOSIXErrorDomain Code = 100 «Ошибка протокола»

Я собираюсь немного безумное здесь, потому что на запрос отлично работает, когда я запускаю его на почтальона с тем же URL и токен авторизации, но когда я запускаю мое приложение код Alamofire возвращает эту ошибку:

Error Domain=NSPOSIXErrorDomain Code=100 "Protocol error" UserInfo={NSErrorPeerAddressKey={length = 16, capacity = 16, bytes = 0x100201bbd83ad0b10000000000000000}, _kCFStreamErrorCodeKey=100, _kCFStreamErrorDomainKey=1}

Я использую:

Alamofire.request("https://myserverURL", method: .get, parameters: [:], encoding: JSONEncoding.default, headers: ["Authorization":"myToken"]) 
     .responseJSON {response in 

    guard response.result.error == nil else { 
     //HERE IS WHERE IS GOING IN WITH THE ERROR 
    } 
} 

Любые мысли будут оценены или мне точку в правильном направлении :)

ответ

2

Я получил ту же ошибку, что и ваша, в Какао с классом фундамента URLSession. Через несколько часов отладка проблемы находится в блоке запроса HTTP.

На самом деле вы должны попробовать сбрасывать тело запроса/ответа HTTP, чтобы узнать, есть ли какие-то неправильные поля. Например, Content-Length и Content-Type правы или отсутствуют? По моему опыту, если эти необходимые (фундаментальные) заголовки уродливы, он может не работать в зависимости от вашей операционной системы или другой промежуточной сети принимают (например, прокси-сервер, шлюз, сервер и т.д.)

Моя неисправность кладя функция Params в метод URLRequest.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type"), который заканчивается неправильным полем Content-Type HTTP.

Однако, он работает в macOS 10.12, но не 12.11, поэтому вы должны убедиться, что ваш объект HTTP-запроса не искажен.

Надеюсь, это поможет.


Сформируйте образец кода, я предполагаю, что encoding: JSONEncoding.default неправильно. Начиная с , метод HTTP GET не имеет тела, строгий/ненадежный сетевой компонент отклонил/не понял бы его.

В вашей задаче задано Accept: application/json в заголовке запроса, однако это не обязательно, если вы уверены, что тип тела ответа.

+0

место! Это была моя проблема, я был смущен, потому что ошибка кажется слишком обобщенной, но опять же это была моя ошибка, я не заметил этого: «Поскольку метод HTTP GET не имеет тела». – LuchoG

1

пытаются заменить эти параметры: [:] с параметрами: п л в вашем запросе. Странно это устранило проблему.

0

В моем случае в тестовой сети было несколько балансиров F5. Один из серверов F5 неправильно проверял запрос таким образом, что объекты json, содержащие @ или /, считались некорректными. Проблема была трудно обнаружить, потому что много раз она работала для меня, но несколько раз ее не было - именно в соответствии с конкретным неправильно сконфигурированным F5-сервером, с которым связывалось мое клиентское приложение.

0

Я получил эту ошибку при отправке Apache заголовка upgrade. Вот ссылка на обсуждение Apache bugzilla.

Исправлено, добавив Header unset Upgrade в конфигурацию хоста в Apache.

0

Добавление ["Content-Type": "application/json"] в заголовки.

0

Это было сложно, по крайней мере, для меня целый день. Я выяснил, в конце концов, как это решить, это проблема с версией протокола HTTP с сервером.

Мы использовали IIS для подключения к API разработки и по умолчанию IIS, если я правильно помню выше 10, используйте HTTP 2.0, если и клиент, и сервер поддерживают его. Кроме того, наш сервер использовал SSL-сертификат для API разработки, поэтому я думаю, что это была основная проблема в сочетании с HTTP 2.0. Отключение использования HTTP 2.0 для IIS в API разработки устраняет проблему.

Итак, мой совет - попытаться контролировать входящий запрос, чтобы увидеть, какой протокол использует запрос на сервере, вы можете сделать это с помощью Charles или любого другого инструмента мониторинга HTTP.

Я надеюсь, что это поможет кому-то еще с той же проблемой.

0

Я была такая же проблема неподвижной, заменив Authorization значение Фейлда на ноль вместо «»

[request setValue: @"" forHTTPHeaderField:@"Authorization"]; 

изменил его на этом

[request setValue: nil forHTTPHeaderField:@"Authorization"]; 
Смежные вопросы