2012-02-03 16 views
5

के साथ HTTP प्रमाणीकरण के साथ JSON प्राप्त करें मैं अपने हडसन यूआरएल पते से JSON प्राप्त करने का प्रयास कर रहा हूं और HTTP प्रमाणीकरण का उपयोग कर अपने (मैक ओएस एक्स) एप्लिकेशन को प्रमाणित करता हूं।AFNetworking

उदाहरण मैं उपयोग कर रहा हूँ के बाद:

// AppDelegate.m 
- (void) doSomething { 
    [[CommAPIClient sharedClient] getPath:@"/computer/api/json" parameters:nil 
success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSLog(@"Name: %@", [responseObject valueForKeyPath:@"totalExecutors"]); 

    } failure:nil]; 
} 

// CommAPIClient.m 
+ (CommAPIClient *) sharedClient { 
    static CommAPIClient *_sharedClient = nil; 
    static dispatch_once_t onceToken; 

    dispatch_once(&onceToken, ^{ 
     AppDelegate *appDelegate = (AppDelegate *)[[NSApplication sharedApplication] delegate]; 
     _sharedClient = [[self alloc] initWithBaseURL:[NSURL URLWithString: [appDelegate.hudsonTextField stringValue]]]; 
    }); 
    return _sharedClient; 
} 

- (id) initWithBaseURL:(NSURL *)url { 
    self = [super initWithBaseURL:url]; 
    if (self){ 
     [self registerHTTPOperationClass:[AFJSONRequestOperation class]]; 

     AppDelegate *appDelegate = (AppDelegate *)[[NSApplication sharedApplication] delegate]; 
     userName = [appDelegate.userTextField stringValue]; 
     password = [appDelegate.passwdTextField stringValue]; 

     [self setAuthorizationHeaderWithUsername:userName password:password]; 
     [self setDefaultHeader:@"Accept" value:@"application/json"]; 
    } 
    return self; 
} 

मैं अपने ड्रॉपडाउन में दिखाने के लिए कंप्यूटर की सूची प्राप्त करना चाहते हैं, लेकिन यह दो पंक्तियों में एक साथ काम नहीं करता है: [आत्म setAuthorizationHeaderWithUsername: USERNAME पासवर्ड: पासवर्ड ]; [स्वयं सेटडिफॉल्ट हैडर: @ "स्वीकार करें" मान: @ "एप्लिकेशन/जेसन"];

अगर मैं सिर्फ पहली पंक्ति, मेरे authetication काम करता है का उपयोग करें, लेकिन मुझे लगता है कि त्रुटि प्राप्त क्योंकि मैं एक कुंजी प्राप्त करने की कोशिश:

2012-02-03 02:43:57.542 HudsonSlave[7523:707] An uncaught exception was raised 
2012-02-03 02:43:57.542 HudsonSlave[7523:707] [<NSConcreteData 0x100850000> valueForUndefinedKey:]: this class is not key value coding-compliant for the key totalExecutors. 

2012-02-03 02:43:57.623 HudsonSlave[7523:707] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<NSConcreteData 0x100850000> valueForUndefinedKey:]: this class is not key value coding-compliant for the key totalExecutors.' 

दूसरी पंक्ति का उपयोग करते हैं, मेरे प्रमाणीकरण एक त्रुटि 403 वापस आ जाएगी।

कोई भी समस्या से मदद कर सकता है?

धन्यवाद और अंग्रेजी में किसी भी त्रुटि के लिए क्षमा मांगना।

थियागो

+0

क्या होता है जब आप दोनों पंक्तियों का उपयोग करते हैं, बिल्कुल? – mattt

+0

@mattt, त्रुटि ने मुझे बताया कि सामग्री-प्रकार गायब था, इसलिए, मैंने एक तीसरी पंक्ति जोड़ा है: [स्वयं सेटडिफॉल्ट हैडर: @ "सामग्री-प्रकार" मान: @ "एप्लिकेशन/जेसन"]; और त्रुटि है: त्रुटि डोमेन = com.alamofire.networking.error कोड = -1016 "अपेक्षित सामग्री प्रकार {( " text/javascript ", " application/json ", " text/json " )}, मिल गया आवेदन/javascript "UserInfo = 0x100513190 {NSLocalizedDescription = अपेक्षित सामग्री प्रकार {( " text/javascript ", " application/json ", " text/json " )}, आवेदन/जावास्क्रिप्ट मिला, NSErrorFailingURLKey = http://hudson.concretecorp.com.br/computer/api/json} – unnamedd

उत्तर

7

"अपेक्षित सामग्री प्रकार {(" text/javascript "," application/json "," पाठ/json ")}, मिल गया आवेदन/javascript"

वैसे ही जैसे त्रुटि ने कहा, अनुरोध text/javascript, application/json, या text/json में से एक की अपेक्षा कर रहा था, लेकिन सर्वर ने application/javascript भेजा (जो JSON के लिए गलत माइम प्रकार है)।

या तो अपने सर्वर को सही माइम प्रकार के साथ प्रतिक्रिया देने के लिए प्राप्त करें, या (शायद आसान) AFJSONRequestOperation में मैन्युअल रूप से लाइन को बदलें जो निर्दिष्ट करता है कि कौन से माइम प्रकार उपलब्ध हैं। लाइब्रेरी कोड को बदलने के लिए एक कम हैकी विकल्प है जिसमें सबक्लासिंग शामिल है, लेकिन यह आपके मामले में इसके लायक होने की तुलना में शायद अधिक परेशानी है।

+0

बस एक साइड नोट: आपको 'AFHTTPCLient' में 'सामग्री-प्रकार' शीर्षलेख सेट करने की आवश्यकता नहीं है। यह स्वचालित रूप से आपके अनुरोध पैरामीटर को क्रमबद्ध करने के तरीके के आधार पर सेट किया जाएगा। – mattt

14

मैं इस मुद्दे में फ़्लिकर एपीआई के साथ भाग गया और AFJSONRequestOperation उपखंड को समाप्त कर दिया जो तुच्छ हो गया। आप की जरूरत है केवल वर्ग विधि defaultAcceptableContentTypes thusly, उदाहरण के लिए ओवरराइड:

[self registerHTTPOperationClass:[CCFFlickrJSONRequestOperation class]]; 

अद्यतन 2013-09-:

+ (NSSet *)defaultAcceptableContentTypes; 
{ 
    return [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/plain", nil]; 
} 

तब मेरे AFHTTPClient उपवर्ग में, मैं सिर्फ डिफ़ॉल्ट HTTP आपरेशन वर्ग के रूप में मेरी उपवर्ग रजिस्टर 09 14-52-47:

विधि नाम अब + (NSSet *)acceptableContentTypes

+0

वहां बहुत से समाधानों का प्रयास करने के बाद, AFJSONRequestOperation subclassing और डिफ़ॉल्ट ओवरराइडिंग स्वीकार्य सामग्री टिप्स स्वच्छ और बेहतर काम था! धन्यवाद! – DZenBot

+5

यह 'एएफनेटवर्किंग 1.0 आरसी 1' जैसा दिखता है, यह विधि नाम बदलकर '+ (एनएसएसएटी *) स्वीकार्य हैन्टेंट टाइप्स ' – bearMountain

+0

साइड नोट: कभी-कभी आपको" टेक्स्ट/एचटीएमएल " – BabyPanda

4

है अगर यह एक बार की बात पूरी AFJSON उपवर्गीकरण के बजाय है RequestOperation आपत्ति तुम सिर्फ स्वीकार्य सामग्री प्रकार सीधे सेट कर सकते हैं जो कुछ भी आप की जरूरत है:

AFJSONRequestOperation *operation = blah blah blah 

[operation setAcceptableContentTypes:[NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/plain",@"text/html", nil]]; 

[operation start]; 
+0

सेट जोड़ने की आवश्यकता होती है। स्वीकार्य सामग्री एंटीनेटवर्किंग 1.1 में मौजूद नहीं है –

5

वास्तव में आप अब अधिक सामग्री-प्रकार आसानी से जोड़ सकते हैं:

[AFHTTPRequestOperation addAcceptableContentTypes:[NSSet setWithObjects:@"text/html", nil]]; 
+2

इसे रखने के लिए सही जगह कहां है? – Shmidt

+0

अच्छा सवाल, श्मिट। – Morkrom

2

AFNetworking 2 के रूप में।0, serialization अब RequestOperation कक्षाओं का हिस्सा नहीं है, और Serializer वर्गों को सौंपा गया है। यदि आप 2.0 का उपयोग करते हैं, तो आप ऐसा कुछ करना चाहते हैं (सामान्यतः मुझे लगता है कि स्वीकार्य कॉन्टेंट टाइप्स को बदलने के बजाय यह सबसे अच्छा समाधान है - आप कभी नहीं जानते कि भविष्य में AFNetworking SDK संस्करणों में कौन से मूल मूल्य होंगे):

AFHTTPRequestOperationManager *requestManager = [AFHTTPRequestOperationManager manager]; 

NSMutableSet *contentTypes = [requestManager.responseSerializer.acceptableContentTypes mutableCopy]; 
[contentTypes addObject:@"text/html"]; 
[contentTypes addObject:@"text/plain"]; 
// ... etc ... 
requestManager.responseSerializer.acceptableContentTypes = [contentTypes copy]; 

यदि आप सीधे AFHTTPRequestOperation ऑब्जेक्ट का उपयोग करने का निर्णय लेते हैं, तो "myOperationObject.responseSerializer" के साथ "requestManager.responseSerializer" को प्रतिस्थापित करें।

+0

धन्यवाद bro.working –

संबंधित मुद्दे