【问题标题】:Axios in React app. Posting image with form data sends request with empty bodyReact 应用程序中的 Axios。使用表单数据发布图像发送带有空正文的请求
【发布时间】:2020-06-26 11:54:13
【问题描述】:

我正在尝试将图像文件发送到我的后端 API。 Last 适用于 Postman。问题不在于图像,我无法使用 axios 和表单数据发送任何请求,没有仪表我是否附加图像。

使用 fetch 一切正常。花了一些时间才明白,fetch 不需要任何内容​​类型,最后自动生成为multipart/form-data,右边界。

编写的 axios 应该和 fetch 一样,但它不会生成或更改其内容类型。当然,传递标头'content-type' : 'multipart/form-data 并不能解决问题。当我不设置内容类型时,它只使用application/json。我在文档中找不到类似的东西。随处可见,axios 应该自动创建内容类型标头。

我的 axios 版本是0.18.0。 这是代码,再简单不过了=)

axios
    .post(url, payload)

【问题讨论】:

    标签: reactjs header axios


    【解决方案1】:

    #######更新#######

    原来问题出在 axios 拦截器上。如果您不使用拦截器,您将不会遇到此问题。因此,当我创建新实例并删除所有标题时,没有调用任何拦截器,这就是我的代码工作的原因。但是让我带来更多细节来帮助其他人避免这种痛苦。拦截器有transformRequest函数,这部分代码存在

    if (utils.isObject(data)) {
      setContentTypeIfUnset(headers, 'application/json;charset=utf-8');
      return JSON.stringify(data);
    }
    

    setContentTypeIfUnset 函数在哪里

    function setContentTypeIfUnset(headers, value) {
        if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {
            headers['Content-Type'] = value;
        }
    }
    

    因此,如果您的对象具有未定义的标头,您也会通过这种情况。但就我而言,即使在删除所有标题之后,我也必须将一些标题传递给我的应用程序。在设置它时,拦截器调用 transfromRequest 函数,该函数将该标头添加到我的 formdata 请求中。 我希望在未来的版本中 axios 能解决这个问题。

    #######老答案#######

    正如我所猜测的,我的项目中的 axios 以某种方式为标题内容类型设置了默认值,甚至将其设置为 'content-type' : undefined 并没有覆盖该值。 这是解决方案

    let axiosInstance = axios.create();
    
    delete axiosInstance.defaults.headers;
    

    然后使用那个实例。

    花了一整天的时间才找到这个解决方案。

    【讨论】:

      【解决方案2】:
             const formData = new FormData();
             
             formData.append('image', image); // your image file
             formData.append('description','this is optional description');
      
              Axios.post(`your url`, {body:formData}, {
              headers: {
                  'content-type': 'multipart/form-data'
              }
          })
      
      

      你能试试这段代码吗?

      【讨论】:

        【解决方案3】:

        你可以这样试试:

        axios({
            method: 'post',
            url: 'myurl',
            data: bodyFormData,
            headers: {'Content-Type': 'multipart/form-data' }
            })
            .then(function (response) {
                //handle success
                console.log(response);
            })
            .catch(function (response) {
                //handle error
                console.log(response);
            });
        

        【讨论】:

        • 感谢您的尝试,但没有成功。相同的空体。
        • 您能否发布您正在发送的实际网址和有效负载,或者可能是工作正常的邮递员请求
        • 我可以,但它只是一些带有表单数据的 url,其中只包含一个图像。它不会有帮助。我还提到了与获取请求相同的逻辑。内容类型标头存在一些问题。正如我现在看到的,axios 以某种方式设置了它的默认内容类型,这就是代码不起作用的原因。我只需要弄清楚他是如何设置标题的以及在哪里设置的。
        猜你喜欢
        • 2021-11-17
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 2022-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-31
        相关资源
        最近更新 更多