अनुरोध विफल: अस्वीकार्य सामग्री-प्रकार: पाठ / 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}

मैं सिर्फ kJSONlink का उपयोग करके JSON को छुपाता हूं। यह एक JSON लौटना चाहिए।

जवाबों:


361

इसका मतलब है कि आपका सर्वर "text/html"पहले से समर्थित प्रकारों के बजाय भेज रहा है । मेरा समाधान कक्षा में सेट "text/html"करने के लिए जोड़ना था । बस "स्वीकार्य कॉन्टेंटटेप्स" की खोज करें और मैन्युअल रूप से सेट में जोड़ें ।acceptableContentTypesAFURLResponseSerialization@"text/html"

बेशक, आदर्श समाधान सर्वर से भेजे गए प्रकार को बदलना है, लेकिन इसके लिए आपको सर्वर टीम के साथ बात करनी होगी।


142
धन्यवाद! मैंने इसे काम करने के लिए इस कोड को जोड़ा:op.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
jaytrixz

13
PHP के लिए यह पृष्ठ पर जोड़ना जितना आसान है: शीर्ष लेख ("सामग्री-प्रकार: अनुप्रयोग / json"); (जब तक यह JSON प्रतिक्रिया नहीं है, तब XML या कुछ और)
rckehoe

1
@rckehoe इसके लिए धन्यवाद - पेज हेडर को acceptableContentTypes:) की तुलना में बदलने के लिए बहुत पसंद किया गया
निक

43
@Jaytrixz टिप्पणी का एक विकल्प केवल पहले से मौजूद लोगों के लिए एक नई सामग्री प्रकार जोड़ना है:op.responseSerializer.acceptableContentTypes = [op.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
मर्गिसिसेया

11
स्विफ्ट कोड:op.responseSerializer.acceptableContentTypes = NSSet(object: "text/html")
हुसाम

178

इस मुद्दे RequestOperationManagerको HTTPResponseSerializerतय करने के लिए मेरे रिस्पांस सीरियल की स्थापना ।

उद्देश्य सी

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

तीव्र

manager.responseSerializer = AFHTTPResponseSerializer()

इस बदलाव को करने का मतलब है कि मुझे acceptableContentTypesहर उस अनुरोध को जोड़ने की जरूरत नहीं है जो मैं करता हूं।


2
मैंने इसे बनाया है और यह मेरे ऐप को क्रैश कर देता है। उपयोग करने के लिए वापस लौटनाAFJSONResponseSerializer
jaytrixz

2
@jaytrixz यह निर्भर करता है, अपने सर्वर हमेशा JSON साथ उत्तर देता है आप स्थापित करना चाहिए responseSerializerकरने के लिए AFJSONResponseSerializer
दानपे

2
अब आपको NSData के रूप में responseObject प्राप्त होगा और सफलता ब्लॉक में JSON को पार्स करने की आवश्यकता है।
कैमरन लोवेल पामर

1
क्योंकि मैं फली का उपयोग कर रहा हूं, इसलिए यह तरीका बेहतर है।
योंग हो

@Danpe, स्विफ्ट में कोड की उपरोक्त रेखा को कैसे परिवर्तित करें। मैंने Manager.responseSerializer = AFJSONResponseSerializer.serializer () का उपयोग करने की कोशिश की, लेकिन कोई फायदा नहीं हुआ।
गणेश गुटुरी २ Ganesh'१५ को ९: ५५

72

मैंने @ jaytrixz के उत्तर / टिप्पणी को एक कदम आगे ले लिया और "टेक्स्ट / html" प्रकार के मौजूदा सेट में जोड़ा। इस तरह जब वे इसे सर्वर पर "एप्लिकेशन / json" या "टेक्स्ट / json" के लिए ठीक करते हैं, तो मेरा दावा है कि यह मूल रूप से काम करेगा।

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

2
माना। इस प्रश्न के स्वीकृत उत्तर में एक बहुत बड़ा दोष है कि यह एक टाइम बम बनाता है जो विस्फोट करेगा जब सर्वर पक्ष सही सामग्री प्रकार को वापस करने के लिए तय किया जाता है।
एरिक गोल्डबर्ग

यह सिद्धांत में सही लगता है लेकिन क्या किसी ने वास्तव में इसका परीक्षण किया है?
मिनीमी


17

मैं इस समस्या को एक अलग दृष्टिकोण से हल करता हूं।

मुझे लगता है कि अगर सर्वर Content-Type: text/htmlहेडर के साथ JSON डेटा भेजता है । इसका मतलब यह नहीं है कि सर्वर का आदमी आपको कुछ html भेजने का इरादा रखता है लेकिन गलती से JSON में बदल गया। इसका मतलब यह है कि सर्वर आदमी सिर्फ Content-Typeहेडर क्या है के बारे में परवाह नहीं करता है। तो अगर सर्वर आदमी ग्राहक पक्ष के रूप में परवाह नहीं करता है तो आप बेहतर Content-Typeहेडर को भी अनदेखा करते हैं । Content-Typeहेडर चेक इन को अनदेखा करने के लिएAFNetworking

manager.responseSerializer.acceptableContentTypes = nil;

इस तरह AFJSONResponseSerializer(डिफ़ॉल्ट एक) Content-Typeप्रतिक्रिया हेडर में जाँच के बिना JSON डेटा को क्रमबद्ध करेगा ।


बिल्कुल सही। सामग्री प्रकार को अनदेखा करने से मुझे हेक्स कोड के रूप में अपनी सामग्री प्राप्त नहीं होती है, और न ही असफल नाक प्रतिक्रिया के रूप में। यह महान काम करता है! धन्यवाद
ब्रैंडन

7

"पाठ / सादा" सामग्री प्रकार प्राप्त करने में सक्षम करने का एक सरल तरीका:

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

इसी तरह यदि आप "टेक्स्ट / html" सामग्री प्रकार को सक्षम करना चाहते हैं:

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

5

मैंने @ उत्तर के अनुसार लाइन से नीचे की कोशिश की, लेकिन काम नहीं किया,

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। यह निश्चित रूप से समाधान है। चूँकि आपको Serializer पर स्वीकार्य कंटेंट टाइप दोनों को सेट करना होगा यदि यह JSON सीरियलाइज़र है (जो सामान्य रूप से "एप्लिकेशन / json" का उपयोग कर रहा है) और ऑपरेशन। अन्यथा आपको केवल ऑपरेशन पर एक त्रुटि सेटिंग मिलेगी।
लोरेटोपरिसी

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

मेरे मामले में, सर्वर सेटिंग पर मेरा नियंत्रण नहीं है, लेकिन मुझे पता है कि यह "कंटेंट-टाइप" के लिए "एप्लिकेशन / जेनसन" की अपेक्षा कर रहा है। मैंने iOS क्लाइंट की तरफ से ऐसा किया है:

manager.requestSerializer = [AFJSONRequestSerializer serializer];

AFNetworking संस्करण 2 सामग्री-प्रकार त्रुटि का संदर्भ लें



0

मैं एक स्विफ्ट कोडबेस से AFNetworking के साथ काम करने में कुछ हद तक इसी तरह की समस्या थी, इसलिए मैं बस इसे दूर के मामले में यहां छोड़ रहा हूं, क्योंकि कोई भी मेरे लिए इस तरह के सेटअप में काम करने के लिए अशुभ है। अगर तुम हो, मुझे लगता है तुम दोस्त हो, मजबूत रहो!

"अस्वीकार्य सामग्री-प्रकार" के कारण ऑपरेशन विफल हो रहा था, मेरे बावजूद वास्तव में प्रश्न में सामग्री प्रकार के मान के acceptableContentTypesसाथ सेट किया गया था Set

मेरे लिए समाधान स्विफ्ट कोड को अधिक उद्देश्य-सी अनुकूल होने के लिए ट्विस्ट करना था, मुझे लगता है :

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);
 }];
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.