multipart/form-data請求
multipart/form-data到底是什麼意思,在這裡就不多說了,網上隨便一搜就有一大堆解釋,所以,還是直接看程式碼吧。在AFN等一些網路框架不能滿足自己需求時,往往需要自己從最原始的地方去找方法。
表單請求頭:
Content-Type: multipart/form-data; boundary=${boundary} //bound為分隔符,儘量複雜點,本文中的分隔符為uuid
表單請求體(這裡上傳的是圖片檔案,現將image轉成data):
NSString*boundary = [[NSUUID UUID]UUIDString];//隨機字串,用作分割符
NSString*BoundarySingle=[[NSString alloc]initWithFormat:@"--%@",boundary];
//結束符--tsunamierFileFlag--
NSString*endBoundary=[[NSString alloc]initWithFormat:@"\r\n%@--",BoundarySingle];
NSMutableData*data = [[NSMutableData alloc]init];
NSMutableString*str = [[NSMutableString alloc]init];
for(inti =0; i < [requestHeader.allKeyscount]; i++)
{
[str appendFormat:@"%@\r\n",BoundarySingle];
[str appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n",[requestHeader.allKeysobjectAtIndex:i]];//這個是引數名
[str appendFormat:@"Content-Type: text/plain;charset=UTF-8\r\n"];
[str appendFormat:@"Content-Transfer-Encoding:8bit\r\n\r\n"];
[str appendFormat:@"%@\r\n", [requestHeaderobjectForKey:[requestHeader.allKeysobjectAtIndex:i]]]; // 新增引數值
}
//到此為止是將除去檔案的其他所有的引數拼接好,下面開始拼接檔案引數
[str appendFormat:@"%@\r\n",BoundarySingle];
[str appendFormat:@"Content-Disposition: form-data; name=\"noticefile\";filename=\"%@.jpg\"\r\n",boundary]; //noticefile為檔案引數名
[str appendFormat:@"Content-Type:\r\n"];
[str appendFormat:@"Content-Transfer-Encoding:binary\r\n\r\n"];
[data appendData:[strdataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:fileData]; //fileData為檔案轉化的data
[data appendData:[endBoundarydataUsingEncoding:NSUTF8StringEncoding]]; //到此,所有的請求體拼接完成
傳送請求:
NSMutableURLRequest*request = [[NSMutableURLRequest alloc]initWithURL:[NSURLURLWithString:[selfsendMessageUrl]]];
NSString*ContentType=[[NSString alloc]initWithFormat:@"multipart/form-data; boundary=%@;charset=UTF-8",boundary];
[request setValue:ContentTypeforHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:data];
[request setHTTPMethod:@"POST"];
request.timeoutInterval=40;
NSURLSession*session = [NSURLSessionsharedSession];
NSURLSessionDataTask*dataTask=[session dataTaskWithRequest:requestcompletionHandler:^(NSURLResponse*_Nonnullresponse,id_NullableresponseObject,NSError*_Nullableerror) {
}];
[dataTaskresume];
在multipart/form-data請求中要注意普通引數與檔案引數的Encoding需要與伺服器對接,以服務端要求為準。