AFNetworking 2.0은 GET 요청에 헤더 추가


78

방금 AFNetworking 2.0을 사용하기 시작했고 HTTP Get 요청에 헤더를 넣는 방법이 궁금합니다. 문서는 다음과 같이 GET을 설정합니다.

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @{@"foo": @"bar"};
[manager POST:@"http://example.com/resources.json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];

그러나 우리가 처리하지 않기 때문에 NSURLRequestsHTTP 헤더를 설정하는 방법을 잘 모르겠습니다.

어떤 도움을 주시면 감사하겠습니다.
감사합니다,
Mike



3
@RyanR은 중복이 아닙니다. 2.0이 아닌 AFN 1.x에서 가져온 것입니다. 그 이후로 모든 것이 완전히 바뀌 었습니다.
Mackey18

에 따르면 마이그레이션 가이드 AFHttpClient 아직도 여전히 존재하고 앱의 HTTP 요청을 실행하는 책임이있다
RyanR

2
문서가 상충되는 오픈 소스 프로젝트입니까? NEVAR. AFHTTPClient-> AFHTTPSessionManager가 분명히 있습니다. 당신 말이 맞아요 setDefaultHeader. 문서를 30 초 동안 검색하면 AFHTTPRequestSerializer 가 요청별로 HTTPHeaders를 담당 한다는 것을 알았습니다 .
RyanR

2
@RyanR D' oh가 놓쳤습니다! 당신의 발견 덕분에 올바른 방법을 찾았습니다 :manager.requestSerializer setValue:<#(NSString *)#> forHTTPHeaderField:<#(NSString *)#>
Mackey18

답변:


84

AFNetworking 2.0에 대한 환상적인 문서는 이것을 찾기가 조금 어렵지만 거기에 있습니다. 에 AFHTTPRequestSerializer입니다 -setValue:forHTTPHeaderField:.

또는 권장되는 세션 관리자 생성 방식을 따르는 경우 AFHTTPSessionManager해당 클래스는 각 요청에서 헤더를 수정하는 메서드를 재정의 할 수 있습니다 -dataTaskWithRequest:completionHandler:. 나는 이것을 사용하여 요청을 검사하고 사례별로 헤더를 수정하고, 해당 관리자에 포함 된 네트워킹에 대한 책임을 유지하기 때문에 직렬 변환기를 수정하는 것을 선호합니다 (단일 항목을 사용하지 않음).

- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLResponse *, id, NSError *))completionHandler
{
    static NSString *deviceId;
    if(!deviceId)
    {
        deviceId = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
    }

    NSMutableURLRequest *req = (NSMutableURLRequest *)request;
    // Give each request a unique ID for tracing
    NSString *reqId = [NSString stringWithFormat:@"%@+%@", deviceId, [[NSUUID UUID] UUIDString] ];
    [req setValue:reqId forHTTPHeaderField:"x-myapp-requestId"];
    return [super dataTaskWithRequest:req completionHandler:completionHandler];
}

4
이것이 어떻게 사용 될지에 대한 스 니펫을 추가해도 될까요? 메신저 ios를 배우려는 안드로이드 녀석 이며이 답변을 사용하는 방법을 잘 모르겠습니다.
ChuckKelly 2013

1
하지만 왜 헤더가 serialiser에 설정되어 있습니까 ??? 나는 또한 이런 식으로 그들이 영구적이라는 것을 알았습니다. 그래서 일단 헤더 필드를 설정하면 영원히 거기에 머물러 있습니다! (나는 그들을 제거하기 위해 내 자신의 방법을 추가했다)
피터 Lapisu

4
@PeterLapisu가 nilfor 로이 메서드를 호출 value하면 제거됩니다. 페이로드의 일부인 클라이언트에서 서버로 임시 값을 전달하기 위해 헤더를 사용해서는 안됩니다. 헤더는 인증 데이터, 캐시 제어 등과 같이 자주 변경되지 않는 값을위한 것입니다. 일부 서버는 헤더 매개 변수 일치를 기반으로 캐시 된 데이터를 반환할지 여부를 결정하므로 실수로 방지하고 싶지 않습니다. 단일 요청에 대해서만 헤더를 설정해야하는 경우 페이로드에 속한 데이터라고 생각합니다.
RyanR 2014 년

2
@PeterLapisu AFN 팀의 추론이 무엇인지는 모르겠지만 디자인 관점에서는 확실히 의미가 있습니다. Serializer는 사용중인 프로토콜에 대한 요청 및 응답을 인코딩 / 디코딩하는 방법을 아는 것입니다. FTP를 통한 경우 메시지 대기열과는 다르게 해당 정보를 직렬화합니다. 전송의 유형 만 구성 요소 책임이 방법은 전송의 세부 사항을 (이 [캡슐]의 일부입니다 (알고 en.wikipedia.org/wiki/... )
RyanR

2
아직도 그것의 나쁜 디자인 문제를 믿으십시오 github.com/AFNetworking/AFNetworking/issues/1793
Peter Lapisu

146

다음은 AFNetworking 2.0을 사용한 예입니다.

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
[manager.requestSerializer setValue:@"calvinAndHobbesRock" forHTTPHeaderField:@"X-I do what I want"];

[manager GET:@"http://localhost:3000" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

핵심은 다음 두 줄입니다.

manager.requestSerializer = [AFJSONRequestSerializer serializer];
[manager.requestSerializer setValue:@"calvinAndHobbessRock" forHTTPHeaderField:@"X-I-do-what-I-want"];

1
예를 들어 주셔서 감사합니다 !!
diegomen 2014

17

응답 및 요청 직렬 변환기를 추가하면 내 문제가 해결되었습니다.

manager.responseSerializer = [AFJSONResponseSerializer serializer];
manager.requestSerializer = [AFJSONRequestSerializer serializer];

[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

7

이 양식을 사용하여 특정 헤더로 약속을 잡았습니다.

AFHTTPRequestOperationManager *operationManager = [AFHTTPRequestOperationManager manager];
[operationManager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[operationManager.requestSerializer setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

[operationManager POST:url
            parameters:params
               success:^(AFHTTPRequestOperation *operation, id responseObject) {

                   if (success) {
                       success(responseObject);
                   }

               }
               failure:^(AFHTTPRequestOperation *operation, NSError *error) {

                   NSLog(@"Error: %@", [error description]);

               }
 ];

이 헤더는 설정 한 순간부터 어떤 요청과 함께 전송 될 것이라고 생각하지 않습니까?
vahotm

6

여기에 제가 최선의 선택이라고 생각하는 것이 있습니다. 싱글 톤 어딘가에서를 AFHTTPSessionManager사용하여 구성한 NSURLSessionConfiguration다음 AFHTTPSessionManager요청할 때마다 사용하십시오 .

NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
config.HTTPAdditionalHeaders = @{@"Accepts": @"application/json"};

mySingletonSessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:kMyBaseUrl] sessionConfiguration:config];

3

나는 이것을 ... 토큰을 전달하는 사람들을 위해

[manager.requestSerializer setValue:[NSString stringWithFormat:@"Token token=\"%@\"", _userObj.oAuth] forHTTPHeaderField:@"Authorization"];

-3

다음 코드를 사용하여 모든 유형의 헤더 값을 입력하십시오.

[[FRHTTPReqManager sharedManager].requestSerializer setValue:value forHTTPHeaderField:key];
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.