2012-08-05 2 views
9

AFHTTPClient 인스턴스에 다음 메시지를 보냅니다. 성공 블록은 Foundation 객체 (사전)로 보내지지만 JSON은 _NSCFData 객체라는 것을 디버거에서 알 수 있습니다. This question on SO에 Accept 헤더를 'application/json'으로 설정해야한다고 나와 있습니다. 글쎄, 나는 그렇게하고있다.하지만 AFNetworking은 여전히 ​​응답 본문에서 JSON을 디코딩하지 않는다. NSJSONSerialization을 사용하여 json을 직접 디코딩하면 NSDictionary를 얻을 수 있습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?AFNetworking은 JSON 대신 _NSCFData 객체를 반환합니다.

[client setDefaultHeader:@"Accept" value:@"application/json"]; 
[client postPath:@"/app/open_connection/" 
    parameters:params 
    success:^(AFHTTPRequestOperation *operation, id JSON) { 
     NSLog(@"successful login! %@", [JSON valueForKeyPath:@"status"]); 
    } 
    failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"error opening connection"); 
     NSAlert *alert = [NSAlert alertWithError:error]; 
     [alert runModal]; 
    } 
]; 

참고 : 저는 장고를 사용하여 파이썬으로 서버를 프로그래밍하고 있습니다. 응답의 콘텐츠 유형은 'application/json'입니다.

+3

를 추가해보십시오 [클라이언트 registerHTTPOperationClass : [AFJSONRequestOperation 클래스]]; –

답변

3

시도해보십시오. 클라이언트 설정에 문제가있을 수 있습니다.

NSMutableURLRequest *request = [client requestWithMethod:@"POST" path:@"/app/open_connection/" parameters:params]; 

AFJSONRequestOperation *operation = 
[AFJSONRequestOperation JSONRequestOperationWithRequest:request 
    success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 
     NSLog(@"successful login! %@", [JSON valueForKeyPath:@"status"]); 
    } 
    failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { 
     NSLog(@"error opening connection"); 
     NSAlert *alert = [NSAlert alertWithError:error]; 
     [alert runModal]; 
}]; 
[operation start]; 
+0

그게 작동하므로 내 AFHTTPClient의 구성에 문제가 있어야합니다. –

+0

나를 위해, 문제는 콘텐츠가 text/html로 반환되고 있다는 것이 었습니다. 처음에는 acceptableContentTypes를 수정하여 text/html을 추가 할 수 있다고 생각했지만 NSCF 데이터를 가져온 것은 여전히 ​​적절한 마임 유형에 있어야하기 때문에 하나의 큰 얼룩 대신 JSON으로 콘텐츠를 올바르게 파싱 할 수 있어야했기 때문입니다. 텍스트. – user1214836

6

당신이 AFHTTPClient과 JSON API를 사용하여 작업하는, 당신은 일반적으로 이러한 설정의 세 가지 설정해야합니다 : 지금 당신은 당신의 클라이언트를 사용하여 요청을 할 때

httpClient.parameterEncoding = AFJSONParameterEncoding; 
[httpClient setDefaultHeader:@"Accept" value:@"application/json"]; 
[httpClient registerHTTPOperationClass:[AFJSONRequestOperation class]]; 

를, 그것은 알 수 응답을 JSON으로 구문 분석합니다.

[httpClient postPath:@"/app/open_connection/" 
      parameters:params 
      success:^(AFHTTPRequestOperation *operation, id response) { 
       NSLog(@"JSON! %@", response); 
      } 
      failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
      }]; 

다음은 내가 발견 한 트릭입니다. NSError 객체에서 당신은 그것을 분석하고 (HTTP 응답이 JSON 오류 메시지가 있다면) 오류 메시지를 검색 할 수 있습니다

failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSDictionary *JSON = 
    [NSJSONSerialization JSONObjectWithData: [error.localizedRecoverySuggestion dataUsingEncoding:NSUTF8StringEncoding] 
            options: NSJSONReadingMutableContainers 
             error:nil]; 
      failureCallback(JSON[@"message"]); 
} 
+0

AFHTTPClient가 NSCFData를 반환하는 이유를 알 수 없습니다. "application/json"이 설정되지 않았습니다. 정말 고맙습니다! – r00m

관련 문제