最近项目中有一个接口比较奇特,之前从来没有见过这种请求方式.需求是搜集日志,写到本地文件夹中,然后把log文件
上传到服务器.
接口是POST
请求方式,但是既需要GET
参数,同时也需要POST
参数.
GET
参数很简单,直接接把参数拼接到URL
后面就好了.难就难在multipart/form-data
这种表单的传参方式,很是繁琐,错一点点就请求不成功,调试了一天多才解决.
这个接口仔细需要设置两个地方:
- 请求头
-
需要把 Content-Type 的值设置成 multipart/form-data ,并且还要包含一个 boundary ,这个 boundary 是分隔符的意思,随便敲一串复杂的字符串即可.
请求头的Content-Type
正确设置后应该是这个样子:
这里有个细节千万要注意:请求头 Content-Type 中的 boundary 一定要加 " " ,
我就是这里没加" "
一直请求失败,也不知道哪里问题,浪费了很多时间.
所以我们在代码中要保留boundary
的引号:
NSString *boundary = @"\"ajfiojsaodfioasjfokjaskdfklasjfkljas8i9q\"";
- 请求体
请求体中就是我们要上传给服务器的文件数据,请求体有着苛刻的数据格式规范,必须严格遵守,否则错一点就会导致请求失败.
我先截一张正确的格式,然后把需要注意的点列举出来:
- 注意点:
请求体是以 --boundray 开头结尾,这里的 boundray 不要加引号,所以在代码中需要单独准备不保留引号的 boundrary:
NSString *boundary2 = @"ajfiojsaodfioasjfokjaskdfklasjfkljas8i9q";
请求体中也需要设置 Content-Type ,因为我这里上传的是文件,所以 Content-Type 设置的是 application/octet-stream
.设置 Content-Disposition 中的 name="file" 是后台服务器要求的,必须和服务器一致, filename="**.log" 是上传的文件名,自己可以随便起.
其他的就是要注意
\r\n
回车换行,代码如下:
NSString *filePair = [NSString stringWithFormat:@"--%@\r\nContent-Type: %@\r\nContent-Disposition: form-data; name=%@; filename=%@\r\n\r\n",boundary2,contentType,fileKey,filename];
因为在调试这个接口的时候的确是花费了很多时间,所以抽时间记录一下.