美文网首页
iOS multipart/form-data请求方式

iOS multipart/form-data请求方式

作者: 小心韩国人 | 来源:发表于2021-02-24 17:00 被阅读0次

    最近项目中有一个接口比较奇特,之前从来没有见过这种请求方式.需求是搜集日志,写到本地文件夹中,然后把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请求方式

          本文链接:https://www.haomeiwen.com/subject/eipsfltx.html