Pertanyaan Cara mengirim data json dalam permintaan Http menggunakan NSURLRequest


Saya baru ke obyektif-c dan saya mulai menaruh banyak upaya dalam permintaan / tanggapan baru-baru ini. Saya memiliki contoh kerja yang dapat memanggil url (melalui http GET) dan menguraikan json yang dikembalikan.

Contoh kerja di bawah ini

- (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];
}

Pertanyaan pertama saya adalah - apakah pendekatan ini akan ditingkatkan? Atau ini bukan async (artinya saya memblokir thread UI saat aplikasi menunggu tanggapan)

Pertanyaan kedua saya adalah - bagaimana saya dapat memodifikasi bagian permintaan ini untuk melakukan POST alih-alih GET? Apakah hanya memodifikasi HttpMethod seperti itu?

[request setHTTPMethod:@"POST"];

Dan akhirnya - bagaimana cara menambahkan sekumpulan data json ke postingan ini sebagai string sederhana (misalnya)

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

Terima kasih sebelumnya


76
2017-12-16 02:30


asal


Jawaban:


Inilah yang saya lakukan (harap dicatat bahwa JSON yang masuk ke server saya harus berupa kamus dengan satu nilai (kamus lain) untuk key = question..i.e. {: Question => {dictionary}}):

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];
}

Data yang diterima kemudian ditangani oleh:

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

Ini tidak 100% jelas dan akan perlu dibaca ulang, tetapi semuanya harus ada di sini untuk Anda mulai. Dan dari apa yang bisa saya katakan, ini tidak sinkron. UI saya tidak terkunci saat panggilan ini dibuat. Semoga itu membantu.


101
2017-12-17 01:11



Saya akan menyarankan untuk menggunakannya ASIHTTPRequest

ASIHTTPRequest mudah digunakan   wrapper di sekitar API CFNetwork itu   membuat beberapa aspek yang lebih membosankan   berkomunikasi dengan server web   lebih mudah. Tertulis dalam Objective-C   dan berfungsi di Mac OS X dan iPhone   aplikasi.

Sangat cocok melakukan HTTP dasar   meminta dan berinteraksi dengan   Layanan berbasis REST (GET / POST / PUT   / MENGHAPUS). Termasuk   Subclass ASIFormDataRequest membuatnya   mudah untuk mengirimkan data dan file POST   menggunakan multipart / form-data.


Harap dicatat, bahwa penulis asli dihentikan dengan proyek ini. Lihat posting berikut untuk alasan dan alternatif: http://allseeing-i.com/%5Brequest_release%5D;

Secara pribadi saya adalah penggemar berat AFNetworking


6
2017-12-16 02:33



Saya berjuang dengan ini untuk sementara waktu. Menjalankan PHP di server. Kode ini akan memposting json dan mendapatkan balasan json dari server

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

     }
 }];

6
2018-02-11 15:03



Sebagian besar dari Anda sudah tahu ini sekarang, tetapi saya memposting ini, hanya memetikan, beberapa dari Anda masih berjuang dengan JSON di iOS6 +.

Di iOS6 dan yang lebih baru, kami memiliki Kelas NSJSONSerialization yang cepat dan tidak memiliki ketergantungan pada termasuk pustaka "luar".

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

Ini adalah cara iOS6 dan yang lebih baru sekarang dapat mengurai JSON secara efisien. Penggunaan SBJson juga merupakan implementasi pra-ARC dan membawa isu-isu itu juga jika Anda bekerja di lingkungan ARC.

Saya harap ini membantu!


3
2017-11-12 14:49



Berikut ini artikel yang bagus menggunakan Restkit

Ini menjelaskan tentang serialisasi data bersarang ke JSON dan melampirkan data ke permintaan HTTP POST.


2
2017-08-19 16:34



Karena edit saya terhadap jawaban Mike G untuk memodernisasi kode ditolak 3 hingga 2 sebagai

Suntingan ini dimaksudkan untuk mengatasi penulis pos dan membuat tidak   masuk akal sebagai pengeditan. Itu seharusnya ditulis sebagai komentar atau komentar   menjawab

Saya mengirim ulang hasil edit saya sebagai jawaban terpisah di sini. Hasil edit ini menghapus JSONRepresentation ketergantungan dengan NSJSONSerialization sebagai komentar Rob dengan 15 upvotes menunjukkan.

    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];
    }

Data yang diterima kemudian ditangani oleh:

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

2
2017-11-03 17:54



Berikut adalah contoh terbaru yang menggunakan NSURLConnection + sendAsynchronousRequest: (10.7+, iOS 5+), Permintaan "Post" tetap sama dengan jawaban yang diterima dan dihilangkan di sini demi kejelasan:

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);
         }
     }
}];

0
2017-12-09 14:42



Anda dapat mencoba kode ini untuk mengirim string json

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];

0
2017-10-04 12:28