2016-06-28 55 views
0

我有一個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

回答

0

在請求過程中,您無法獲取正文數據,因爲URL請求可能會要求您在下載正文數據之前做出是否取消並重新進行身份驗證的決定。這是一個計時問題。

你可以做的是:

  • 允許請求沒有憑據完成。這將導致URL連接下載響應正文(錯誤消息)。然後,您的支持代碼可以識別401響應,解析身體並在重試中提供憑據。
  • 任選地包裹在上述邏輯中一個自定義的NSURLProtocol類以致變得透明的應用程式的其餘部分

或者:

  • 提供在自定義HTTP頭中的附加數據。我想你可能會從保護空間的failureResponse方法中獲得NSURLResponse對象,並從那裏獲取標題。

雖然我並不是100%確定可以獲取標題字段。當然,您可以使用NSURLProtocol或自定義包裝代碼來完成此操作,如前所述。

+0

嘿感謝您的回覆。根據我的理解,錯誤代碼的響應仍然可以有一個正文。如果我在Firefox的restclient中運行它,即使我再次提示登錄,我也可以看到該身體。但我想我會把它放在標題... – Mathias

+0

他們絕對可以有一個身體。我試圖做的一點是,在加載過程中,當NSURLConnection/NSURLSession詢問你有關認證的時候,它尚未下載主體,但它已經收到頭文件(我認爲)。 – dgatwood

相關問題