Ошибка домена = 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, и проблема была решена.