2011-10-16 2 views
0

API에 동기식 REST 요청을 만들려고합니다. API는 HTTP 기본 인증을 사용하므로 Accept: application/json 헤더를 보내는 것 외에도 Authorization 헤더를 Base64로 인코딩 된 사용자 이름과 비밀번호 쌍으로 지정해야합니다. 하나의 헤더를 사용하는 경우 요청이 올바르게 실행됩니다 (성공적으로 나를 인증하거나 내 콘텐츠 형식을 지정). 두 헤더를 모두 사용하면 Authorization 행을 무시하고 "HTTP 기본 액세스가 거부 됨"을 반환합니다 (아마도 a 401).여러 헤더가있는 NSMutableURLRequest

그래서 나는 내 인생이 잘못되었다고 생각하지 않습니다. REST 클라이언트를 통해 요청을 실행하면 정상적으로 작동하므로 내 자격 증명이 유효하다는 것을 100 % 확신합니다. 나는 꽤 Objective-C에 익숙하지 않기 때문에 아마도 내가 따르지 않는 디자인 패턴이있을 수 있다고 생각한다. 그런 경우 NSMutableDictionary 번에 setValue:forKey 번으로 전화하는 것이 유효합니까? 나는 또한 동일한 결과를 가진 요청 객체에 setValue:forHTTPHeader을 사용하여 시도했다.

여기에 코드입니다 :

NSURL *url = [NSURL URLWithString:@"http://foo.com/api/v1/bar"]; 
NSMutableURLRequest *request= [NSMutableURLRequest requestWithURL:url]; 
NSMutableDictionary *headers = [NSMutableDictionary dictionary]; 
NSURLResponse *urlResponse; 
NSError *error; 

[headers setValue:@"application/json" forKey:@"Accept"]; 
[headers setValue:@"Basic ..." forKey:@"Authorization"]; 

[request setAllHTTPHeaderFields:headers]; 

NSData *urlData = [NSURLConnection sendSynchronousRequest:request 
             returningResponse:&urlResponse 
                error:&error]; 

NSString *responseString = [[NSString alloc] initWithData:urlData 
               encoding:NSUTF8StringEncoding]; 

NSLog(@"%@",responseString); 
+1

모든 헤더 필드를 바꾸는 대신 요청에 값을 추가해 보았습니까? 즉,'-setAllHTTPHeaderFields'를 사용하는 대신'-addValue : forHTTPHeaderField :'를 사용하십시오. –

+0

또한 사전에 데이터를 추가하는 표준 방법은'-setObject : forKey :'입니다. –

+0

그리고 마지막으로'Authorization'의 내용이'NSString'입니까? –

답변

1

대답은 사용하는 것입니다

요청 인스턴스에 다른 헤더를 추가
[request addValue:@"Basic ..." forHTTPHeaderField:@"Authorization"]; 

.

관련 문제