前言
眾所周知,在我們移動端與服務(wù)器端進行數(shù)據(jù)請求提交時,需要根據(jù)服務(wù)器端要求的請求方式去調(diào)用接口,所以在開發(fā)中會經(jīng)常配合服務(wù)器端進行接口調(diào)試。有些情況接口不通可能不是服務(wù)器端接口的問題,而是移動端請求的方式?jīng)]有按照服務(wù)器端的要求。當(dāng)你看完這篇文章后,定能與服務(wù)器端無障礙調(diào)試接口。
簡單了解下http請求
1.請求方法:一般我們想服務(wù)器請求數(shù)據(jù)時,基本上都使用GET或POST方法,除了GET和POST,請求方法還有DELETE,PUT, HEAD等其他方法。
- HTTP1.0定義了三種請求方法: GET, POST 和 HEAD方法。
- HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
- 這里以GET和POST為例,GET和POST有個最大區(qū)別:就是GET的請求參數(shù)以 "?key0=value0&key1=value1" 形式拼接在URL后面,而POST則將參數(shù)封裝在request body內(nèi)。但并不是說GET方法就必須把參數(shù)拼接在URL上,也不是說POST方法就必須把參數(shù)封裝在request body內(nèi),參數(shù)位置與請求方法是相對獨立的,并不互相影響。
2.content-type:內(nèi)容類型,分為請求頭類型和響應(yīng)頭類型
- 響應(yīng)頭類型也就是我們從服務(wù)器端請求到的數(shù)據(jù)格式,目前大多數(shù)是這樣設(shè)置
AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];
sessionManager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/plain",nil];
- 請求頭類型,由于GET請求參數(shù)默認(rèn)拼接在URL上,所以一般我們都是POST方法請求,這個在開發(fā)中我們大多數(shù)都是采用默認(rèn)的格式,原生Form表單: "application/x-www-form-urlencoded",但有的服務(wù)器端可能要求''application/json"格式。
// 設(shè)置請求頭content-type "application/json"
AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];
sessionManager.requestSerializer = [AFJSONRequestSerializer serializer];
// sessionManager.requestSerializer如果不賦值新的AFHTTPRequestSerializer對象,AFN則默認(rèn)創(chuàng)建Form表單: "application/x-www-form-urlencoded"的requestSerializer
AFNetworking github上的介紹

image.png
3.請求參數(shù)的封裝位置:簡單來說就是要不要把參數(shù)放在request body里,AFNetworking的設(shè)置方式
AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];
// NSSet內(nèi)元素為請求方法,當(dāng)調(diào)用這些請求方法時,AFN會將參數(shù)以query string格式拼接到URL后面,除了GET,HEAD之外的請求方法的參數(shù)都將封裝在request body內(nèi)
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;