0

로그인하기 전에 사용자가 선택해야하는 HTTP 기본 서버가 있습니다. HTTP에서 json 콘텐츠와 함께 HTTP 응답 401을 전송하여이 작업을 수행 할 것이라고 생각했습니다. body를 사용하여 클라이언트가 사용자에게 보여줘야하는 데이터를 제공합니다.NSURLConnectionDelegate에서 HTTP 본문을 얻는 방법 willSendRequestForAuthenticationChallenge

그러나 세계에서는 willSendRequestForAuthenticationChallenge 메서드에서 응답 본문 내용을 얻는 방법을 이해할 수 없습니다. Basic Auth를 사용하고 usr/pwd를 http "Authorization"헤더로 직접 제공하기 때문에이 메소드는 사용자가 로그인 할 수 없거나 선택을해야 할 때마다 호출됩니다.

그래서 ... 나는 NSURLAuthenticationChallenge을 가지고 있지만 그 개체에서 시체를 읽는 방법을 볼 수 없습니다.

누구든지 도와 주시면 정말 감사하겠습니다.

+0

섹션 1.2의 마지막 단락 인 RFC (https://tools.ietf.org/html/rfc2617)를 참조하십시오. spec에서 응답의 몇 가지 명시적인 헤더를 넘어서서 호출하는 것처럼 보이지 않으며 NSURLAuthenticationChallenge에서 SDK가이를 추상화 한 것처럼 보입니다. 당신은 당신의 요청 오류 로직에서 401을 처리 할 수 ​​있습니까? 응답 본문을 확인하고, 프롬프트를 표시 한 다음 새 요청으로 다시 시작 할 수 있습니까? – danh

답변

0

URL 요청에서 본문 데이터를 다운로드하기 전에 인증을 취소하고 다시 시도할지 여부를 묻는 메시지가 표시 될 수 있으므로 요청 프로세스의 해당 시점에서 본문 데이터를 가져올 수 없습니다. 그것은 타이밍 문제입니다.

당신이 할 수있는 것은 :

  • 는 요청이 자격 증명없이 완료 할 수 있도록합니다. 그러면 URL 연결이 응답 본문을 다운로드하게됩니다 (오류 메시지). 그런 다음 지원 코드가 401 응답을 인식하고 본문을 구문 분석하고 다시 시도 할 때 자격 증명을 제공 할 수 있습니다. 이

또는 앱 나머지 부분에 투명하게되도록

  • 선택적 사용자 정의 NSURLProtocol 클래스에서 위의 논리를 포장 :

    • 사용자 정의 HTTP 헤더에 추가 데이터를 제공합니다. 아마도 보호 영역의 failureResponse 메서드에서 NSURLResponse 객체를 가져 와서 거기에서 헤더를 가져올 수 있다고 생각합니다.

    나는 그 시점에서 헤더 필드를 얻을 수 있다는 것을 100 % 확실하지는 않습니다. 물론 NSURLProtocol 또는 이전에 설명한대로 사용자 정의 래퍼 코드를 사용하여 수행 할 수 있습니다.

  • +0

    응답 해 주셔서 감사합니다. 내가 이해 한 바로는 오류 코드가있는 응답에는 여전히 본문이있을 수 있습니다. 파이어 폭스의 restclient에서 실행하면 다시 로그인하라는 메시지가 표시 되더라도 본문을 볼 수 있습니다. 하지만 나는 머리글에 넣을거야. – Mathias

    +0

    그들은 절대적으로 시체를 가질 수있다. 내가하려고했던 요점은로드 프로세스의 시점에서 NSURLConnection/NSURLSession이 인증에 대해 묻는 순간, 아직 본문을 다운로드하지 않았지만 이미 헤더를 받았습니다 (필자 생각). – dgatwood

    관련 문제