前言
众所周知,在我们移动端与服务器端进行数据请求提交时,需要根据服务器端要求的请求方式去调用接口,所以在开发中会经常配合服务器端进行接口调试。有些情况接口不通可能不是服务器端接口的问题,而是移动端请求的方式没有按照服务器端的要求。当你看完这篇文章后,定能与服务器端无障碍调试接口。
简单了解下http请求
1.请求方法:一般我们想服务器请求数据时,基本上都使用GET或POST方法,除了GET和POST,请求方法还有DELETE,PUT, HEAD等其他方法。
- HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
- HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
- 这里以GET和POST为例,GET和POST有个最大区别:就是GET的请求参数以 "?key0=value0&key1=value1" 形式拼接在URL后面,而POST则将参数封装在request body内。但并不是说GET方法就必须把参数拼接在URL上,也不是说POST方法就必须把参数封装在request body内,参数位置与请求方法是相对独立的,并不互相影响。
2.content-type:内容类型,分为请求头类型和响应头类型
- 响应头类型也就是我们从服务器端请求到的数据格式,目前大多数是这样设置
AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];
sessionManager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/plain",nil];
- 请求头类型,由于GET请求参数默认拼接在URL上,所以一般我们都是POST方法请求,这个在开发中我们大多数都是采用默认的格式,原生Form表单: "application/x-www-form-urlencoded",但有的服务器端可能要求''application/json"格式。
// 设置请求头content-type "application/json"
AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];
sessionManager.requestSerializer = [AFJSONRequestSerializer serializer];
// sessionManager.requestSerializer如果不赋值新的AFHTTPRequestSerializer对象,AFN则默认创建Form表单: "application/x-www-form-urlencoded"的requestSerializer
AFNetworking github上的介绍
3.请求参数的封装位置:简单来说就是要不要把参数放在request body里,AFNetworking的设置方式
AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];
// NSSet内元素为请求方法,当调用这些请求方法时,AFN会将参数以query string格式拼接到URL后面,除了GET,HEAD之外的请求方法的参数都将封装在request body内
sessionManager.requestSerializer.HTTPMethodsEncodingParametersInURI = [NSSet setWithObjects:@"GET", @"HEAD", nil];
AFNetworking 源码
/**
HTTP methods for which serialized requests will encode parameters as a query string. `GET`, `HEAD`, and `DELETE` by default.
*/
@property (nonatomic, strong) NSSet <NSString *> *HTTPMethodsEncodingParametersInURI;