【iOS】-- GETとPOST(NSURLSession)


NSURLセッション

を使用するには、通常、インスタンスを使用してタスクを作成し、タスクを実行するというNSURLSession2 つの手順があります。ただし、つまりタスク、いわゆるタスクと考えてよいでしょう。は、直接使用できる 3 つの具体的なサブクラス、 および を含む抽象サブクラスですこれら 3 種類のアプリケーションの 3 つの基本的なネットワーク タスクは、データの取得、ファイルのアップロード、ファイルのダウンロードです。データ関連のものはアップロードやダウンロードのタスクにも利用できるため、iOS開発でよく使われます。NSURLSession
NSURLSessionTask
NSURLSessionTaskNSURLSessionDataTaskNSURLSessionUploadTaskNSURLSessionDownloadTaskNSURLSessionDataTask

HTTP ではサーバーと対話するためのさまざまなメソッドが定義されており、基本的なメソッドは GET、POST、PUT、DELETE の 4 つです。URL のフルネームはリソース記述子であり、URL アドレスはネットワーク上のリソースを記述するために使用され、HTTP の GET、POST、PUT、DELETE はクエリ、変更、追加に相当します。 , 4つの操作を削除します。

GETとPOSTの違い

  • 主な違いは、GET は API からデータをフェッチし、POST はデータを API に送信することです。
  • GET は URL または Cookie を使用してパラメータを渡します。一方、POST は BODY にデータを置きます。
  • GET の URL には長さの制限があり、POST のデータは非常に大きくなる可能性があります。
  • POST はアドレス バーにデータが表示されないため、GET よりも安全です。
  • GET の場合は、一度実行するだけでデータを所定の場所に転送できますが、POST の場合は、最初にリクエスト プロセスを実行してから、データを所定の場所に配置する必要があります。
  • GET のセキュリティは非常に低く、POST のセキュリティは高いです。ただし、実行効率は POST メソッドよりも優れています。

GETメソッド

GETリクエストの手順

  • リクエスト パス URL (つまり、バックグラウンドによって提供されるインターフェイス) を決定します。
  • リクエスト オブジェクト NSURLRequest を作成します (リクエスト メソッドとリクエスト ヘッダーを設定しない場合は、デフォルトのリクエスト ヘッダーと GET リクエスト メソッドを使用します)。
  • セッションオブジェクトNSURLSessionの作成
  • リクエスト タスク NSURLSessionDataTask を作成します (ニーズに応じて適切なタスク タイプを選択します)。
  • タスクを実行する
  • リクエストによって返されたデータを解析する
//1.创建URL对象
    

    NSURL *url = [NSURL URLWithString:@"http://s2.s100.vip:9886/valountary/user/SendString"];
    //2.创建请求对象
    //第一个参数是你的URL
    //第二个参数是请求的缓存策略
    //第三个参数是设置请求超时时间
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
    //3.设置请求方法为post
    [request setHTTPMethod:@"POST"];
    //4.设置请求头信息
    //key(头字段名(不区分大小写)):Content-Type,
    //Value(头字段值)为下面三种:(还是得根据后台给的来设置)
    //application/x-www-form-urlencoded(后台接收为分开的参数时,如?name=liyu&password=123)
    //application/json(后台接收为json对象时)
    //multipart/form-data(上传文件时)
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    //5.设置请求体
    NSString *param = [NSString stringWithFormat:@"username:%@;password:%@", self.userName, self.passWord];
    //把拼接后的字符串转换为data,设置请求体(这个data就是请求体)
    request.HTTPBody = [param dataUsingEncoding:NSUTF8StringEncoding];
    //6.建立会话 session支持三种类型的任务
    //    NSURLSessionDataTask  //加载数据
    //    NSURLSessionDownloadTask  //下载
    //    NSURLSessionUploadTask   //上传
    NSURLSession *session = [NSURLSession sharedSession];
    //7.创建请求任务
    //NSLog(@"```%@",request.HTTPBody);
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    
    
        //data就是你获取到的数据,你可以自行对其进行解析
        //error就是获取失败时出现的问题
        if (!error) {
    
    
            NSLog(@"-----%@", [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error]);
        } else {
    
    
            NSLog(@"666");
        }
    }];
    //8.启动任务
    [dataTask resume];

役職

POSTリクエストの手順

  • リクエスト パス URL (つまり、バックグラウンドによって提供されるインターフェイス) を決定します。
  • リクエスト オブジェクト NSMutableURLRequest を作成し、リクエスト メソッドを post に設定します。
  • バックグラウンドで必要なデータ形式や種類(json、xmlなど)に応じてリクエストボディを設定します。
  • 一部のバックグラウンド インターフェイスにリクエスト ヘッダーがある場合は、リクエスト ヘッダーも設定する必要があります。
  • セッションオブジェクトNSURLSessionの作成
  • リクエスト タスク NSURLSessionDataTask を作成します (ニーズに応じて適切なタスク タイプを選択します)。
  • タスクを実行する
  • リクエストによって返されたデータを解析する
    //1.创建URL对象
    NSURL *url = [NSURL URLWithString:@"你要获取的地址"];
    //2.创建请求对象
    //第一个参数是你的URL
    //第二个参数是请求的缓存策略
    //第三个参数是设置请求超时时间
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
    //3.设置请求方法为post
    [request setHTTPMethod:@"POST"];
    //4.设置请求头信息
    //key(头字段名(不区分大小写)):Content-Type,
    //Value(头字段值)为下面三种:(还是得根据后台给的来设置)
    //application/x-www-form-urlencoded(后台接收为分开的参数时,如?name=liyu&password=123)
    //application/json(后台接收为json对象时)
    //multipart/form-data(上传文件时)
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    //5.设置请求体
    NSString *param = [NSString stringWithFormat:@"username = %@ & pwd = %@", self.username.text, self.pwd.text];
    //把拼接后的字符串转换为data,设置请求体(这个data就是请求体)
    request.HTTPBody = [param dataUsingEncoding:NSUTF8StringEncoding];
    //6.建立会话 session支持三种类型的任务
    //    NSURLSessionDataTask  //加载数据
    //    NSURLSessionDownloadTask  //下载
    //    NSURLSessionUploadTask   //上传
    NSURLSession *session = [NSURLSession sharedSession];
    //7.创建请求任务
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    
    
        //data就是你获取到的数据,你可以自行对其进行解析
        //error就是获取失败时出现的问题
    }];
    //8.启动任务
    [dataTask resume];

NSURLSessionDataDelegate プロキシ メソッド

プロジェクトがネットワークからデータを要求するプロセスでさらに処理を行う必要がある場合は、NSURLSession のプロキシ メソッドを呼び出す必要があります。

通常、プロキシ メソッドを使用するには、最初にプロキシ オブジェクトを設定する必要がありますが、NSURLSessionDataDelegate ドキュメントを見ると、プロキシ プロパティ デリゲートが読み取り専用であることがわかります。

では、プロキシ オブジェクトをどのように設定する必要があるのでしょうか? 以下にプロキシ方式を使用する手順を示します。


#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
<NSURLSessionDataDelegate>
@property (nonatomic, copy) NSMutableData *receiveData;
@end

// 1.delegateQueue参数表示协议方法将会在(NSOperationQueue)队列里面执行。(session的delegate属性是只读的,所以使用如下方法设置代理。)
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc] init]];

    // 2.创建任务(因为要使用代理方法,就不需要block方式的初始化了)
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://xxx/phonelogin?yourname=%@&yourpass=%@&btn=login",@"name",@"password"]];
    NSURLSessionDataTask *task = [session dataTaskWithRequest:[NSURLRequest requestWithURL:url]];

    // 3.执行任务
    [task resume];


// 1.接收到服务器的响应
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler {
    
    
    
    //注意:
    //此处需要允许处理服务器的响应,才会继续加载服务器的数据。
    //若在接收响应时需要对返回的参数进行处理(如获取响应头信息等),那么这些处理应该放在该允许操作的前面。
    completionHandler(NSURLSessionResponseAllow);
}

// 2.接收到服务器的数据(此方法在接收数据过程会多次调用)
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
    
    
    // 处理每次接收的数据
    [self.receiveData appendData:data];
}

// 3.任务完成时调用(如果成功,error == nil)
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
    
    
    
    if (error == nil) {
    
    
        /*
          请求完成,成功或者失败的处理
        */
    }
    else {
    
    
        NSLog(@"请求失败:%@", error);
    }
}

AFネットワーキング

AFNetworking をサードパーティ ライブラリとして追加する方法は、前のブログで説明した Masonry や JSONModel などと似ています。

AFNetworking は非常に強力なフレームワークで、主にネットワーク リクエストに使用され、複雑なネイティブ コードをカプセル化しています。ネットワーク リクエストを完了するには、いくつかの簡単な手順だけが必要です。

ヘッダーファイルを追加する

#import "AFNetworking.h"//主要用于网络请求方法
#import "UIKit+AFNetworking.h"//里面有异步加载图片的方法

得る

AFHTTPSessionManager* manager = [AFHTTPSessionManager manager];
    manager GET:<#(nonnull NSString *)#> parameters:<#(nullable id)#> progress:<#^(NSProgress * _Nonnull downloadProgress)downloadProgress#> success:<#^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject)success#> failure:<#^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)failure#>         //第一个参数:NSString类型的请求路径,AFNetworking内部会自动将该路径包装为                                                    一个url并创建请求对象
        //第二个参数:请求参数,此处为nil
        //第三个参数:进度回调,此处为nil
        //第四个参数:请求成功之后回调Block
        //第五个参数:请求失败回调Block

[manager GET:@"https://news-at.zhihu.com/api/4/news/before/20221023" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    
    
        NSLog(@"GET 请求成功, %@", responseObject[@"date"]);
        //self.AFNetWorkTestGETDictionary = responseObject;

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    
    
        NSLog(@"GET 失败");
    }];

画像の説明を追加してください

役職

最初

manager POST:<#(nonnull NSString *)#> parameters:<#(nullable id)#> progress:<#^(NSProgress * _Nonnull uploadProgress)uploadProgress#> success:<#^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject)success#> failure:<#^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)failure#>
    //第一个参数:NSString类型的请求路径,AFN内部会自动将该路径包装为一个URL并创建请求对象
    //第二个参数:请求参数,以字典的方式传递,AFN内部会判断当前是POST请求还是GET请求,用来选择我直接拼接还是转换为NSData放到请求体中传递
    //第三个参数:进度回调,此处为nil
    //第四个参数:请求成功后对调Block
    //第五个参数:请求失败后回调Block


#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
<NSURLSessionDataDelegate>
@property (nonatomic, copy) NSMutableData *receiveData;
@property (nonatomic, copy) NSMutableDictionary *AFNetWorkTestPOSTDictionary;
@end


AFHTTPSessionManager* manager = [AFHTTPSessionManager manager];
    //创建参数
    [self.AFNetWorkTestPOSTDictionary setObject:@"Viper" forKey:@"userName"];
    [self.AFNetWorkTestPOSTDictionary setObject:@"Viper333" forKey:@"passWord"];
    //发送POST请求
    [manager POST:@"要上传的URL" parameters:self.AFNetWorkTestPOSTDictionary progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    
    
        //responseObject是请求成功返回的相应结果,在AFN内部已经把相应结果转换为OC对象,通常是字典或者数组
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    
    
        NSLog(@"POST Failed");
    }];

    

二番目

manager POST:<#(nonnull NSString *)#> parameters:<#(nullable id)#> constructingBodyWithBlock:<#^(id<AFMultipartFormData>  _Nonnull formData)block#> progress:<#^(NSProgress * _Nonnull uploadProgress)uploadProgress#> success:<#^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject)success#> failure:<#^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)failure#>
    //第一个参数:请求路径(NSString类型)
    //第二个参数:非文件参数,以字典方式传递
    //第三个参数:constructingBodyWithBlock在该回调中拼接文件参数
    //第四个参数:progress
    //进度回调uploadProgress.completedUnitCount:已经上传的数据大小
    //uploadProgress.totalUnitCount:数据的总大小
    //第五个参数:success 请求成功的回调
    //task:上传Task
    //responseObject:服务器返回的响应体信息
    //第六个参数:failure 请求失败的回调
    //task:上传Task
    //error:错误信息
//创建会话管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    //处理非文件的参数,模拟上传账号密码
    self.AFNetWorkTestPOSTDictionary = [[NSMutableDictionary alloc] init];
    [self.AFNetWorkTestPOSTDictionary setObject:@"Viper" forKey:@"userName"];
    [self.AFNetWorkTestPOSTDictionary setObject:@"Viper333" forKey:@"passWord"];
    //发送POST请求上传文件
    [manager POST:@"https://news-at.zhihu.com/api/4/news/before/20221023" parameters:self.AFNetWorkTestPOSTDictionary  constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
    
    
        // 混合的数据为头像
        // 获取头像
        // 把头像转化为Data
        UIImage *image = [UIImage imageNamed:@"1.png"];
        NSData *imageData = UIImagePNGRepresentation(image);
        //在BLOCK进行参数拼接
        //ImageUp.png是上传到服务器知乎以什么方式保存
        // 什么是MIME Type : 参考博客:https://www.cnblogs.com/jsean/articles/1610265.html
        [formData appendPartWithFileData:imageData name:@"file" fileName:@"1.png" mimeType:@"image/png"];
        //[formData appendPartWithFileURL:fileUrl name:@"file"fileName:@"Image7.png" mimeType:@"image/png" error:nil];
        //[formData appendPartWithFileURL:fileUrl name:@"file" error:nil];
    } progress:^(NSProgress * _Nonnull uploadProgress) {
    
    
        //        progress 进度回调;
        //uploadProgress.completedUnitCount:已经上传的数据大小
        //uploadProgress.totalUnitCount:数据的总大小
        NSLog(@"%f", 1.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    
    
        NSLog(@"POST UP Succeed!");
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    
    
        NSLog(@"POST UP Failed");
    }];
 UIImage *image = [UIImage imageNamed:@"IMAGE.png"];
 NSData *imageData = UIImagePNGRepresentation(image);
  第一个参数:要上传的文件二进制数据
  第二个参数:文件参数对应的参数名称,此处为file是该台服务器规定的
  第三个参数:该文件上传到服务后以什么名称保存
  第四个参数:该文件的MIMeType类型
[formData appendPartWithFileData:data name:@"file" fileName:@"Image.png" mimeType:@"application/octet-stream"];

  第一个参数:要上传的文件的URL路径
  第二个参数:文件参数对应的参数名称,此处为file是该台服务器规定的
  第三个参数:该文件上传到服务后以什么名称保存
  第四个参数:该文件的MIMeType类型
  第五个参数:错误信息,传地址
[formData appendPartWithFileURL:fileUrl name:@"file" fileName:@"Image.png" mimeType:@"application/octet-stream" error:nil];

  第一个参数:要上传的文件的URL路径
  第二个参数:文件参数对应的参数名称,此处为file
  第三个参数:错误信息
[formData appendPartWithFileURL:fileUrl name:@"file" error:nil];

おすすめ

転載: blog.csdn.net/weixin_61196797/article/details/130562746