2012-03-29 21 views
8

संक्षिप्त बैकस्ट्रीरी, हमारे पिछले डेवलपर ने POST अनुरोध करने और हमारे webservice से डेटा पुनर्प्राप्त करने के लिए ASIHTTPRequest का उपयोग किया। अज्ञात कारणों से हमारे ऐप के इस हिस्से ने काम करना बंद कर दिया। भविष्य के प्रमाण के लिए पर्याप्त समय की तरह लगता है और AFNetworking के साथ जाना। आरईएसटी webservice केकेपीएचपी ढांचे पर चलता है।आरईएसटी webservice

संक्षेप में मुझे AFNetworking का उपयोग कर अनुरोध प्रतिक्रिया स्ट्रिंग प्राप्त नहीं हो रही है।

मैं जानता हूँ कि वेब सेवा से काम करता है, क्योंकि मैं सफलतापूर्वक डेटा पोस्ट और का उपयोग कर उचित प्रतिक्रिया प्राप्त करने में सक्षम हूँ कर्ल: कर्ल -d "डेटा [मॉडल] [field0] = field0value & डेटा [मॉडल] [फ़ील्ड 1] = field1value" https://example.com/api/class/function.plist

पिछले डेवलपर के निर्देशों के अनुसार मैं निम्नलिखित के साथ आया था।

#import "AFHTTPRequestOperation.h"  

… 

- (IBAction)loginButtonPressed { 

    NSURL *url = [NSURL URLWithString:@"https://example.com/api/class/function.plist"]; 

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 

    [request setHTTPMethod:@"POST"]; 

    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 

    [request setValue:[usernameTextField text] forHTTPHeaderField:@"data[User][email]"]; 

    [request setValue:[passwordTextField text] forHTTPHeaderField:@"data[User][password]"]; 

    AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:request] autorelease]; 

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 

     NSLog(@"operation hasAcceptableStatusCode: %d", [operation.response statusCode]); 

     NSLog(@"response string: %@ ", operation.responseString); 

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 

     NSLog(@"error: %@", operation.responseString); 

    }]; 

    [operation start]; 

} 

उत्पादन: आपरेशन hasAcceptableStatusCode: 200 प्रतिक्रिया स्ट्रिंग: एक खाली plist फ़ाइल

प्रयास किया समाधान 1: AFNetworking Post Request प्रस्तावित समाधान AFHTTPRequestOperation के एक समारोह operationWithRequest कहा जाता है का उपयोग करता है। हालांकि, जब मैं समाधान का उपयोग करने का प्रयास करता हूं तो मुझे एक चेतावनी मिलती है "क्लास विधि '+ ऑपरेशनविथरक्वेट: पूर्णता:' नहीं मिला (वापसी प्रकार डिफ़ॉल्ट 'आईडी'

समाधान 2 का प्रयास किया गया: NSURLConnection। आउटपुट: मैं सक्षम हूं संदेश भेजा सफलता लॉग नहीं लेकिन प्रतिक्रिया स्ट्रिंग मुद्रित करने के लिए * अद्यतन -।।

NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url]; 
NSString *httpBodyData = @"data[User][email][email protected]&data[User][password]=awesomepassword"; 
[httpBodyData dataUsingEncoding:NSUTF8StringEncoding]; 
[req setHTTPMethod:@"POST"]; 
[req setHTTPBody:[NSData dataWithContentsOfFile:httpBodyData]]; 
NSHTTPURLResponse __autoreleasing *response; 
NSError __autoreleasing *error; 
[NSURLConnection sendSynchronousRequest:req returningResponse:&response error:&error]; 

// *update - returns blank plist 
NSData *responseData = [NSURLConnection sendSynchronousRequest:req returningResponse:nil error:nil]; 
NSString *str = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 
NSLog(@"responseData %@",str); 

if (error == nil && response.statusCode == 200) { 
    // Process response 
    NSLog(@"success");//returns success code of 200 but blank 
    NSLog(@"resp %@", response); 
} else { 
    // Process error 
    NSLog(@"error"); 
} 
+0

हैलो, पोरिया, क्या आपने एक सिंक्रोनस अनुरोध भेजने के लिए NSURLConnection का उपयोग करने का प्रयास किया था? – 8vius

+0

समाधान 2 का प्रयास किया: यह है कि मैंने NSURLConnection की कोशिश की। – Airuop

+0

क्या आपके पास सर्वर की तरफ से सब कुछ ठीक से स्थापित है? एक्सटेंशन पार्सिंग की तरह, प्रतिक्रिया के लिए लेआउट और उनके लिए विचार? ऐसा लगता है कि क्लाइंट की तुलना में सर्वर की समस्या अधिक है। – 8vius

उत्तर

18

ये आवश्यक हैं (मैंने अपने स्वयं के उपयोग के लिए किए गए परिस्थितियों को अलग करना) लाइनें जो वेब सेवा के लिए मेरे अनुरोध को संतुष्ट करती हैं। @ 8vius और @mattt के सुझावों के लिए धन्यवाद!

- (IBAction)loginButtonPressed {   
    NSURL *baseURL = [NSURL URLWithString:@"https://www.example.com/api/class"]; 

    //build normal NSMutableURLRequest objects 
    //make sure to setHTTPMethod to "POST". 
    //from https://github.com/AFNetworking/AFNetworking 
    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:baseURL]; 
    [httpClient defaultValueForHeader:@"Accept"]; 

    NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys: 
          [usernameTextField text], kUsernameField, 
          [passwordTextField text], kPasswordField, 
          nil]; 

    NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" 
      path:@"https://www.example.com/api/class/function" parameters:params]; 

    //Add your request object to an AFHTTPRequestOperation 
    AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] 
             initWithRequest:request] autorelease]; 

    //"Why don't I get JSON/XML/Property List in my HTTP client callbacks?" 
    //see: https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-FAQ 
    //mattt's suggestion http://stackoverflow.com/a/9931815/1004227 - 
    //-still didn't prevent me from receiving plist data 
    //[httpClient registerHTTPOperationClass: 
    //   [AFPropertyListParameterEncoding class]]; 

    [httpClient registerHTTPOperationClass:[AFHTTPRequestOperation class]]; 

    [operation setCompletionBlockWithSuccess: 
     ^(AFHTTPRequestOperation *operation, 
     id responseObject) { 
     NSString *response = [operation responseString]; 
     NSLog(@"response: [%@]",response); 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"error: %@", [operation error]); 
    }]; 

    //call start on your request operation 
    [operation start]; 
    [httpClient release]; 
} 
+0

plist के संचालन के लिए पंजीयन केवल प्रभावित अनुरोध आपरेशन का उपयोग करते हुए 'AFHTTPClient -HTTPRequestOperationWithRequest बनाया: सफलता: विफलता:'। 'Alloc init'-इंग' AFHTTPRequestOperation' हमेशा आप एक 'AFHTTPRequestOperation' देने के लिए जा रहा है। – mattt

+0

धन्यवाद, @mattt! – Airuop

+0

@ पोरीया, यहां पथ क्या है। क्या यह एक ही यूआरएल की तरह है। कृपया मेरी मदद करें मैं पथ पर फंस गया। –

6

उपयोग AFHTTPClient -postPath:parameters:success:failure: रिटर्न खाली plist, अपने मानकों (नेस्टेड शब्दकोशों/सरणियों ठीक हैं) गुजर आप एक plist वापस की उम्मीद कर रहे हैं। , ग्राहक को AFPropertyListRequestOperation पंजीकृत करना सुनिश्चित करें।

किसी भी मामले में, setValue:forHTTPHeaderField: वह नहीं है जो आप यहां चाहते हैं। HTTP headers अनुरोध के बारे में जानकारी निर्दिष्ट करने के लिए हैं; डेटा अनुरोध निकाय का हिस्सा है। AFHTTPClient स्वचालित रूप से पैरामीटर को GET अनुरोधों या POST, et al के लिए HTTP निकाय के लिए क्वेरी स्ट्रिंग में परिवर्तित करता है।

+0

मैं इस समस्या का समाधान हो लेकिन मुझे लगता है मैं अभी भी कुछ गलत हो या अकुशलता से कर रहा हूँ है। यदि आप मेरे समाधान पर तुरंत नजर रखते हैं तो मैं इसकी बहुत सराहना करता हूं। धन्यवाद! – Airuop

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