如何发送POST和GET请求?
我想发送我的JSON
到一个URL( POST
和GET
)。
NSMutableDictionary *JSONDict = [[NSMutableDictionary alloc] init]; [JSONDict setValue:"myValue" forKey:"myKey"]; NSData *JSONData = [NSJSONSerialization dataWithJSONObject:self options:kNilOptions error:nil];
我目前的请求代码不起作用。
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];
使用ASIHTTPRequest
不是一个负责任的答案。
在iOS中发送POST
和GET
请求非常简单, 而且不需要额外的框架。
POST
请求:
我们首先创buildPOST
的body
(我们想要发送的)作为NSString
,并将其转换为NSData
。
Objective-C的
NSString *post = [NSString stringWithFormat:@"test=Message&this=isNotReal"]; NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
接下来,我们读取postData
的length
,所以我们可以在请求中传递它。
NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];
现在我们有了我们想发布的内容,我们可以创build一个NSMutableURLRequest
,并包含我们的postData
。
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];
迅速
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;
最后,我们可以发送我们的请求,并通过创build一个新的NSURLSession
读取答复:
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];
迅速
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
请求:
使用GET
请求基本上是一样的,只有没有 HTTPBody
和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];
迅速
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()
在附注中,您可以通过将以下内容添加到我们的NSMutableURLRequest
来添加Content-Type
(和其他数据)。 服务器在请求时可能需要这样做,例如json 。
Objective-C的
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
响应代码也可以使用[(NSHTTPURLResponse*)response statusCode]
读取。
迅速
request.addValue("application/json", forHTTPHeaderField: "Content-Type") request.addValue("application/json", forHTTPHeaderField: "Accept")
更新: sendSynchronousRequest
已从ios9和osx- elcapitan (10.11) 弃用 。
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);
通过使用RestKit,您可以创build一个简单的POST请求(请参阅此GitHub页面以获取更多详细信息)。
在头文件中导入RestKit 。
#import <RestKit/RestKit.h>
然后你可以开始创build一个新的RKRequest
。
RKRequest *MyRequest = [[RKRequest alloc] initWithURL:[[NSURL alloc] initWithString:@"http://myurl.com/FakeUrl/"]];
然后指定你想要做什么样的请求(在这种情况下,一个POST
请求)。
MyRequest.method = RKRequestMethodPOST; MyRequest.HTTPBodyString = YourPostString;
然后在additionalHTTPHeaders
的HTTP头中将您的请求设置为JSON。
MyRequest.additionalHTTPHeaders = [[NSDictionary alloc] initWithObjectsAndKeys:@"application/json", @"Content-Type", @"application/json", @"Accept", nil];
最后,你可以发送请求。
[MyRequest send];
另外你可以NSLog
你的请求来查看结果。
RKResponse *Response = [MyRequest sendSynchronously]; NSLog(@"%@", Response.bodyAsString);
来源: RestKit.org和我 。
-(void)postmethod { NSString * post =[NSString stringWithFormat:@"Email=%@&Password=%@",_txt_uname.text,_txt_pwd.text]; NSData *postdata= [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; NSString *postLength=[NSString stringWithFormat:@"%lu",(unsigned long)[postdata length]]; NSMutableURLRequest *request= [[NSMutableURLRequest alloc]init]; NSLog(@"%@",app.mainurl); // NSString *str=[NSString stringWithFormat:@"%@Auth/Login",app.mainurl]; NSString *str=YOUR URL; [request setURL:[NSURL URLWithString:str]]; [request setHTTPMethod:@"POST"]; [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; [request setHTTPBody:postdata]; NSError *error; NSURLResponse *response; NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; NSString *returnstring=[[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding]; NSMutableDictionary *dict=[returnstring JSONValue]; NSLog(@"%@",dict); } -(void)GETMethod { NSString *appurl; NSString *temp =@"YOUR URL"; appurl = [NSString stringWithFormat:@"%@uid=%@&cid=%ld",temp,user_id,(long)clubeid]; appurl = [appurl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:[NSURL URLWithString:appurl]]; NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse: nil error: nil ]; NSString *returnString = [[NSString alloc] initWithData:returnData encoding: NSUTF8StringEncoding]; NSMutableDictionary *dict_eventalldata=[returnString JSONValue]; NSString *success=[dict_eventalldata objectForKey:@"success"]; }
– (无效)fetchData {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"yourURL"]]; NSLog(@"LatestURL:%@",data); NSError* error=nil; NSDictionary *jsonDict= [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; NSLog(@"JSON = %@", [[NSString alloc] initWithData:data encoding: NSUTF8StringEncoding]); dispatch_async(dispatch_get_main_queue(), ^{ NSDictionary *statuses=[jsonDict objectForKey:@"result"]; NSLog(@"SomeStatus :%@",statuses); if (!statuses) { NSLog(@"Error in Json :%@",error); } else { [self.arrayTimeline removeAllObjects]; for(NSDictionary *newValu in statuses) { [self.arrayTimeline addObject:newValu]; NSString *ProjectName=[newValu objectForKey:@"project_name"]; NSLog(@"Project Name : %@",ProjectName); NSString *Stage=[newValu objectForKey:@"stage_name"]; NSLog(@"Stage : %@",Stage); NSString *CompTime=[newValu objectForKey:@"completion_time"]; NSLog(@"Completion Time : %@",CompTime); NSString *Status=[newValu objectForKey:@"status"]; NSLog(@"Status : %@",Status); } [self.projectTimelineTable reloadData]; }); } }); }
JSON来自url的响应:{“status”:“success”,“name”:“project1”,“address”:“badkal mor metro station”,“state”:“haryana”,“city”:“faridabad” “start_time”:“1480586013”,“current_stage”:“Tender Acceptance”,“manager”:“Not Available”,“completion_time”:“1480464000”}
您可以获得像名称,start_time等键值,并显示在标签上
查看control.h
@interface ViewController UIViewController<UITableViewDataSource,UITableViewDelegate> @property (weak, nonatomic) IBOutlet UITableView *tableView; @property (strong,nonatomic)NSArray *array; @property NSInteger select; @end
view.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
tablecell.h
@interface TableViewCell : UITableViewCell @property (weak, nonatomic) IBOutlet UIImageView *imgView; @property (weak, nonatomic) IBOutlet UILabel *lblName; @property (weak, nonatomic) IBOutlet UILabel *lblAddress;