İstek başarısız oldu: kabul edilemez içerik türü: AFNetworking 2.0 kullanarak metin / html


205

AFNetworking'in yeni 2.0 sürümünü deniyorum ve yukarıdaki hatayı alıyorum. Bunun neden olduğu hakkında bir fikrin var mı? İşte benim kod:

    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 kullanıyorum.

Ayrıca, işte hata mesajı:

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'u kJSONlink kullanarak sakladım. Bu bir JSON döndürmelidir.

Yanıtlar:


361

Bu, sunucunuzun "text/html"zaten desteklenen türler yerine gönderdiği anlamına gelir . Benim çözümüm eklemek oldu "text/html"için acceptableContentTypessete AFURLResponseSerializationsınıfında. "Kabul edilebilirContentTypes" için arama @"text/html"yapın ve sete manuel olarak ekleyin .

Tabii ki, ideal çözüm sunucudan gönderilen türü değiştirmektir, ancak bunun için sunucu ekibiyle konuşmanız gerekecektir.


142
Teşekkürler! Ben sadece çalışması için bu kodu ekledi:op.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
jaytrixz

13
PHP için bunu sayfaya eklemek kadar kolaydır: header ("Content-Type: application / json"); (bir JSON yanıtı, ardından XML veya başka bir şey
değilse

1
@rckehoe Bunun için teşekkürler - sayfa başlığını değiştirmek için çok tercih edilen acceptableContentTypes:)
Nick

43
@Jaytrixz yorumun bir alternatif sadece etmektir eklemek mevcut olanlara yeni bir içerik türü:op.responseSerializer.acceptableContentTypes = [op.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
mgarciaisaia

11
Hızlı kod:op.responseSerializer.acceptableContentTypes = NSSet(object: "text/html")
Husam

178

RequestOperationManagerYanıt Diziselleştiricimi olarak ayarlamaHTTPResponseSerializer sorunu .

Objective-C

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

hızlı

manager.responseSerializer = AFHTTPResponseSerializer()

Bu değişikliği yapmak, yaptığım acceptableContentTypesher isteğe eklemem gerekmediği anlamına geliyor .


2
Bunu yaptım ve uygulamam çöküyor. Kullanarak geri dönüşAFJSONResponseSerializer
jaytrixz

2
Sunucu her zaman JSON ile yanıt verirse @jaytrixz Bu size belirlesin bağlıdır responseSerializeriçin AFJSONResponseSerializer.
Danpe

2
Şimdi responseObject öğesini NSData olarak alacaksınız ve JSON'u başarı bloğunda ayrıştırmanız gerekiyor.
Cameron Lowell Palmer

1
Çünkü bakla kullanıyorum, bu şekilde daha iyi.
yong ho

@Danpe, Yukarıdaki kod satırını Swift'e dönüştürme. Ben manager.responseSerializer = AFJSONResponseSerializer.serializer () ile çalıştı ama hiçbir faydası.
Ganesh Guturi

72

Bir adım daha @ jaytrixz 'in cevabını / yorumunu aldım ve mevcut tip setine "text / html" ekledim. Bu şekilde sunucu tarafında "application / json" veya "text / json" olarak düzelttiklerinde sorunsuz çalışacağını iddia ediyorum.

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

2
Kabul. Bu sorunun kabul edilen cevabı, sunucu tarafı doğru içerik türünü döndürmek için sabitlendiğinde patlayacak bir saatli bomba oluşturması nedeniyle büyük bir kusura sahiptir.
Eric Goldberg

Bu teoride doğru görünüyor ama bunu gerçekten test eden var mı?
Minimi

32

Sunucu tarafında ekledim:

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

benim .php kod içine ve bu da sorunu çözdü.


3
if(!headers_sent() ) { header('Content-Type: application/json'); } Güzel bir düzeltme
elliotrock

17

Bu sorunu farklı bir perspektiften çözüyorum.

Sunucu JSON veri Content-Type: text/htmlüstbilgi ile gönderirse düşünüyorum . Sunucu adam size html göndermeyi amaçladığı anlamına gelmez, ancak yanlışlıkla JSON olarak değiştirilir. Bu sunucu adam sadece Content-Typebaşlık ne umurumda değil anlamına gelir . Yani sunucu adam istemci tarafı olarak umursamıyorsanız, Content-Typeüstbilgiyi de görmezden gelmelisiniz. Content-TypeBaşlık girişini yok saymak içinAFNetworking

manager.responseSerializer.acceptableContentTypes = nil;

Bu şekilde AFJSONResponseSerializer(varsayılan değer) Content-Typeyanıt başlığını kontrol etmeden JSON verilerini serileştirir .


Tamamen doğru. İçerik türünü yok sayarak içeriğimi onaltılı kod olarak veya başarısız bir nil yanıtı olarak almıyorum. Harika çalışıyor! Teşekkür ederim
Brandon

7

"Metin / düz" içerik türünü almanın kolay bir yolu:

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

Benzer şekilde "metin / html" içerik türünü etkinleştirmek istiyorsanız:

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

5

@Andrie cevap başına satırın altında denedim ama işe yaramadı,

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

daha fazla av yaptıktan sonra, başarılı bir şekilde çalışmasını sağlamak için çalıştım.

İşte kod 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;

Bu birisine yardımcı olacağını umuyoruz.


1
+1. Kesinlikle çözüm budur. Kabul edilebilir İçerik Türünü ayarlamanız gerektiğinden, bu bir JSON serileştiricisiyse (normalde "application / json" kullanıyorsa) Serializer'da ve işlemde ayarlamanız gerekir. Aksi takdirde, yalnızca çalışma sırasında bir hata ayarı alırsınız.
loretoparisi

3

Çalıştığım tek şey bu

-(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

Birisi kullanıyorsa AFHTTPSessionManager, sorunu çözmek için bunu yapabilirsiniz,

AFHTTPSessionManagerBöyle yaptığım yerde alt sınıf yaptım,

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

2

Benim durumumda, sunucu ayarı üzerinde kontrolüm yok, ancak "Content-Type" için "application / json" beklediğini biliyorum. Bunu iOS istemci tarafında yaptım:

manager.requestSerializer = [AFJSONRequestSerializer serializer];

bakın AFNetworking sürüm 2 içerik tipi hatası


1

Sadece bu satırı ekleyin:

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

0

Swift kod tabanından AFNetworking ile çalışan bir şekilde benzer bir sorun yaşadım, bu yüzden burada böyle bir kurulumda çalışmak zorunda olduğum kadar şanssız olan uzak durumda bırakıyorum. Eğer öyleyse, seni dostum, güçlü kal!

Operasyon bana aslında ayarı rağmen nedeniyle "kabul edilemez içerik türü" yapmadığı acceptableContentTypesbir ileSet konusu içerik türü değerini içeren .

Benim için çözüm, Swift kodunu daha Objective-C dostu olmak için değiştirmekti, sanırım :

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

0

İyi bir sorunun her zaman birden fazla yanıtı vardır, doğru cevabı seçmenize yardımcı olmak için burada kendi cevabımı da ekliyorum. Test ettim ve iyi çalışıyor.

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);
 }];
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.