Bagaimana cara mengirim permintaan POST dan GET?

Saya ingin mengirim JSON saya ke URL (POST dan GET).

NSMutableDictionary *JSONDict = [[NSMutableDictionary alloc] init];
[JSONDict setValue:"myValue" forKey:"myKey"];

NSData *JSONData = [NSJSONSerialization dataWithJSONObject:self options:kNilOptions error:nil];

Kode permintaan saya saat ini tidak berfungsi.

NSMutableURLRequest *requestData = [[NSMutableURLRequest alloc] init];

[requestData setURL:[NSURL URLWithString:@"http://fake.url/"];];

[requestData setHTTPMethod:@"POST"];
[requestData setValue:postLength forHTTPHeaderField:@"Content-Length"];
[requestData setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[requestData setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[requestData setHTTPBody:postData];

Menggunakan ASIHTTPRequest bukan merupakan jawaban yang bertanggung jawab.


person Aleksander Azizi    schedule 06.10.2011    source sumber


Jawaban (3)


Mengirim permintaan POST dan GET di iOS cukup mudah; dan tidak diperlukan kerangka tambahan.


POST Permintaan:

Kita mulai dengan membuat body POST kita (jadi apa yang ingin kita kirim) sebagai NSString, dan mengubahnya menjadi NSData.

objective-c

NSString *post = [NSString stringWithFormat:@"test=Message&this=isNotReal"];
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];

Selanjutnya, kita membaca postData's length, sehingga kita dapat meneruskannya dalam permintaan.

NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];

Sekarang kita memiliki apa yang ingin kita posting, kita dapat membuat NSMutableURLRequest, dan memasukkan postData kita.

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:@"http://YourURL.com/FakeURL"]];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody:postData];

swift

let post = "test=Message&this=isNotReal"
let postData = post.data(using: String.Encoding.ascii, allowLossyConversion: true)

let postLength = String(postData!.count)

var request = URLRequest(url: URL(string: "http://YourURL.com/FakeURL/PARAMETERS")!)
request.httpMethod = "POST"
request.addValue(postLength, forHTTPHeaderField: "Content-Length")
request.httpBody = postData;

Dan terakhir, kita dapat mengirimkan permintaan kita, dan membaca balasannya dengan membuat NSURLSession baru:

objective-c

NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
[[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    NSString *requestReply = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
    NSLog(@"Request reply: %@", requestReply);
}] resume];

swift

let session = URLSession(configuration: .default)
session.dataTask(with: request) {data, response, error in
    let requestReply = NSString(data: data!, encoding: String.Encoding.ascii.rawValue)
    print("Request reply: \(requestReply!)")
}.resume()

GET Permintaan:

Dengan permintaan GET pada dasarnya sama, hanya tanpa HTTPBody dan Content-Length.

objective-c

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:@"http://YourURL.com/FakeURL/PARAMETERS"]];
[request setHTTPMethod:@"GET"];

NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
[[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    NSString *requestReply = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
    NSLog(@"Request reply: %@", requestReply);
}] resume];

swift

var request = URLRequest(url: URL(string: "http://YourURL.com/FakeURL/PARAMETERS")!)
request.httpMethod = "GET"

let session = URLSession(configuration: .default)
session.dataTask(with: request) {data, response, error in
    let requestReply = NSString(data: data!, encoding: String.Encoding.ascii.rawValue)
    print("Request reply: \(requestReply!)")
}.resume()

Sebagai tambahan, Anda dapat menambahkan Content-Type (dan data lainnya) dengan menambahkan yang berikut ini ke NSMutableURLRequest kami. Ini mungkin diperlukan oleh server saat meminta, misalnya, json.

objective-c

[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];

Kode respon juga dapat dibaca menggunakan [(NSHTTPURLResponse*)response statusCode].

swift

request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")

Pembaruan: sendSynchronousRequest tidak digunakan lagi dari ios9 dan osx-elcapitan (10.11) dan keluar.

NSURLResponse *requestResponse; NSData *requestHandler = [NSURLConnection sendSynchronousRequest:request returningResponse:&requestResponse error:nil]; NSString *requestReply = [[NSString alloc] initWithBytes:[requestHandler bytes] length:[requestHandler length] encoding:NSASCIIStringEncoding]; NSLog(@"requestReply: %@", requestReply);

person Aleksander Azizi    schedule 17.07.2012
comment
Dijelaskan dengan sangat baik. Terima kasih. :) - person Baby Groot; 26.03.2013
comment
Membersihkan. +1. @Aleksander Azizi - person Chisx; 25.01.2014
comment
Dalam kasus saya, saya harus menggunakan GET dan juga mengirim data json. Bisakah saya menambahkan HTTPBody? - person Satyam; 26.03.2014
comment
Saya mendapatkan permintaanBalas ke Null. Apa yang akan menjadi masalah? - person niravpatel; 04.12.2014
comment
Kemungkinan besar ini adalah permintaan yang buruk atau kegagalan data sisi server. - person Aleksander Azizi; 04.12.2014
comment
Hai, bagaimana cara mengirim parameter input dengan menggunakan kode di atas? tolong beritahu saya. - person Narasimha Nallamsetty; 14.04.2015
comment
Hai @AleksanderAzizi jawaban yang bagus, saya bertanya-tanya, bagaimana Anda memasukkan data ke dalam bidang tertentu dalam objek JSON? misalnya saya ingin memiliki objek bernama Player dan bidang bernama Nama dan saya hanya ingin memperbarui namanya, bagaimana cara melakukannya? - person App Dev Guy; 16.04.2015
comment
@Satyam Dengan permintaan GET Anda memasukkan data di header dan/atau url. Permintaan GET tidak menyertakan isi. - person Aleksander Azizi; 28.04.2016
comment
Terima kasih. Ini Berhasil bagi saya. - person ssowri1; 28.03.2017
comment
Terima kasih banyak, Setelah mencoba banyak cara, saya mengakhiri tugas saya dengan solusi Anda. :-) - person Daya Kevin; 13.10.2017
comment
Bisakah Anda menjelaskan kode penggunaan NSURLConnection alih-alih URLSession di Swift. - person Rashid KC; 27.03.2018
comment
Fungsi @KayCee NSURLConnection untuk Memuat Data Secara Asinkron tidak digunakan lagi. Lihat dokumentasi Apple di NSURLConnection. - person Aleksander Azizi; 29.03.2018

Dengan menggunakan RestKit Anda dapat membuat permintaan POST sederhana (lihat halaman GitHub untuk detail lebih lanjut).

Impor RestKit di file header Anda.

#import <RestKit/RestKit.h>

Kemudian Anda bisa mulai dengan membuat RKRequest baru.

RKRequest *MyRequest = [[RKRequest alloc] initWithURL:[[NSURL alloc] initWithString:@"http://myurl.com/FakeUrl/"]];

Kemudian tentukan jenis permintaan apa yang ingin Anda buat (dalam hal ini, permintaan POST).

MyRequest.method = RKRequestMethodPOST;
MyRequest.HTTPBodyString = YourPostString;

Dan kemudian atur permintaan Anda sebagai JSON di additionalHTTPHeaders.

MyRequest.additionalHTTPHeaders = [[NSDictionary alloc] initWithObjectsAndKeys:@"application/json", @"Content-Type", @"application/json", @"Accept", nil];

Terakhir, Anda dapat mengirimkan permintaan tersebut.

[MyRequest send];

Selain itu, Anda dapat NSLog permintaan Anda untuk melihat hasilnya.

RKResponse *Response = [MyRequest sendSynchronously];
NSLog(@"%@", Response.bodyAsString);

Sumber: RestKit.org dan Saya.

person Aleksander Azizi    schedule 12.06.2012

kontrol tampilan.h

@interface ViewController     UIViewController<UITableViewDataSource,UITableViewDelegate>

  @property (weak, nonatomic) IBOutlet UITableView *tableView;
  @property (strong,nonatomic)NSArray *array;
  @property NSInteger select;
  @end

lihat.m

  - (void)viewDidLoad {
 [super viewDidLoad];
 NSString *urlString = [NSString stringWithFormat:    @"https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=11.021459,76.916332&radius=2000&types=atm&sensor=false&key=AIzaS yD7c1IID7zDCdcfpC69fC7CUqLjz50mcls"];
 NSURL *url = [NSURL URLWithString: urlString];
 NSData *data = [NSData dataWithContentsOfURL:url];
 NSDictionary *jsonData = [NSJSONSerialization JSONObjectWithData:      
 data options: 0 error: nil];
 _array = [[NSMutableArray alloc]init];
 _array = [[jsonData objectForKey:@"results"] mutableCopy];
[_tableView reloadData];}
// Do any additional setup after loading the view, typically from a         



 - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
  }
 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

return 1;
  }

  - (NSInteger)tableView:(UITableView *)tableView
  numberOfRowsInSection:(NSInteger)section {

 return _array.count;
  }

 - (UITableViewCell *)tableView:(UITableView *)tableView
     cellForRowAtIndexPath:(NSIndexPath *)indexPath {

 static NSString *cellid = @"cell";
 UITableViewCell *cell = [tableView
                         dequeueReusableCellWithIdentifier:cellid];
 cell = [[UITableViewCell
         alloc]initWithStyle:UITableViewCellStyleSubtitle
        reuseIdentifier:cellid];

 cell.textLabel.text = [[_array
 valueForKeyPath:@"name"]objectAtIndex:indexPath.row]; 
 cell.detailTextLabel.text = [[_array 
 valueForKeyPath:@"vicinity"]objectAtIndex:indexPath.row];
 NSURL *imgUrl = [NSURL URLWithString:[[_array
 valueForKey:@"icon"]objectAtIndex:indexPath.row]];  
 NSData *imgData = [NSData dataWithContentsOfURL:imgUrl];
 cell.imageView.layer.cornerRadius =        
 cell.imageView.frame.size.width/2;
 cell.imageView.layer.masksToBounds = YES;
 cell.imageView.image = [UIImage imageWithData:imgData];

 return cell;
 }

 @end

sel tabel.h

 @interface TableViewCell : UITableViewCell
 @property (weak, nonatomic) IBOutlet UIImageView *imgView;
 @property (weak, nonatomic) IBOutlet UILabel *lblName;
 @property (weak, nonatomic) IBOutlet UILabel *lblAddress;
person sasidharan.M    schedule 08.05.2017
comment
pengkodean di atas adalah untuk metode get - person sasidharan.M; 08.05.2017