iOS AFN多種の種類のPOST要求
3466 ワード
前言
サーバはフレームワークが不要で,作成したインタフェースプロトコルが異なるため,AFNが直接POST要求を呼び出すことは需要を満たすことができず,ここでわざわざ書き記す.
要求方式(フォーム提出)
サーバは、パラメータアップロードフォーマットがreqMsg={json}のようなタイプのパラメータをbodyに配置し、マルチファイル形式でインタフェースに接続する必要があります.
サンプルコード
アドレスバーにパラメータを接続
パラメータ辞書を直接AFNのparametersに置くのが一般的な方法ですが、バックグラウンドでアドレスバーにパラメータをつなぐように要求されると気まずいです.私のやり方はparametersを巡ってrequestのbodyにつなぎ、リクエストを完了することです.
以上は2つの異なるpostリクエスト方式で、もし皆さんがもっと良い方法があれば伝言を歓迎して、各位の大神のハンマーを求めます.
サーバはフレームワークが不要で,作成したインタフェースプロトコルが異なるため,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リクエスト方式で、もし皆さんがもっと良い方法があれば伝言を歓迎して、各位の大神のハンマーを求めます.