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