iOS AFN多種の種類のPOST要求

3466 ワード

前言
サーバはフレームワークが不要で,作成したインタフェースプロトコルが異なるため,AFNが直接POST要求を呼び出すことは需要を満たすことができず,ここでわざわざ書き記す.
要求方式(フォーム提出)
contentType:  application/x-www-form-urlencoded

サーバは、パラメータアップロードフォーマットがreqMsg={json}のようなタイプのパラメータをbodyに配置し、マルチファイル形式でインタフェースに接続する必要があります.
サンプルコード
    //        
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
    //     
    NSString *baseUrl = [_dataSessionManager.baseURL absoluteString];
    NSString *tmpStr = [baseUrl stringByAppendingFormat:TerminalAction,pathStr];
    //  urlStr
    NSString *urlStr = [tmpStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    //       POST
    NSString *methodStr = [self stringWithMethod:method];
    
    __block NSURLSessionDataTask *task = nil;
    NSError * initRequestError;
    
    NSString * token = [IdentityManager manager].identity.token;
   //1.     requst, reqMsg json           ,key reqMsg,value   json
    NSMutableURLRequest * request = [[AFHTTPRequestSerializer serializer]multipartFormRequestWithMethod:methodStr URLString:urlStr parameters:nil constructingBodyWithBlock:^(id  _Nonnull formData) {
        //2.       jsonData   formData ,name reqMsg
        NSLog(@"url:%@ parameters:%@ = %@ , %@ = %@",urlStr,REQMSG,((NSDictionary *)parameters).mj_JSONString, TOKEN, token);
        [formData appendPartWithFormData:[((NSDictionary *)parameters).mj_JSONString dataUsingEncoding:NSUTF8StringEncoding] name:REQMSG];
 
    } error:&initRequestError];
    //3.    
    if (initRequestError) {
        if (failureBlock) {

        }
        return nil;
    }
    //  token
    if (token) {
      [request setValue:token forHTTPHeaderField:@"X-Auth-Token"];
    }
    //4.       。_uploadSessionManager AFNSessionManager   
    task = [_uploadSessionManager dataTaskWithRequest:request completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
        //                    
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
    }];
    //5.      ,         
    [task resume];

アドレスバーにパラメータを接続
パラメータ辞書を直接AFNのparametersに置くのが一般的な方法ですが、バックグラウンドでアドレスバーにパラメータをつなぐように要求されると気まずいです.私のやり方はparametersを巡ってrequestのbodyにつなぎ、リクエストを完了することです.
NSMutableArray * parameters = [NSMutableArray new];
  //self.requestParameter           
  //1.    
    [self.requestParameter enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
  //2.       key=value         
        [parameters addObject:[NSString stringWithFormat:@"%@=%@", key, obj]];
    }];
  //3.  request
    NSMutableURLRequest * requst = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:self.urlString]];
  //4.      ,   GET
    requst.HTTPMethod = @"POST";
  //5. parameters  &        HTTPBody ,  :   parameters     ,
    requst.HTTPBody = [[parameters componentsJoinedByString:@"&"] dataUsingEncoding:NSUTF8StringEncoding];
   //6.    。self.session AFNSessionManager   
    self.dataTask = [self.session dataTaskWithRequest:requst completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
    //to do ,    
    }];
   //7.    ,         
    [self.dataTask resume];

以上は2つの異なるpostリクエスト方式で、もし皆さんがもっと良い方法があれば伝言を歓迎して、各位の大神のハンマーを求めます.