NSURLRequest का उपयोग करके Http अनुरोध में json डेटा कैसे भेजें


80

मैं ऑब्जेक्टिव-सी के लिए नया हूं और हाल ही में अनुरोध / प्रतिक्रिया में काफी प्रयास करने लगा हूं। मेरे पास एक काम करने वाला उदाहरण है जो एक यूआरएल (HTTP जीईटी के माध्यम से) कॉल कर सकता है और वापस लौटे हुए जौन को पार्स कर सकता है।

इसका कार्य उदाहरण नीचे है

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    [responseData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [responseData appendData:data];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
  NSLog([NSString stringWithFormat:@"Connection failed: %@", [error description]]);
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    [connection release];
  //do something with the json that comes back ... (the fun part)
}

- (void)viewDidLoad
{
  [self searchForStuff:@"iPhone"];
}

-(void)searchForStuff:(NSString *)text
{
  responseData = [[NSMutableData data] retain];
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.whatever.com/json"]];
    [[NSURLConnection alloc] initWithRequest:request delegate:self];
}

मेरा पहला सवाल है - क्या यह दृष्टिकोण बड़ा होगा? या यह async नहीं है (जिसका अर्थ है कि मैं UI थ्रेड को ब्लॉक करता हूं जबकि एप्लिकेशन प्रतिक्रिया की प्रतीक्षा कर रहा है)

मेरा दूसरा सवाल है - मैं GET के बजाय POST करने के लिए इसके अनुरोध हिस्से को कैसे संशोधित कर सकता हूं? क्या बस इतना ही HttpMethod को संशोधित करना है?

[request setHTTPMethod:@"POST"];

और अंत में - मैं इस पोस्ट में एक साधारण स्ट्रिंग के रूप में json डेटा का एक सेट कैसे जोड़ सकता हूं (उदाहरण के लिए)

{
    "magic":{
               "real":true
            },
    "options":{
               "happy":true,
                "joy":true,
                "joy2":true
              },
    "key":"123"
}

पहले ही, आपका बहुत धन्यवाद


1
यहाँ एक ट्यूटोरियल है: mobileorchard.com/tutorial-json-over-http-on-the-iphone
जोश

जवाबों:


105

यहाँ मैं क्या करूँ (कृपया ध्यान दें कि JSON मेरे सर्वर पर जाने के लिए एक शब्द होना चाहिए जिसमें कुंजी = प्रश्न के लिए एक मूल्य (दूसरा शब्दकोष) हो: {{प्रश्न} = {शब्दकोश}}):

NSArray *objects = [NSArray arrayWithObjects:[[NSUserDefaults standardUserDefaults]valueForKey:@"StoreNickName"],
  [[UIDevice currentDevice] uniqueIdentifier], [dict objectForKey:@"user_question"],     nil];
NSArray *keys = [NSArray arrayWithObjects:@"nick_name", @"UDID", @"user_question", nil];
NSDictionary *questionDict = [NSDictionary dictionaryWithObjects:objects forKeys:keys];

NSDictionary *jsonDict = [NSDictionary dictionaryWithObject:questionDict forKey:@"question"];

NSString *jsonRequest = [jsonDict JSONRepresentation];

NSLog(@"jsonRequest is %@", jsonRequest);

NSURL *url = [NSURL URLWithString:@"https://xxxxxxx.com/questions"];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
             cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];


NSData *requestData = [jsonRequest dataUsingEncoding:NSUTF8StringEncoding];

[request setHTTPMethod:@"POST"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody: requestData];

NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];
if (connection) {
 receivedData = [[NSMutableData data] retain];
}

इसके बाद प्राप्त किया गया

NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSDictionary *jsonDict = [jsonString JSONValue];
NSDictionary *question = [jsonDict objectForKey:@"question"];

यह 100% स्पष्ट नहीं है और कुछ फिर से पढ़ना होगा, लेकिन आपको शुरू करने के लिए सब कुछ यहां होना चाहिए। और जो मैं बता सकता हूं, वह अतुल्यकालिक है। ये कॉल किए जाने के दौरान मेरा UI लॉक नहीं है। उम्मीद है की वो मदद करदे।


इस पंक्ति को छोड़कर सब कुछ अच्छा लग रहा है [तानाशाह ऑब्जेक्टफ़ोरके: @ "user_question"], नील]; - आपके नमूने में तानाशाह घोषित नहीं किया गया है। क्या यह सिर्फ एक सरल शब्दकोश है या कुछ विशेष है?
तोरन बिलअप

1
उसके लिए माफ़ करना। हां, "तानाशाह" सिर्फ एक सरल शब्दकोष है जिसे मैं iOS उपयोगकर्ताओं के दस्तावेजों से लोड करता हूं।
माइक जी

19
यह NSDictionaryउदाहरण विधि का उपयोग कर रहा है JSONRepresentation। मैं सुझाव दे सकता हूं कि मैं जैसन-फ्रेमवर्क के बजाय NSJSONSerializationकक्षा पद्धति का उपयोग करूं । dataWithJSONObject
रोब

जैसे NSNumber के माध्यम से NSUInteger को NSString में बदलना अधिक कुशल है [[NSNumber numberWithUnsignedInt:requestData.length] stringValue]
सम्मान .कोड

1
@ मायकेजी ने कोड नमूने में एक लंबे समय तक खड़े और अब तक किसी का ध्यान नहीं दिया। क्षमा करें, अपनी पोस्ट को संपादित करने के लिए;)
काउचडॉलर

7

मैं कुछ समय तक इससे जूझता रहा। सर्वर पर PHP चलाना। यह कोड एक json पोस्ट करेगा और सर्वर से json उत्तर प्राप्त करेगा

NSURL *url = [NSURL URLWithString:@"http://example.co/index.php"];
NSMutableURLRequest *rq = [NSMutableURLRequest requestWithURL:url];
[rq setHTTPMethod:@"POST"];
NSString *post = [NSString stringWithFormat:@"command1=c1&command2=c2"];
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding];
[rq setHTTPBody:postData];
[rq setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

[NSURLConnection sendAsynchronousRequest:rq queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
 {
     if ([data length] > 0 && error == nil){
         NSError *parseError = nil;
         NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:&parseError];
         NSLog(@"Server Response (we want to see a 200 return code) %@",response);
         NSLog(@"dictionary %@",dictionary);
     }
     else if ([data length] == 0 && error == nil){
         NSLog(@"no data returned");
         //no data, but tried
     }
     else if (error != nil)
     {
         NSLog(@"there was a download error");
         //couldn't download

     }
 }];

1
सामग्री प्रकार = "अनुप्रयोग / x-www-form-urlencoded" ने चाल चली। धन्यवाद
SamChen

अच्छा उत्तर। मैंने अपने मामले में "एप्लिकेशन / जसन" का इस्तेमाल किया
गजेंद्र के चौहान ने

6

मैं ASIHTTPRequest का उपयोग करने का सुझाव दूंगा

ASIHTTPRequest CFNetwork API के आसपास रैपर का उपयोग करना आसान है जो वेब सर्वर के साथ संवाद करने के कुछ अधिक कठिन पहलुओं को आसान बनाता है। यह ऑब्जेक्टिव-सी में लिखा गया है और मैक ओएस एक्स और आईफोन दोनों अनुप्रयोगों में काम करता है।

यह मूलभूत HTTP अनुरोधों को करने और REST- आधारित सेवाओं (GET / POST / PUT / DELETE) के साथ बातचीत करने के लिए उपयुक्त है। शामिल ASIFormDataRequest उपवर्ग मल्टीपार्ट / फॉर्म-डेटा का उपयोग करके POST डेटा और फ़ाइलों को सबमिट करना आसान बनाता है।


कृपया ध्यान दें, कि मूल लेखक ने इस परियोजना को बंद कर दिया है। कारणों और विकल्पों के लिए अनुवर्ती पोस्ट देखें: http://allatra-i.com/%5Brequest_release%5D ;

व्यक्तिगत रूप से मैं AFNetworking का बहुत बड़ा प्रशंसक हूं


3

आप में से अधिकांश अब तक यह पहले से ही जानते हैं, लेकिन मैं इसे पोस्ट कर रहा हूं, बस आप में से कुछ अभी भी iOS6 + में JSON के साथ संघर्ष कर रहे हैं।

IOS6 और बाद में, हमारे पास NSJSONSerialization Class है जो तेज है और "बाहर" पुस्तकालयों को शामिल करने पर कोई निर्भरता नहीं है।

NSDictionary *result = [NSJSONSerialization JSONObjectWithData:[resultStr dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil]; 

इस तरह से iOS6 और बाद में अब JSON को कुशलता से पार्स कर सकता है। SBJson का उपयोग पूर्व ARC कार्यान्वयन भी है और यह उन मुद्दों को भी साथ लाता है यदि आप ARC वातावरण में काम कर रहे हैं।

आशा है कि ये आपकी मदद करेगा!


2

यहाँ Restkit का उपयोग कर एक महान लेख है

यह JSON में नेस्टेड डेटा को क्रमबद्ध करने और डेटा को HTTP POST अनुरोध में संलग्न करने पर बताता है।


2

कोड को आधुनिक बनाने के लिए माइक जी के उत्तर को संपादित करने के बाद से 3 से 2 को अस्वीकार कर दिया गया

इस संपादन का उद्देश्य पोस्ट के लेखक को संबोधित करना था और इसे संपादित करने का कोई मतलब नहीं है। इसे टिप्पणी या उत्तर के रूप में लिखा जाना चाहिए था

मैं अपने एडिट को यहां एक अलग उत्तर के रूप में दोहरा रहा हूं। यह संपादन JSONRepresentationनिर्भरता को हटाता है NSJSONSerializationजैसा कि रोब की टिप्पणी के साथ 15 upvotes से पता चलता है।

    NSArray *objects = [NSArray arrayWithObjects:[[NSUserDefaults standardUserDefaults]valueForKey:@"StoreNickName"],
      [[UIDevice currentDevice] uniqueIdentifier], [dict objectForKey:@"user_question"],     nil];
    NSArray *keys = [NSArray arrayWithObjects:@"nick_name", @"UDID", @"user_question", nil];
    NSDictionary *questionDict = [NSDictionary dictionaryWithObjects:objects forKeys:keys];

    NSDictionary *jsonDict = [NSDictionary dictionaryWithObject:questionDict forKey:@"question"];

    NSLog(@"jsonRequest is %@", jsonRequest);

    NSURL *url = [NSURL URLWithString:@"https://xxxxxxx.com/questions"];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
                 cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];


    NSData *requestData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:nil]; //TODO handle error

    [request setHTTPMethod:@"POST"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"];
    [request setHTTPBody: requestData];

    NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];
    if (connection) {
     receivedData = [[NSMutableData data] retain];
    }

इसके बाद प्राप्त किया गया

NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
    NSDictionary *question = [jsonDict objectForKey:@"question"];

0

यहां एक अद्यतन उदाहरण है जो NSURLConnection + sendAsynchronousRequest का उपयोग कर रहा है: (10.7+, iOS 5+), "पोस्ट" अनुरोध स्वीकार किए गए उत्तर के समान ही है और स्पष्टता के लिए यहां छोड़ दिया गया है

NSURL *apiURL = [NSURL URLWithString:
    [NSString stringWithFormat:@"http://www.myserver.com/api/api.php?request=%@", @"someRequest"]];
NSURLRequest *request = [NSURLRequest requestWithURL:apiURL]; // this is using GET, for POST examples see the other answers here on this page
[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
     if(data.length) {
         NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
         if(responseString && responseString.length) {
             NSLog(@"%@", responseString);
         }
     }
}];

प्रश्न पोस्ट के बारे में था
अहमद

2
नहीं, सवाल का पहला भाग अतुल्यकालिकता के बारे में है और यहाँ कोई जवाब नहीं है जो इसका उत्तर देता है। चढ़ाव के लिए चीयर्स।
Auco

0

आप इस कोड को json string भेजने के लिए आज़मा सकते हैं

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:ARRAY_CONTAIN_JSON_STRING options:NSJSONWritin*emphasized text*gPrettyPrinted error:NULL];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSString *WS_test = [NSString stringWithFormat:@"www.test.com?xyz.php&param=%@",jsonString];
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.