Skip to content

iOS网络请求

Deepin edited this page Apr 25, 2021 · 7 revisions

iOS网络请求

参数传递方式(Parameter Type)有三种

  • query
  • Header
  • Body

query

query类型,一般指的是将参数以字符串的格式,拼接到请求的url后面;

结构如下: http://www.site.com/path?parameterName01=parameterValue01&parameterName02=parameterValue02

例如:https://www.baidu.com/link?url=iSpwWQw4csZTQetWYtBxVGMwixKf7Zsf6Tx7k3tTGdpn6K45GzV5GtRNu8CSGhToo1YDvZJJpSVGZ_g6_tbvG_&wd=&eqid=ef9e88270003d01a0000000460852988

在网络请求的完整url (包括协议+域名/地址:端口号+完整路径)后面,拼接一个问号:?,然后对于参数是以 key=value的形式拼接,若是有多个参数则用符号: & 连接起来

Header

Header类型,一般是指将参数,如token放到请求头里面,格式一般是keyValue类型的键值对,或者字典形式,具体以实际情况为准;

iOS通常如下设置:

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager.requestSerializer setValue:@"token值" forHTTPHeaderField:@"access_token"];

其中access_token指token的key,一般是这个,以实际情况后台的要求为准;

Body

Body类型,一般是指将参数,放到请求体里面,的keyValue类型的键值对,或者字典类型, 具体以实际情况为准; 对于body类型,需要设置Content-Type的值,一般又分为以下几种类型

  • application/json
  • application/x-www-form-urlencoded
  • multipart/form-data

1. application/json

参数的格式(json类型):{"key01":"value01","key02":"value02"}

需要设置:

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

2. application/x-www-form-urlencoded

参数的格式:key=1&value=2

3. multipart/form-data

参数的格式:key=1&value=2

Additional

+ (void)post:(NSString *)urlString
  parameters:(NSDictionary *)parameters
     success:(void (^)(id responseObject))success
     failure:(void (^)(NSString *errorMessage))failure {
    
    /// 链接处理
    NSString *url = [NSString stringWithFormat:@"%@%@",baseUrl, urlString];

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    [manager POST:url
       parameters:parameters
         progress:nil
          success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        /// 可以用如下的方式输出请求的信息,都在task中;
        /// 其中task.originalRequest与currentRequest在url没有被重定向的情况下就和originalRequest相同,
        /// 如果被重定向了,那么内容就是不一样的。会有出现currentRequest的HTTPBody无内容的情况,一般用originalRequest即可
        
        NSLog(@"Request Success-->[URL]:%@ [HTTPMethod]:%@ [allHTTPHeaderFields]:%@ [HTTPBody]:%@ [task.response]:%@",
              task.originalRequest.URL,
              task.originalRequest.HTTPMethod,
              task.originalRequest.allHTTPHeaderFields,
              [[NSString alloc]initWithData:task.originalRequest.HTTPBody encoding:NSUTF8StringEncoding],
              task.response);
        
        /// 此处写成功的回调的处理代码
        ```
        ///
        
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
        NSLog(@"Request Failure-->[URL]:%@ [HTTPMethod]:%@ [allHTTPHeaderFields]:%@ [HTTPBody]:%@ [task.response]:%@",
              task.originalRequest.URL,
              task.originalRequest.HTTPMethod,
              task.originalRequest.allHTTPHeaderFields,
              [[NSString alloc]initWithData:task.originalRequest.HTTPBody encoding:NSUTF8StringEncoding],
              task.response);
        
        NSLog(error.localizedDescription);
        
        failure(error.localizedDescription);
    }];
}
Clone this wiki locally