如何在NSURLConnectionDelegate中获取http正文willSendRequestForAuthenticationChallenge

如何在NSURLConnectionDelegate中获取http正文willSendRequestForAuthenticationChallenge

问题描述:

我有一个HTTP基本服务器,我有时需要用户在登录前做出选择。我想我会通过发送HTTP响应401与HTTP中的json内容主体提供客户需要展示给用户的数据。如何在NSURLConnectionDelegate中获取http正文willSendRequestForAuthenticationChallenge

但是,我无法向全世界了解我如何获得willSendRequestForAuthenticationChallenge方法中的响应主体内容。由于我使用基本身份验证并直接提供usr/pwd作为http“Authorization”标头,因此只要用户无法登录,或者他/她需要进行我正在谈论的选择,就会调用此方法。

所以...我有NSURLAuthenticationChallenge,但我看不到任何从该物体读取身体的方式。

如果有人可以帮忙,我会很感激!

+0

请参阅第1.2节的倒数第二段的RFC(https://tools.ietf.org/html/rfc2617)。它看起来并不像规范要求响应中的某些明确标题之外的任何内容,并且它看起来像SDK在NSURLAuthenticationChallenge中为您抽象(并且仅限于此)。你能否在你的请求错误逻辑中处理401,在那里检查响应体,提示用户,然后重新开始一个新的请求? – danh

在请求过程中,您无法获取正文数据,因为URL请求可能会要求您在下载正文数据之前做出是否取消并重新进行身份验证的决定。这是一个计时问题。

你可以做的是:

  • 允许请求没有凭据完成。这将导致URL连接下载响应正文(错误消息)。然后,您的支持代码可以识别401响应,解析身体并在重试中提供凭据。
  • 任选地包裹在上述逻辑中一个自定义的NSURLProtocol类以致变得透明的应用程式的其余部分

或者:

  • 提供在自定义HTTP头中的附加数据。我想你可能会从保护空间的failureResponse方法中获得NSURLResponse对象,并从那里获取标题。

虽然我并不是100%确定可以获取标题字段。当然,您可以使用NSURLProtocol或自定义包装代码来完成此操作,如前所述。

+0

嘿感谢您的回复。根据我的理解,错误代码的响应仍然可以有一个正文。如果我在Firefox的restclient中运行它,即使我再次提示登录,我也可以看到该身体。但我想我会把它放在标题... – Mathias

+0

他们绝对可以有一个身体。我试图做的一点是,在加载过程中,当NSURLConnection/NSURLSession询问你有关认证的时候,它尚未下载主体,但它已经收到头文件(我认为)。 – dgatwood