iOS 网络请求之multipart/form-data

3,241 阅读1分钟

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需要与服务器对接,以服务端要求为准。