Permintaan gagal: tipe konten yang tidak dapat diterima: teks / html menggunakan AFNetworking 2.0

205

Saya mencoba AFNetworking versi 2.0 baru dan saya mendapatkan kesalahan di atas. Tahu mengapa hal ini terjadi? Ini kode saya:

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

Saya menggunakan Xcode 5.0.

Juga, inilah pesan kesalahannya:

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}

Saya hanya menyembunyikan JSON menggunakan kJSONlink. Ini akan mengembalikan JSON.

jaytrixz
sumber

Jawaban:

361

Ini berarti bahwa server Anda mengirim "text/html"bukan jenis yang sudah didukung. Solusi saya adalah untuk menambahkan "text/html"ke acceptableContentTypesset di AFURLResponseSerializationkelas. Cukup cari "acceptableContentTypes" dan tambahkan @"text/html"ke set secara manual.

Tentu saja, solusi ideal adalah mengubah jenis yang dikirim dari server, tetapi untuk itu Anda harus berbicara dengan tim server.

Andrei Neag
sumber
142
Terima kasih! Saya baru saja menambahkan kode ini untuk membuatnya berfungsi:op.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
jaytrixz
13
Untuk PHP semudah menambahkan ini ke halaman: header ("Content-Type: application / json"); (kecuali itu bukan respons JSON, maka XML atau sesuatu)
rckehoe
1
@rckehoe Terima kasih untuk ini - lebih disukai untuk mengubah tajuk halaman daripada acceptableContentTypes:)
Nick
43
Alternatif untuk komentar @jaytrixz adalah dengan hanya menambahkan tipe konten baru ke yang sudah ada:op.responseSerializer.acceptableContentTypes = [op.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
mgarciaisaia
11
Kode cepat:op.responseSerializer.acceptableContentTypes = NSSet(object: "text/html")
Husam
178

Mengatur RequestOperationManagerSerializer Respons saya keHTTPResponseSerializer memperbaiki masalah ini.

Objektif-C

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

Cepat

manager.responseSerializer = AFHTTPResponseSerializer()

Membuat perubahan ini berarti saya tidak perlu menambahkan acceptableContentTypeske setiap permintaan yang saya buat.

Danpe
sumber
2
Saya membuat ini dan itu crash aplikasi saya. Mengembalikan lagi ke menggunakanAFJSONResponseSerializer
jaytrixz
2
@ jaytrixz Tergantung, Jika server Anda selalu merespons dengan JSON, Anda harus menyetel responseSerializerke AFJSONResponseSerializer.
Danpe
2
Anda sekarang akan menerima responseObject sebagai NSData dan perlu mengurai JSON di blok sukses.
Cameron Lowell Palmer
1
Karena saya menggunakan pod, jadi cara ini lebih baik.
yong ho
@Danpe, Cara mengonversi baris kode di atas ke Swift. Saya mencoba dengan manager.responseSerializer = AFJSONResponseSerializer.serializer () tetapi tidak ada gunanya.
Ganesh Guturi
72

Saya mengambil jawaban / komentar @ jaytrixz satu langkah lebih jauh dan menambahkan "teks / html" ke set tipe yang ada. Dengan begitu ketika mereka memperbaikinya di sisi server untuk "application / json" atau "text / json" saya mengklaim itu akan bekerja dengan lancar.

  manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
mharper
sumber
2
Sepakat. Jawaban yang diterima untuk pertanyaan ini memiliki kelemahan besar karena menciptakan bom waktu yang akan meledak ketika sisi server diperbaiki untuk mengembalikan jenis konten yang benar.
Eric Goldberg
Ini tampaknya benar secara teori tetapi adakah yang benar-benar menguji ini?
Minimi
32

Di sisi server, saya menambahkan:

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

ke dalam kode .php saya dan ini juga memperbaiki masalahnya.

Chris Prince
sumber
3
if(!headers_sent() ) { header('Content-Type: application/json'); } Merupakan perbaikan yang bagus
elliotrock
17

Saya memecahkan masalah ini dari perspektif yang berbeda.

Saya pikir jika server mengirim data JSON dengan Content-Type: text/htmlheader. Itu tidak berarti server pria bermaksud mengirimi Anda beberapa html tetapi secara tidak sengaja berubah menjadi JSON. Itu berarti pria server tidak peduli tentang apa Content-Typeheader itu. Jadi, jika orang server tidak peduli sebagai sisi klien Anda lebih baik mengabaikan Content-Typeheader juga. Untuk mengabaikan Content-Typecheck-in headerAFNetworking

manager.responseSerializer.acceptableContentTypes = nil;

Dengan cara ini AFJSONResponseSerializer(yang default) akan membuat serialisasi data JSON tanpa memeriksa Content-Typeheader respons.

dopcn
sumber
Benar sekali. Dengan mengabaikan jenis konten saya tidak menerima konten saya sebagai kode hex, atau sebagai respons nol gagal. Ini sangat bagus! Terima kasih
Brandon
7

Cara mudah untuk mengaktifkan menerima jenis konten "teks / polos":

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

Demikian pula jika Anda ingin mengaktifkan tipe konten "teks / html":

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
da Rocha Pires
sumber
5

Saya mencoba di bawah baris sesuai jawaban @Andrie tetapi tidak berhasil,

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

jadi setelah berburu lebih banyak, saya berusaha untuk membuatnya bekerja dengan sukses.

Ini snip kode saya.

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;

Semoga ini bisa membantu seseorang di luar sana.

ABS
sumber
1
+1. Ini adalah solusinya. Karena Anda harus mengatur Tipe Konten yang dapat diterima baik pada Serializer jika ini adalah serializer JSON (yang biasanya menggunakan "application / json") dan operasinya. Kalau tidak, Anda akan mendapatkan pengaturan kesalahan hanya pada operasi.
loretoparisi
3

Ini adalah satu-satunya hal yang saya temukan berhasil

-(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);
    }];
}
chrisallick
sumber
3

Jika seseorang menggunakan AFHTTPSessionManager maka seseorang dapat melakukan ini untuk menyelesaikan masalah,

Saya subclass di AFHTTPSessionManagermana saya melakukan seperti ini,

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

Dalam kasus saya, saya tidak memiliki kontrol atas pengaturan server, tetapi saya tahu itu mengharapkan "application / json" untuk "Content-Type". Saya melakukan ini di sisi klien iOS:

manager.requestSerializer = [AFJSONRequestSerializer serializer];

lihat kesalahan tipe konten AFNetworking versi 2

uudaddy
sumber
1

Cukup tambahkan baris ini:

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

Saya punya masalah yang mirip dengan bekerja dengan AFNetworking dari basis kode Swift jadi saya hanya meninggalkan ini di sini dalam kasus jarak jauh seseorang sama sialnya dengan saya harus bekerja dalam pengaturan seperti itu. Jika ya, saya merasa Anda teman, tetaplah kuat!

Operasi gagal karena "tipe konten yang tidak dapat diterima", meskipun saya sebenarnya mengatur acceptableContentTypesdengan aSet berisi nilai tipe konten yang dimaksud.

Solusi bagi saya adalah men-tweak kode Swift agar lebih ramah Objective-C, saya kira :

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

Pertanyaan yang bagus selalu memiliki beberapa jawaban, untuk mengurangi dan membantu Anda memilih jawaban yang benar, di sini saya juga menambahkan jawaban saya sendiri. Saya telah mengujinya dan berfungsi dengan baik.

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);
}];
Hemang
sumber
-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);
 }];
Spydy
sumber