1

我已经通过 bs-json 编码了一个对象,并希望使用 bs-axios 通过 post 将其作为数据发送。

  33 │ let createTest = (p: Data.toBuyListItem) => inst->Instance.postData("/
       test", p |> Data.encodeToBuyListItem);
...
  This has type:
    Js.Json.t (defined as Js.Json.t)
  But somewhere wanted:
    Js.t('a)

p |> Data.encodeToBuyListItem是红色的。如何将该Js.Json.t值用作发布请求的数据?

编辑:

好吧,这行得通:

let createTest = (p: Data.toBuyListItem) => inst->Instance.postData("/test", [%raw "p"]);

但我更喜欢非hacky解决方案(最好使用bs-json,因为我正在使用它来解码JSON)......

4

1 回答 1

1

没有办法安全地将 a 转换Js.Json.tJs.t,因为后者表示 JavaScript 对象,而 JSON 不仅仅表示对象。但bs-axios似乎无论如何都会把安全扔出窗外,所以你可以不安全地施放它:

external jsonToObjects : Js.Json.t => Js.t({..}) = "%identity";

%identity是一种通用机制,可用于在任何两种类型之间进行强制转换,因此在键入时这是不安全的。你基本上是在说“当我交换这些东西的时候把目光移开,相信我,我知道我在做什么”。所以请确保你这样做。

另一种选择是Js.t直接创建一个对象。Reason 有内置的语法,所以很简单:

let obj = {
  "data": someData
};

someData这里可以是任何值,甚至是一个Js.Json.t值,但这也意味着您可以传入不可序列化的值,这Js.Json.t可以保护您免受攻击。

鉴于bs-axiosAPI 本质上是不安全的,这里有一个小的安全折衷,但我认为无论哪个最简单都可以。

于 2020-02-09T15:45:05.343 回答