iOS multipart/form-data请求方式

最近项目中有一个接口比较奇特,之前从来没有见过这种请求方式.需求是搜集日志,写到本地文件夹中,然后把log文件上传到服务器.
接口是POST请求方式,但是既需要GET参数,同时也需要POST参数.
GET参数很简单,直接接把参数拼接到URL后面就好了.难就难在multipart/form-data这种表单的传参方式,很是繁琐,错一点点就请求不成功,调试了一天多才解决.

这个接口仔细需要设置两个地方:

  1. 请求头
  • 需要把 Content-Type 的值设置成 multipart/form-data ,并且还要包含一个 boundary ,这个 boundary 是分隔符的意思,随便敲一串复杂的字符串即可.
    请求头的Content-Type正确设置后应该是这个样子:
    请求头的 Content-Type

这里有个细节千万要注意:请求头 Content-Type 中的 boundary 一定要加 " " ,我就是这里没加" "一直请求失败,也不知道哪里问题,浪费了很多时间.

所以我们在代码中要保留boundary的引号:

NSString *boundary = @"\"ajfiojsaodfioasjfokjaskdfklasjfkljas8i9q\"";
  1. 请求体
  • 请求体中就是我们要上传给服务器的文件数据,请求体有着苛刻的数据格式规范,必须严格遵守,否则错一点就会导致请求失败.

我先截一张正确的格式,然后把需要注意的点列举出来:


请求体正确配置
  • 注意点:
  1. 请求体是以 --boundray 开头结尾,这里的 boundray 不要加引号,所以在代码中需要单独准备不保留引号的 boundrary:
NSString *boundary2 = @"ajfiojsaodfioasjfokjaskdfklasjfkljas8i9q";
  1. 请求体中也需要设置 Content-Type ,因为我这里上传的是文件,所以 Content-Type 设置的是 application/octet-stream.

  2. 设置 Content-Disposition 中的 name="file" 是后台服务器要求的,必须和服务器一致, filename="**.log" 是上传的文件名,自己可以随便起.

  3. 其他的就是要注意\r\n回车换行,代码如下:

NSString *filePair = [NSString stringWithFormat:@"--%@\r\nContent-Type: %@\r\nContent-Disposition: form-data; name=%@; filename=%@\r\n\r\n",boundary2,contentType,fileKey,filename];

因为在调试这个接口的时候的确是花费了很多时间,所以抽时间记录一下.

你可能感兴趣的:(iOS multipart/form-data请求方式)