0

У меня есть сервер HTTP Basic, где мне иногда нужен пользователь, чтобы сделать выбор перед входом в систему. Я думал, что сделаю это, отправив ответ HTTP 401 с содержимым json в HTTP чтобы предоставить данные, которые клиент должен показать пользователю.Как получить http-тело в NSURLConnectionDelegate willSendRequestForAuthenticationChallenge

Однако я не могу понять мир, как получить тело тела ответа в методе willSendRequestForAuthenticationChallenge. Поскольку я использую Basic Auth и предоставляю usr/pwd непосредственно как заголовок http «Authorization», этот метод вызывается каждый раз, когда пользователь не может войти в систему, или когда ему нужно сделать выбор, о котором я говорю.

Итак ... у меня есть NSURLAuthenticationChallenge, но я не вижу никакого способа чтения тела с этого объекта.

Если кто-нибудь может помочь, я действительно ценю это!

+0

См. RFC (https://tools.ietf.org/html/rfc2617) второй и последний параграфы в разделе 1.2. Это не выглядит так, как если бы спецификация вызывала что-либо за пределами пары явных заголовков в ответе, и это похоже на тезисы SDK, которые (и только это) для вас в NSURLAuthenticationChallenge. Можете ли вы просто обработать 401 в логике ошибки запроса, проверить там тело ответа, пригласить пользователя, а затем начать с нового запроса? – danh

ответ

0

Вы не можете получить данные тела в этой точке процесса запроса, потому что запрос URL-адреса потенциально просит вас принять решение о том, следует ли отменить и повторить попытку аутентификации, прежде чем он даже загрузит данные тела. Это вопрос времени.

Что вы можете сделать, это:

  • Разрешить запрос завершить без удостоверения. Это приведет к тому, что соединение с URL-адресом загрузит тело ответа (сообщение об ошибке). Затем ваш код поддержки может распознать ответ 401, проанализировать тело и предоставить учетные данные для повторной попытки.
  • Необязательно обернуть выше логики в пользовательском классе NSURLProtocol так, что она становится прозрачной для остальной части вашего приложения

В качестве альтернативы:

  • Предоставить дополнительные данные в заголовке пользовательских HTTP. Я думаю, что вы, вероятно, можете получить объект NSURLResponse из метода failes Responses защиты, и получить заголовки оттуда.

Я не уверен на 100%, что можно получить поля заголовка в этой точке. Конечно, вы можете сделать это с помощью NSURLProtocol или с пользовательским кодом оболочки, как описано выше.

+0

Эй, спасибо за ответ. Из того, что я понимаю, ответы с кодом ошибки могут по-прежнему иметь тело. Если я запустил его в restclient в firefox, я могу увидеть тело, даже если мне снова будет предложено ввести логин. Но я угадаю, что положу его в заголовок ... – Mathias

+0

Они абсолютно могут иметь тело. То, что я пытался сделать, это то, что в момент загрузки, когда NSURLConnection/NSURLSession спрашивает вас об аутентификации, он еще не загрузил тело, но он уже получил заголовки (я думаю). – dgatwood

Смежные вопросы