如何使用bs-fetch传递查询字符串参数?

时间:2018-05-17 05:12:47

标签: fetch-api reason bucklescript

将查询字符串参数传递给bs-fetch的正确方法是什么?

目前,我有:

Fetch.fetch("https://example.com/api?param1=value1&param2=value2")

显然,对于较大的参数列表,这是不可持续的。

有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

我认为没有内置的东西。 只需创建自己的查询构建器功能,就像这样

let payload = Js.Dict.empty();

Js.Dict.set(payload, "email", Js.Json.string("email@email.co"));

Js.Dict.set(payload, "password", Js.Json.string("secret"));

let query =
  Js.Dict.keys(payload)
  |> Array.fold_left(
       (query, key) =>
         switch (Js.Dict.get(payload, key)) {
         | Some(value) =>
           query ++ key ++ "=" ++ Js.Json.stringify(value) ++ "&"
         | _ => query
         },
       "?"
     );

这是游乐场的link

答案 1 :(得分:2)

re:fetch通过

支持查询参数
request("https://example.com/api",
  ~queryParams=[
    ("param1", "value1"),
    ("param2", "value2")
  ])
|> fetch;

request("https://example.com/api")
|> Request.param("param1", "value1")
|> Request.param("param2", "value2")
|> fetch;

请注意该库是实验性的。或者,您可以轻扫the query builder code,这已经过了至少一点战斗测试(当有一个空列表时,@ monssef' s实现了一个微妙的错误,并且它也没有做正确的编码):

[@bs.val] external encodeURIComponent : string => string = "";

let _buildUrl = (url, params) => {
  let encodeParam = ((key, value)) =>
    encodeURIComponent(key) ++ "=" ++ encodeURIComponent(value);

  let params =
      params |> List.map(encodeParam)
             |> String.joinWith("&");

  switch params {
  | "" => url
  | _ => {j|$url?$params|j}
  };
};