【问题标题】:How to create a JSON Object and pass it in a REST API call?如何创建 JSON 对象并将其传递给 REST API 调用?
【发布时间】:2019-09-12 14:26:31
【问题描述】:

我是 Erlang 的新手,我的疑问是如何在 Erlang 中创建 JSON 对象并在 REST API 调用中传递该对象。看了这么多帖子,都没有得到满意的答案。

编辑

我在这里调用 API:

offline_message(From, To, #message{type = Type, body = Body}) ->
Type = xml:get_text(Type),
Body = xml:get_text(Body),
Token = gen_mod:get_module_opt(To#jid.lserver, ?MODULE, auth_token, fun(S) -> iolist_to_binary(S) end, list_to_binary("")),
PostUrl = gen_mod:get_module_opt(To#jid.lserver, ?MODULE, post_url, fun(S) -> iolist_to_binary(S) end, list_to_binary("")),
to = To#jid.luser
from = From#jid.luser
if
    (Type == <<"chat">>) and (Body /= <<"">>) ->
        Sep = "&",
        Post = {
            "token":binary_to_list(Token),
            "from":binary_to_list(from),
            "to":binary_to_list(to),
            "body":binary_to_list(Body)
        },
        ?INFO_MSG("Sending post request to ~s with body \"~s\"", [PostUrl, Post]),
        httpc:request(post, {binary_to_list(PostUrl), [], "application/json", binary_to_list(Post)},[],[]),
        ok;
    true ->
        ok
end.

关于 JSON 字符串,这里一切正常吗?我正在尝试修改这个module

【问题讨论】:

    标签: erlang ejabberd-module


    【解决方案1】:

    如何在 Erlang 中创建 JSON 对象

    erlang 中没有对象之类的东西,所以简单的答案是:你不能。然而,你通过电线发送的东西只是字符串,你当然可以使用 erlang 创建字符串。

    为了让事情变得更简单,您可以使用像 jsx 这样的 erlang 模块来创建要在请求中发送的 json 格式的字符串。但是,为了使用 erlang 模块,您必须了解一些关于 rebar3 的知识,它是 erlang 的包安装程序(参见 What is the easiest way for beginners to install a module?)。

    请记住,http 请求只是一个以某种方式格式化的字符串。一个 http 请求以这样的一行开头:

    POST /some/path HTTP/1.1
    

    然后是一些叫做headers的文本行,看起来像:

    User-Agent: Mozilla-yah-yah-bah
    Content-Type: application/json
    Content-Length: 103
    

    然后是几个换行符,后面跟着一些额外的文本,称为post body,可以有几种不同的格式(格式应该在Content-Type header 中声明) :

        Format                 Content-Type
        ------                 -----------
       "x=1&y=2"               application/x-www-form-urlencoded
       "{x:1, y:2}"            application/json
       "more complex string"   multipart/form-data
    

    为了更轻松地组合 http 请求并将其发送到服务器,erlang 有一个名为 inets 的内置 http 客户端,您可以在文档 here 中了解它。有关使用 inets 的示例,请参阅 here。因为inets使用起来有点麻烦,或者你可以使用第三方http客户端,比如hackney。不过,您需要再次安装 hackneyrebar3

    发送请求后,由服务器负责解密请求并采取必要的措施。

    【讨论】:

    • 嗨,有什么方法可以在不使用任何模块的情况下创建 JSON 字符串,请检查我的问题我已更新我的问题
    • @VirendraVarma,当然。这是一个示例:"{\"a\": 1, \"b\": 2}"。真正的问题是 http 客户端需要什么类型的数据?在您发布的代码中,以Post = 开头的行不是用erlang 编写的。以前有什么?
    • @VirendraVarma,我查看了您发布的链接处的代码,应该为 Post 变量分配一个字符串列表,或者您也可以为 Post 分配一个包含一个字符串的列表。一般来说,erlang 的 io 模块并不关心它们是否得到一个包含整个字符串的列表,或者一个包含多个字符串段的列表。
    猜你喜欢
    • 2021-07-27
    • 2016-09-16
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 2012-03-16
    相关资源
    最近更新 更多