1 概述
AFHTTPSessionManager是AFURLSessionManager的子類徐勃。我們可以通過這個(gè)類做HTTP請求臀脏。其實(shí)整個(gè)AFHTTPSessionManager邏輯很簡單搀玖,只是用HTTP的方式拼接了請求延塑,并且調(diào)用父類的方式做處理宋雏。
2 HTTP請求常用方式
HTTP/1.1協(xié)議規(guī)定的HTTP請求方法有OPTIONS蚪燕、GET鲁驶、HEAD径荔、POST、PUT、DELETE、TRACE、CONNECT 這幾種褐健。其中POST一般用來向服務(wù)端提交數(shù)據(jù)坐梯,接下來要討論P(yáng)OST提交數(shù)據(jù)的幾種方式践瓷。協(xié)議規(guī)定POST提交的數(shù)據(jù)必須放在消息主體中,但協(xié)議并沒有規(guī)定數(shù)據(jù)必須使用什么編碼方式。實(shí)際上券敌,開發(fā)者完全可以自己決定消息主體的格式募书,只要最后發(fā)送的 HTTP 請求滿足上面的格式就可以。
但是,數(shù)據(jù)發(fā)送出去,還要服務(wù)端解析成功才有意義。一般服務(wù)端語言如php、python等卖漫,以及它們的framework,都內(nèi)置了自動(dòng)解析常見數(shù)據(jù)格式的功能鸯两。服務(wù)端通常是根據(jù)請求頭(headers)中的Content-Type字段來獲知請求中的消息主體是用何種方式編碼,再對主體進(jìn)行解析。所以說到POST提交數(shù)據(jù)方案叮阅,包含了Content-Type和消息主體編碼方式兩部分膏孟。
2.1 application/json格式的POST請求
樓主現(xiàn)在接觸的項(xiàng)目多半都是application/json格式的POST請求,接下來樓主介紹使用NSURLSessionDataTask做一個(gè)application/json的POST請求。并且請求體數(shù)據(jù)我存儲(chǔ)在一個(gè)test.txt文件中岛抄,從文件中讀取出來然后上傳掸掸。
//test.txt文件內(nèi)容
{"name":"huang","phone":"124"}
通過抓包軟件我的請求如下羽莺,和其他POST請求原理一樣盐固,只是拼接請求體的方式不一樣刁卜,并且更具不同格式的請求體夺脾,設(shè)置不同的Content-Type:
POST /posts HTTP/1.1
Host: jsonplaceholder.typicode.com
Content-Type: application/json
Connection: keep-alive
Accept: application/json
User-Agent: AFNetWorking3.X%E6%BA%90%E7%A0%81%E9%98%85%E8%AF%BB/1 CFNetwork/808.2.16 Darwin/15.6.0
Content-Length: 31
Accept-Language: en-us
Accept-Encoding: gzip, deflate
{"name":"huang","phone":"124"}
具體demo如下:
- (IBAction)applicationjsonPOST2:(id)sender {
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://jsonplaceholder.typicode.com/posts"]];
//指請求體的類型吉挣。由于我們test.txt里面的文件是json格式的字符串喉钢。所以我這里指定為`application/json`
[request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request addValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setHTTPMethod:@"POST"];
[request setCachePolicy:NSURLRequestReloadIgnoringCacheData];
[request setTimeoutInterval:20];
NSString *path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"txt"];
NSURL *url = [NSURL URLWithString:[path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
//使用Block來處理返回?cái)?shù)據(jù)
NSURLSessionDataTask *task = [session uploadTaskWithRequest:request fromFile:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSString *result = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",result);
}];
[task resume];
}