คำขอล้มเหลว: ประเภทเนื้อหาที่ยอมรับไม่ได้: text / html โดยใช้ AFNetworking 2.0


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}

ฉันเพิ่งซ่อน JSON โดยใช้ kJSONlink สิ่งนี้ควรส่งคืน JSON

คำตอบ:


361

ซึ่งหมายความว่าเซิร์ฟเวอร์ของคุณกำลังส่ง"text/html"แทนประเภทที่รองรับอยู่แล้ว ทางออกของฉันคือการเพิ่ม"text/html"การacceptableContentTypesตั้งค่าในAFURLResponseSerializationชั้นเรียน เพียงค้นหา "acceptContentTypes" และเพิ่มลง@"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
Swift code:op.responseSerializer.acceptableContentTypes = NSSet(object: "text/html")
Husam

178

การตั้งค่าRequestOperationManagerResponse Serializer ของฉันเพื่อHTTPResponseSerializerแก้ไขปัญหา

Objective-C

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

รวดเร็ว

manager.responseSerializer = AFHTTPResponseSerializer()

การเปลี่ยนแปลงนี้หมายความว่าฉันไม่จำเป็นต้องเพิ่มacceptableContentTypesในทุกคำขอที่ฉันทำ


2
ฉันทำสิ่งนี้และทำให้แอปขัดข้อง ย้อนกลับไปใช้AFJSONResponseSerializer
jaytrixz

2
@jaytrixz มันขึ้นอยู่ถ้าเซิร์ฟเวอร์ของคุณมักจะตอบสนองกับ JSON คุณควรตั้งค่าไปresponseSerializer AFJSONResponseSerializer
Danpe

2
ตอนนี้คุณจะได้รับการตอบกลับ Object เป็น NSData และจำเป็นต้องวิเคราะห์ JSON ในบล็อกความสำเร็จ
Cameron Lowell Palmer

1
เพราะฉันใช้พ็อดดังนั้นวิธีนี้จึงดีกว่า
ย่งโฮ

@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

ฉันแก้ปัญหานี้จากมุมมองที่ต่างออกไป

ฉันคิดว่าถ้าเซิร์ฟเวอร์ส่งข้อมูล JSON ที่มีContent-Type: text/htmlส่วนหัว ไม่ได้หมายความว่าคนที่แต่งตัวประหลาดเซิร์ฟเวอร์ตั้งใจที่จะส่ง HTML ให้คุณ แต่เปลี่ยนเป็น JSON โดยไม่ตั้งใจ หมายความว่าคนเซิร์ฟเวอร์ไม่สนใจว่าContent-Typeส่วนหัวคืออะไร ดังนั้นถ้าคนที่แต่งตัวประหลาดเซิร์ฟเวอร์ไม่สนใจด้านลูกค้าคุณก็จะไม่สนใจContent-Typeส่วนหัวเช่นกัน หากต้องการละเว้นการContent-Typeเช็คอินส่วนหัวAFNetworking

manager.responseSerializer.acceptableContentTypes = nil;

ด้วยวิธีนี้AFJSONResponseSerializer(ค่าเริ่มต้น) จะทำให้ข้อมูล JSON เป็นลำดับโดยไม่ต้องตรวจสอบContent-Typeในส่วนหัวการตอบกลับ


ถูกต้องแน่นอน การเพิกเฉยต่อประเภทเนื้อหาทำให้ฉันไม่ได้รับเนื้อหาของฉันเป็นรหัสฐานสิบหก มันใช้งานได้ดี! ขอบคุณ
Brandon

7

วิธีง่ายๆในการเปิดใช้งานเพื่อรับประเภทเนื้อหา "text / plain":

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"];

ดังนั้นหลังจากการล่าสัตว์มากขึ้นฉันพยายามทำงานให้สำเร็จ

นี่คือ snip รหัสของฉัน

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 นี่คือทางออกที่ชัดเจน เนื่องจากคุณต้องตั้งค่าประเภทเนื้อหาที่ยอมรับได้ทั้งใน Serializer หากนี่คือ serializer JSON (ซึ่งโดยปกติจะใช้ "application / json") และการดำเนินการ มิฉะนั้นคุณจะได้รับการตั้งค่าข้อผิดพลาดในการทำงานเท่านั้น
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

ในกรณีของฉันฉันไม่สามารถควบคุมการตั้งค่าเซิร์ฟเวอร์ได้ แต่ฉันรู้ว่ามันต้องการ "application / json" สำหรับ "Content-Type" ฉันทำสิ่งนี้ในฝั่งไคลเอ็นต์ iOS:

manager.requestSerializer = [AFJSONRequestSerializer serializer];

อ้างถึง ข้อผิดพลาดประเภทเนื้อหา AFNetworking รุ่น 2



0

ฉันมีปัญหาคล้ายกันกับการทำงานกับ AFNetworking จาก Swift codebase ดังนั้นฉันแค่ออกจากที่นี่ในกรณีที่ห่างไกลมีคนโชคร้ายที่ฉันต้องทำงานในการตั้งค่าเช่นนี้ ถ้าคุณเป็นฉันรู้สึกว่าคุณเป็นเพื่อนที่แข็งแกร่งอยู่!

การดำเนินการล้มเหลวเนื่องจาก "เนื้อหาที่ยอมรับไม่ได้" แม้ว่าฉันจะตั้งค่าacceptableContentTypesด้วยSetที่มีค่าประเภทเนื้อหาที่เป็นปัญหา

ทางออกสำหรับฉันคือปรับแต่งรหัส Swift ให้เป็น Objective-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.