如何在NSURLConnectionDelegate中获取http正文willSendRequestForAuthenticationChallenge
问题描述:
我有一个HTTP基本服务器,我有时需要用户在登录前做出选择。我想我会通过发送HTTP响应401与HTTP中的json内容主体提供客户需要展示给用户的数据。如何在NSURLConnectionDelegate中获取http正文willSendRequestForAuthenticationChallenge
但是,我无法向全世界了解我如何获得willSendRequestForAuthenticationChallenge
方法中的响应主体内容。由于我使用基本身份验证并直接提供usr/pwd作为http“Authorization
”标头,因此只要用户无法登录,或者他/她需要进行我正在谈论的选择,就会调用此方法。
所以...我有NSURLAuthenticationChallenge
,但我看不到任何从该物体读取身体的方式。
如果有人可以帮忙,我会很感激!
答
在请求过程中,您无法获取正文数据,因为URL请求可能会要求您在下载正文数据之前做出是否取消并重新进行身份验证的决定。这是一个计时问题。
你可以做的是:
- 允许请求没有凭据完成。这将导致URL连接下载响应正文(错误消息)。然后,您的支持代码可以识别401响应,解析身体并在重试中提供凭据。
- 任选地包裹在上述逻辑中一个自定义的NSURLProtocol类以致变得透明的应用程式的其余部分
或者:
- 提供在自定义HTTP头中的附加数据。我想你可能会从保护空间的failureResponse方法中获得NSURLResponse对象,并从那里获取标题。
虽然我并不是100%确定可以获取标题字段。当然,您可以使用NSURLProtocol或自定义包装代码来完成此操作,如前所述。
请参阅第1.2节的倒数第二段的RFC(https://tools.ietf.org/html/rfc2617)。它看起来并不像规范要求响应中的某些明确标题之外的任何内容,并且它看起来像SDK在NSURLAuthenticationChallenge中为您抽象(并且仅限于此)。你能否在你的请求错误逻辑中处理401,在那里检查响应体,提示用户,然后重新开始一个新的请求? – danh