iOS 網路請求之multipart/form-data

小大發表於2017-12-21

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需要與伺服器對接,以服務端要求為準。

相關文章