我如何使用Fetch API发布数据和参数(如在Axios中)

时间:2018-08-20 16:35:25

标签: javascript fetch axios

以下面的Axios示例为例:

axios.post(this.reportURL, reportData, {
  params: {
    param1: paramValue1,
    param2: paramValue2
  },
});

如何使用fetch API做同样的事情?我看到参数是这样完成的:

fetch(this.reportURL, {
  method: "POST",
  body: "param1=paramValue1&param2=paramValue2",
  headers: 
    {
      "Content-Type": "application/x-www-form-urlencoded"
    }

})

由于正文密钥用于存储参数,我是否需要序列化整个reportData对象并将其连接到现有参数?

我不明白为什么Fetch API使用body键作为参数。

此外,这不是我自己的API,因此我无法更改预期的POST请求。

5 个答案:

答案 0 :(得分:2)

令人沮丧的是,fetch()并没有真正提供“干净”的方式来提供查询字符串URL参数。您只需要将它们放在直接获取的URL中即可。您可以在GitHub上{@ 3}上了解这一点。

有几种方法可以模拟它:

const url = new URL("http://www.example.com");

const params = {
  foo: "bar",
  fizz: "buzz"
};

const data = {
  more: "data",
  that: "I",
  want: "to",
  send: "please"
};

Object.entries(params).forEach(([k, v]) => url.searchParams.append(k, v));
console.log(url);

fetch(url, { // URL as http://www.example.com/?foo=bar&fizz=buzz
  method: "POST",
  body: JSON.stringify(data) // The actual body
});

由于您的问题中也有application/x-www-form-urlencoded,因此您可能还想看看这个问题:How to pass url query params? #256

答案 1 :(得分:0)

如果您需要根据哈希值构造查询参数字符串,并且在网站上使用jQuery,则可以执行以下操作:

var url = "http://www.abx.com?" + $.param({foo: "bar", baz: "kuuq"}) fetch(url)

以下是fetch标准在其文档中建议的内容(另请参见whatwg / fetch#56中的讨论):

var url = new URL("https://geo.example.org/api"), params = {lat:35.696233, long:139.570431} Object.keys(params).forEach(key => url.searchParams.append(key, params[key])) fetch(url).then(...)

这要求浏览器实现url.searchParams。旧版浏览器可能需要使用polyfill。

快速阅读此内容,但希望对您有所帮助

Src:https://github.com/github/fetch/issues/256

答案 2 :(得分:0)

你可以做     body: JSON.stringify({ param1: paramValue1, param2: paramValue2 })

答案 3 :(得分:0)

看起来已经接近了,但是在第二个示例中,在发出POST请求时,参数通常以JSON的形式出现在请求的正文中:

fetch(this.reportURL, {
  method: "POST",
  body: JSON.stringify({
    param1: paramValue1,
    param2: paramValue2
  })    
})

答案 4 :(得分:0)

您可以extract reportData中的片段到另一个对象中,并通过JSON将其传递给fetch

Fetch还支持FormData,但这与我已经提到的对象方法没什么不同。

作为per the docs,您可以指定 body 如下:

  1. ArrayBuffer
  2. ArrayBufferView(Uint8Array和朋友)
  3. blob /文件
  4. 字符串
  5. URLSearchParams
  6. FormData