Как передать параметры строки запроса с помощью bs-fetch? - PullRequest
0 голосов
/ 17 мая 2018

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

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;

Однако остерегайтесь того, что библиотека является экспериментальной.В качестве альтернативы, вы могли бы просто провести код построителя запросов , который хотя бы чуть-чуть был проверен в бою (в реализации @ 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}
  };
};
0 голосов
/ 18 мая 2018

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

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

вот ссылка на игровую площадку.

...