Как передать параметры строки запроса с помощью bs-fetch?

Как правильно передавать параметры строки запроса в bs-fetch?

В настоящее время у меня есть:

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

Очевидно, это неприемлемо для больших списков параметров.

Есть лучший способ сделать это?


person csb    schedule 17.05.2018    source источник


Ответы (2)


re: fetch поддерживает параметры запроса либо

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

or

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

Однако помните, что библиотека является экспериментальной. В качестве альтернативы вы можете просто смахнуть код конструктора запросов, который хоть немного прошел боевые испытания (есть небольшая ошибка в реализации @monssef, когда есть пустой список, и он также не выполняет правильную кодировку):

[@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}
  };
};
person glennsl    schedule 19.05.2018

Я не думаю, что для этого есть что-то встроенное. просто создайте свою собственную функцию построителя запросов, что-то вроде этого

let payload = Js.Dict.empty();

Js.Dict.set(payload, "email", Js.Json.string("[email protected]"));

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
         },
       "?"
     );

вот ссылка на детскую площадку.

person monssef    schedule 18.05.2018