Ошибка домена = NSPOSIXErrorDomain Code = 100 "Ошибка протокола"

Я пытаюсь вызвать службу, используя Alamofire, используя метод .get. В запросе нет ничего особенного, кроме параметров, только заголовка авторизации.

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

Ошибка домена = NSPOSIXErrorDomain Code = 100 "Ошибка протокола" 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
    }
}

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

Ответ 1

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

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

Моя ошибка заключается в неправильном изменении параметров функции в методе 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 в заголовке запроса, однако это не требуется, если вы уверены в типе тела ответа.

Ответ 2

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

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

У меня была та же проблема, что и исправлена, заменив значение Авторизация feild на nil вместо ""

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

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

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

Ответ 7

В некоторых случаях необходимо добавить запись, чтобы игнорировать заголовок, содержащий "Обновление", как показано в этом решении: https://forum.directadmin.com/showthread.php?t=55803 А также https://serverfault.com/questions/937253/https-doesnt-work-with-safari

В некоторых случаях нужно было только добавить строку в htaccess

Header unset Upgrade

Я надеюсь, что помог тебе

Ответ 8

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

Ответ 9

Если вы используете какой-то сниффер, попробуйте отключить его. Запуск Чарльза был причиной этой ошибки для меня. Я загружал файлы на сервер, и он работал только для небольших файлов (несколько кб). Файл 500 КБ приводит меня к ошибке "EOF" в Чарльзе и к вашей ошибке в xCode. Отключение Чарльза позволило загрузить любой большой файл. Я еще не нашел точную причину этого. Чарльз хорошо работал с тем же запросом через Интернет, но не с iOS.

Ответ 10

У меня была эта проблема, когда я использовал Google Places API, затем я понял, что проблема в теле HTTP, я установил для моего тела HTTP значение nil, и проблема была решена.