iOS 【原生API NSURLSession 网络请求(重新弄一份 格式不对!!!!!!!!!!)】

来源:互联网 发布:高性能并发网络框架 编辑:程序博客网 时间:2024/06/06 13:21
////  ViewController.m//  0715-01NSURLSession-01////  Created by 王中尧 on 16/7/15.//  Copyright © 2016年 wzy. All rights reserved.//#import "ViewController.h"@interface ViewController () <NSURLSessionDataDelegate> // 注意session对象的delegate不要写错// 可变的data对象,用来接收并保存服务器端返回的数据@property (nonatomic, strong) NSMutableData *resultDataM;@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    //    [self get1];//    [self get2];//    [self get3];//    [self post];    [self delegate];}// session对象请求方法 参数 为 请求对象(request)- (void)get1 {    // 1 确定请求路径    NSURL *url = [NSURL URLWithString:@"http://123.123.123.1/login?username=wzy&pwd=wzy&type=JSON"];       // 2 根据请求路径 创建 请求对象    NSURLRequest *request = [NSURLRequest requestWithURL:url];        // 3 创建session对象    NSURLSession *session = [NSURLSession sharedSession]; // 单例拿到        // 4 根据session对象 来创建请求任务(参数中传入请求对象)    /*     completionHandler 请求完成之后调用的代码块(默认是在子线程中执行)     data 响应体     response 响应头     error 错误信息     */    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {        // 6 解析数据        NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);    }];        //[NSURLConnection sendAsynchronousRequest:<#(nonnull NSURLRequest *)#> queue:<#(nonnull NSOperationQueue *)#> completionHandler:<#^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError)handler#>        // 5 发送请求(执行任务)    [task resume];}// session对象请求方法 参数 为 请求路径(url),内部自动创建一个请求对象,默认GET类型- (void)get2 {    // 1 确定请求路径    NSURL *url = [NSURL URLWithString:@"<pre name="code" class="objc">http://123.123.123.1/login?username=wzy&pwd=wzy&type=JSON
"]; // 2 创建session对象 NSURLSession *session = [NSURLSession sharedSession]; // 3 根据session对象 创建请求任务(参数中传入请求路径URL。该方法内部会默认根据URL请求路径创建一个请求对象,默认是GET类型) NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { // 5 解析数据 NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); }]; // 4 发送请求 [task resume];}// 简写而已,和get2中的内容一致- (void)get3 { [[[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:@"
http://123.123.123.1/login?username=wzy&pwd=wzy&type=JSON
"] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); }] resume];}// post- (void)post { // 1 确定请求路径URL NSURL *url = [NSURL URLWithString:@"http://123.123.123.1/login"]; // 2 根据请求路径创建 可变的请求对象(必须是可变,不然无法修改内部参数)// NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; // 也可以这样写 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; // 3 “修改”可变请求对象的请求方法为POST(注意,这里是修改,因为请求对象默认是GET请求并设置默认包含请求头) request.HTTPMethod = @"POST"; // 4 设置可变请求对象的请求体 request.HTTPBody = [@"username=520wzyit&pwd=wzy&type=JSON" dataUsingEncoding:NSUTF8StringEncoding]; // 5 创建session对象 NSURLSession *session = [NSURLSession sharedSession];// NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; // 也可以这样创建。configuration为配置信息,设置配置信息为默认。 // 6 通过session对象 创建请求任务task对象 NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { // 8 解析数据 NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); }]; // 7 发送请求 [task resume]; }// delegate- (void)delegate { // 1 创建请求路径 NSURL *url = [NSURL URLWithString:@"http://123.123.123.1/login"]; // 2 根据请求路径创建请求对象 NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 3 创建session对象 并设置delegate(注意:这里的delegate是设置给session对象,而不是dataTask对象) NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil]; // 4 根据session对象 和 请求对象 为参数创建请求任务task对象 NSURLSessionDataTask *task = [session dataTaskWithRequest:request]; // 5 发送请求 [task resume];}#pragma mark - NSURLSessionDelegate// 1 当接收到服务器响应的时候调用- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler { NSLog(@"didReceiveResponse-接收服务器响应"); // 还需要告诉系统如何处理服务器返回的数据 completionHandler(NSURLSessionResponseAllow); /* typedef NS_ENUM(NSInteger, NSURLSessionResponseDisposition) { NSURLSessionResponseCancel = 0, // 取消请求,不处理数据(默认) NSURLSessionResponseAllow = 1, // 接收数据(一般都是这个) NSURLSessionResponseBecomeDownload = 2, // 转变为下载(不常用) NSURLSessionResponseBecomeStream NS_ENUM_AVAILABLE(10_11, 9_0) = 3, // 转变为流(不常用) } NS_ENUM_AVAILABLE(NSURLSESSION_AVAILABLE, 7_0); */}// 2 当接收到服务器 返回数据(响应体) 的时候调用- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { NSLog(@"didReceiveData-接收服务器返回的数据(响应体)"); [self.resultDataM appendData:data]; // NSLog(@"%@", [[NSString alloc] initWithData:self.resultDataM encoding:NSUTF8StringEncoding]); // 此处也可以解析数据打印}// 3 当 请求完成 或者是 请求出错 的时候调用,可以返回出错信息- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { NSLog(@"didCompleteWithError-请求完成 或者 请求失败-%@", [NSThread currentThread]); // 解析数据打印 NSLog(@"%@", [[NSString alloc] initWithData:self.resultDataM encoding:NSUTF8StringEncoding]);}@end

2 0