요청 실패 : 허용되지 않는 콘텐츠 유형 : AFNetworking 2.0을 사용하는 text / html


205

AFNetworking의 새 버전 2.0을 시험 중이며 위의 오류가 발생합니다. 왜 이런 일이 일어나는지 아십니까? 내 코드는 다음과 같습니다.

    NSURL *URL = [NSURL URLWithString:kJSONlink];
    NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    op.responseSerializer = [AFJSONResponseSerializer serializer];
    [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"JSON: %@", responseObject);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
    [[NSOperationQueue mainQueue] addOperation:op];

Xcode 5.0을 사용하고 있습니다.

또한 오류 메시지는 다음과 같습니다.

Error: Error Domain=AFNetworkingErrorDomain Code=-1016 "Request failed: unacceptable content-type: text/html" UserInfo=0xda2e670 {NSErrorFailingURLKey=kJSONlink, AFNetworkingOperationFailingURLResponseErrorKey=<NSHTTPURLResponse: 0xda35180> { URL: kJSONlink } { status code: 200, headers {
    Connection = "Keep-Alive";
    "Content-Encoding" = gzip;
    "Content-Length" = 2898;
    "Content-Type" = "text/html";
    Date = "Tue, 01 Oct 2013 10:59:45 GMT";
    "Keep-Alive" = "timeout=5, max=100";
    Server = Apache;
    Vary = "Accept-Encoding";
} }, NSLocalizedDescription=Request failed: unacceptable content-type: text/html}

kJSONlink를 사용하여 JSON을 숨겼습니다. JSON을 반환해야합니다.

답변:


361

이는 "text/html"이미 지원되는 유형 대신 서버가 전송 중임을 의미합니다 . 내 솔루션을 추가하는 것이었다 "text/html"acceptableContentTypes에 세트 AFURLResponseSerialization클래스입니다. "acceptableContentTypes"를 검색하고 추가하십시오.@"text/html" 하고 세트에 수동으로 .

물론 이상적인 해결책은 서버에서 전송 된 유형을 변경하는 것이지만이를 위해서는 서버 팀과 대화해야합니다.


142
감사! 방금이 코드를 추가하여 작동 시켰습니다.op.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
jaytrixz

13
PHP의 경우이를 페이지에 추가하는 것만 큼 쉽습니다. header ( "Content-Type : application / json"); (JSON 응답이 아닌 경우 XML 등이 아닌 경우)
rckehoe

1
@rckehoe 감사합니다-페이지 헤더를 변경하는 것보다 acceptableContentTypes:)
Nick

43
@jaytrixz 주석에 대한 대안은 기존 컨텐츠에 새로운 컨텐츠 유형을 추가 하는 것입니다.op.responseSerializer.acceptableContentTypes = [op.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
mgarciaisaia

11
스위프트 코드 :op.responseSerializer.acceptableContentTypes = NSSet(object: "text/html")
Husam

178

RequestOperationManager응답 시리얼 라이저를 설정 HTTPResponseSerializer하여 문제를 해결했습니다.

목표 -C

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

빠른

manager.responseSerializer = AFHTTPResponseSerializer()

이 변경을하면 acceptableContentTypes모든 요청 에 추가 할 필요가 없습니다 .


2
나는 이것을 만들었고 내 앱이 충돌합니다. 사용으로 돌아 가기AFJSONResponseSerializer
jaytrixz

2
@jaytrixz 서버가 항상 JSON으로 응답하는 경우에 설정해야 responseSerializer합니다 AFJSONResponseSerializer.
Danpe

2
이제 responseObject를 NSData로 수신하고 성공 블록에서 JSON을 구문 분석해야합니다.
카메론 로웰 팔머

1
나는 포드를 사용하고 있기 때문에이 방법이 더 좋습니다.
yong ho

@ Danpe, 위 코드 줄을 Swift로 변환하는 방법. manager.responseSerializer = AFJSONResponseSerializer.serializer ()로 시도했지만 사용하지 않았습니다.
Ganesh Guturi

72

@jaytrixz의 답변 / 댓글을 한 단계 더 발전 시켜서 기존 유형의 세트에 "text / html"을 추가했습니다. 그렇게하면 서버 측에서 "application / json"또는 "text / json"으로 수정하면 완벽하게 작동한다고 주장합니다.

  manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];

2
동의했다. 이 질문에 대한 대답은 서버 측이 올바른 컨텐츠 유형을 리턴하도록 수정 될 때 폭발 할 시한 폭탄을 생성한다는 점에서 큰 결함이 있습니다.
Eric Goldberg

이것은 이론적으로는 옳아 보이지만 실제로 이것을 테스트 한 사람이 있습니까?
Minimi

32

서버 측에서 다음을 추가했습니다.

header('Content-type: application/json');

내 .php 코드에 추가하면 문제가 해결되었습니다.


3
if(!headers_sent() ) { header('Content-Type: application/json'); }
elliotrock

17

다른 관점에서이 문제를 해결했습니다.

서버가 Content-Type: text/html헤더 와 함께 JSON 데이터를 보내면 생각합니다 . 서버 사용자가 HTML을 보내려고했지만 실수로 JSON으로 변경되었다는 의미는 아닙니다. 그것은 서버 사람이 Content-Type헤더가 무엇인지 신경 쓰지 않는다는 것을 의미합니다 . 따라서 서버 측이 클라이언트 측으로 신경 쓰지 않으면 Content-Type헤더를 무시하는 것이 좋습니다 . Content-Type헤더 체크인 을 무시하려면AFNetworking

manager.responseSerializer.acceptableContentTypes = nil;

이런 식으로 AFJSONResponseSerializer(기본)는 Content-Type응답 헤더 를 체크인하지 않고 JSON 데이터를 직렬화합니다 .


정확히 맞습니다. 콘텐츠 유형을 무시하면 16 진수 코드 또는 실패한 nil 응답으로 콘텐츠를받지 않습니다. 이것은 잘 작동합니다! 감사합니다
Brandon

7

"텍스트 / 일반"컨텐츠 유형을 수신 할 수있는 간단한 방법 :

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"];

마찬가지로 "text / html"컨텐츠 유형을 사용하려는 경우 :

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];

5

@Andrie 답변에 따라 아래 줄을 시도했지만 작동하지 않았습니다.

op.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];

그래서 더 많은 사냥을 한 후에, 나는 그것을 성공적으로 작동시키기 위해 일했습니다.

여기 내 코드 조각이 있습니다.

AFHTTPRequestOperationManager *operation = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:url];
    operation.responseSerializer = [AFJSONResponseSerializer serializer];

    AFJSONResponseSerializer *jsonResponseSerializer = [AFJSONResponseSerializer serializer];

    NSMutableSet *jsonAcceptableContentTypes = [NSMutableSet setWithSet:jsonResponseSerializer.acceptableContentTypes];
    [jsonAcceptableContentTypes addObject:@"text/plain"];
    jsonResponseSerializer.acceptableContentTypes = jsonAcceptableContentTypes;
    operation.responseSerializer = jsonResponseSerializer;

이것이 누군가를 도울 수 있기를 바랍니다.


1
+1. 이것이 확실한 해결책입니다. JSON serializer (일반적으로 "application / json"을 사용하는 경우) 인 경우 Serializer와 사용 가능한 Content Type을 모두 설정해야합니다. 그렇지 않으면 작동시에만 오류 설정이 표시됩니다.
loretoparisi

3

이게 내가 일한 유일한 것

-(void) testHTTPS {
    AFSecurityPolicy *securityPolicy = [[AFSecurityPolicy alloc] init];
    [securityPolicy setAllowInvalidCertificates:YES];

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager setSecurityPolicy:securityPolicy];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    [manager GET:[NSString stringWithFormat:@"%@", HOST] parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
        NSLog(@"%@", string);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
}

3

누군가 사용중인 경우 AFHTTPSessionManager 문제를 해결하기 위해 이와 같이 할 수 있습니다.

나는 이런 식으로 하위 클래스를 만들었습니다 AFHTTPSessionManager.

NSMutableSet *contentTypes = [[NSMutableSet alloc] initWithSet:self.responseSerializer.acceptableContentTypes];
[contentTypes addObject:@"text/html"];
self.responseSerializer.acceptableContentTypes = contentTypes;

2

필자의 경우 서버 설정을 제어 할 수 없지만 "Content-Type"에 "application / json"이 필요하다는 것을 알고 있습니다. 나는 iOS 클라이언트 측에서 이것을했다 :

manager.requestSerializer = [AFJSONRequestSerializer serializer];

참조 AFNetworking 버전이 콘텐츠 유형의 오류


1

이 줄을 추가하십시오.

operation.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];

0

Swift 코드베이스에서 AFNetworking을 사용하는 것과 비슷한 문제가 발생했기 때문에 원격 설정 에서이 문제를 남겨 두는 사람은 그러한 설정에서 작업 해야하는 것처럼 운이 좋지 않습니다. 당신이 있다면, 나는 당신이 친구를 느낀다, 강한 유지!

작업은 내가 실제로 설정에도 불구하고, 때문에 "허용되지 않는 콘텐츠 유형"에 실패했다 acceptableContentTypesa가 함께 Set문제의 콘텐츠 유형 값을 포함.

나를 위해이 솔루션은 더 오브젝티브 C 친화적 인 것으로 스위프트 코드를 조정할했다, 그런 것 같아요 :

serializer.acceptableContentTypes = NSSet(array: ["application/xml", "text/xml", "text/plain"]) as Set<NSObject>

0

좋은 질문에는 항상 여러 가지 답변이 있으며 정답을 줄이고 선택하는 데 도움이됩니다. 나는 그것을 테스트했고 잘 작동합니다.

AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:@"http://www.yourdomain.com/appname/data/ws/index.php/user/login/"]];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];

[manager POST:@"POST" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSString *json = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
    NSLog(@"%@", json);
    //Now convert json string to dictionary.
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"%@", error.localizedDescription);
}];

-1
 UIImage *image = [UIImage imageNamed:@"decline_clicked.png"];
NSData *imageData = UIImageJPEGRepresentation(image,1);


NSString *queryStringss = [NSString stringWithFormat:@"http://119.9.77.121/lets_chat/index.php/webservices/uploadfile/"];
queryStringss = [queryStringss stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];

[MBProgressHUD showHUDAddedTo:self.view animated:YES];


[manager POST:queryStringss parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData)
 {


     [formData appendPartWithFileData:imageData name:@"fileName" fileName:@"decline_clicked.png" mimeType:@"image/jpeg"];



 }
      success:^(AFHTTPRequestOperation *operation, id responseObject)
 {



    NSDictionary *dict = [responseObject objectForKey:@"Result"];

    NSLog(@"Success: %@ ***** %@", operation.responseString, responseObject);
    [MBProgressHUD hideAllHUDsForView:self.view animated:YES];


 }
      failure:^(AFHTTPRequestOperation *operation, NSError *error)
 {
     [MBProgressHUD hideAllHUDsForView:self.view animated:YES];
     NSLog(@"Error: %@ ***** %@", operation.responseString, error);
 }];
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.