erlang 以十进制而不是字母形式响应 http 请求
erlang response http request in decimal instead of letter
我开始将 Erlang 与 Cowboy 和 Leptus 结合使用来创建 REST API。
所以我只是尝试了一些简单的方法:
myapp_handler.erl
-module(myapp_handler).
-compile({parse_transform, leptus_pt}).
-export([init/3]).
-export([cross_domains/3]).
-export([terminate/4]).
-export([post/3]).
%% Cross Domain Origin
%% It accepts any host for cross-domain requests
cross_domains(_Route, _Req, State) ->
{['_'], State}.
%% Start
init(_Route, _Req, State) ->
{ok, State}.
post("/myRequest", Req, State) ->
Json = "[
{
\"test\": \"hello\"
}
]",
{200, {json, Json}, State}.
%% End
terminate(_Reason, _Route, _Req, _State) ->
ok.
启动服务器后,我尝试通过 curl 运行 POST 请求:
curl -X POST http://127.0.0.1:8080/myRequest --header
"Content-Type:text/json"
请求的答案是:
[91,10,32,32,32,32,123,10,32,32,32,32,32,32,34,116,101,115,116,34,58,32,34,104,101,108,108,111,34,10,32,32,32,32,125,10,32,32,93]
所有的数字都是来自ascii table的十进制字符值。但我想知道为什么请求的答案以数字而不是字母显示。我是不是做错了什么?
提前致谢
Erlang 字符串是整数列表,所以你得到的正是你应该得到的(好吧,这种数据实际上可能是二进制字符串或列表字符串)。在 shell 中查看响应的奇怪之处在于 shell 认为格式化输出的适当方式:作为字符串或作为列表。如果有任何 ASCII "control" 字符,或大于 127 的值,并且它认为它不在 UTF-8 语言环境中,那么它只会打印整数。
通常你可以很确定地得到字符,如果你这样做:
Response = your_function(YourArgs),
io:format("Response:~ts~n", [Response]).
而不是仅仅依靠 shell 以默认方式将输出格式化为 stdio(如果环境有任何不确定性,它总是回退到整数列表)。
正在将您的输出粘贴到我的 shell...
1> Z = [91,10,32,32,32,32,123,10,32,32,32,32,32,32,34,116,101,115,116,34,58,32,34,104,101,108,108,111,34,10,32,32,32,32,125,10,32,32,93].
"[\n {\n \"test\": \"hello\"\n }\n ]"
2> io:format("Using ~~ts:~n~ts~n~n"
2> "Using ~~tw:~n~tw~n~n"
2> "Using ~~tp:~n~tp~n~n",
2> [Z, Z, Z]).
Using ~ts:
[
{
"test": "hello"
}
]
Using ~tw:
[91,10,32,32,32,32,123,10,32,32,32,32,32,32,34,116,101,115,116,34,58,32,34,104,101,108,108,111,34,10,32,32,32,32,125,10,32,32,93]
Using ~tp:
"[\n {\n \"test\": \"hello\"\n }\n ]"
ok
我以前没有使用过 Leptus,但是,让我们看一下他们在 Github (https://github.com/s1n4/leptus):
上的 README 中的示例 REST 端点
get("/", _Req, State) ->
{<<"Hello, leptus!">>, State};
get("/hi/:name", Req, State) ->
Status = ok,
Name = leptus_req:param(Req, name),
Body = [{<<"say">>, <<"Hi">>}, {<<"to">>, Name}],
{Status, {json, Body}, State}.
看来,如果您 post 一个 {json, Term}
的元组,它会自动将您的 Erlang 术语转换为 JSON。因此,与其手动制作 JSON,不如使用:
post("/myRequest", Req, State) ->
Json = [{<<"test">>, <<"hello">>}],
{200, {json, Json}, State}.
Leptus 似乎还希望您的字符串和 JSON 键以及 JSON 字符串值作为二进制文件传入。因此,如果您想 return 一个简单的输出字符串,您可以使用以下内容:
post("/myRequest", Req, State) ->
{200, <<"hello">>, State}.
通常库会使用二进制文件而不是标准的 Erlang 字符串,因为二进制文件比 Erlang 字符串列表更有效。
我开始将 Erlang 与 Cowboy 和 Leptus 结合使用来创建 REST API。
所以我只是尝试了一些简单的方法:
myapp_handler.erl
-module(myapp_handler).
-compile({parse_transform, leptus_pt}).
-export([init/3]).
-export([cross_domains/3]).
-export([terminate/4]).
-export([post/3]).
%% Cross Domain Origin
%% It accepts any host for cross-domain requests
cross_domains(_Route, _Req, State) ->
{['_'], State}.
%% Start
init(_Route, _Req, State) ->
{ok, State}.
post("/myRequest", Req, State) ->
Json = "[
{
\"test\": \"hello\"
}
]",
{200, {json, Json}, State}.
%% End
terminate(_Reason, _Route, _Req, _State) ->
ok.
启动服务器后,我尝试通过 curl 运行 POST 请求:
curl -X POST http://127.0.0.1:8080/myRequest --header "Content-Type:text/json"
请求的答案是:
[91,10,32,32,32,32,123,10,32,32,32,32,32,32,34,116,101,115,116,34,58,32,34,104,101,108,108,111,34,10,32,32,32,32,125,10,32,32,93]
所有的数字都是来自ascii table的十进制字符值。但我想知道为什么请求的答案以数字而不是字母显示。我是不是做错了什么?
提前致谢
Erlang 字符串是整数列表,所以你得到的正是你应该得到的(好吧,这种数据实际上可能是二进制字符串或列表字符串)。在 shell 中查看响应的奇怪之处在于 shell 认为格式化输出的适当方式:作为字符串或作为列表。如果有任何 ASCII "control" 字符,或大于 127 的值,并且它认为它不在 UTF-8 语言环境中,那么它只会打印整数。
通常你可以很确定地得到字符,如果你这样做:
Response = your_function(YourArgs),
io:format("Response:~ts~n", [Response]).
而不是仅仅依靠 shell 以默认方式将输出格式化为 stdio(如果环境有任何不确定性,它总是回退到整数列表)。
正在将您的输出粘贴到我的 shell...
1> Z = [91,10,32,32,32,32,123,10,32,32,32,32,32,32,34,116,101,115,116,34,58,32,34,104,101,108,108,111,34,10,32,32,32,32,125,10,32,32,93].
"[\n {\n \"test\": \"hello\"\n }\n ]"
2> io:format("Using ~~ts:~n~ts~n~n"
2> "Using ~~tw:~n~tw~n~n"
2> "Using ~~tp:~n~tp~n~n",
2> [Z, Z, Z]).
Using ~ts:
[
{
"test": "hello"
}
]
Using ~tw:
[91,10,32,32,32,32,123,10,32,32,32,32,32,32,34,116,101,115,116,34,58,32,34,104,101,108,108,111,34,10,32,32,32,32,125,10,32,32,93]
Using ~tp:
"[\n {\n \"test\": \"hello\"\n }\n ]"
ok
我以前没有使用过 Leptus,但是,让我们看一下他们在 Github (https://github.com/s1n4/leptus):
上的 README 中的示例 REST 端点get("/", _Req, State) ->
{<<"Hello, leptus!">>, State};
get("/hi/:name", Req, State) ->
Status = ok,
Name = leptus_req:param(Req, name),
Body = [{<<"say">>, <<"Hi">>}, {<<"to">>, Name}],
{Status, {json, Body}, State}.
看来,如果您 post 一个 {json, Term}
的元组,它会自动将您的 Erlang 术语转换为 JSON。因此,与其手动制作 JSON,不如使用:
post("/myRequest", Req, State) ->
Json = [{<<"test">>, <<"hello">>}],
{200, {json, Json}, State}.
Leptus 似乎还希望您的字符串和 JSON 键以及 JSON 字符串值作为二进制文件传入。因此,如果您想 return 一个简单的输出字符串,您可以使用以下内容:
post("/myRequest", Req, State) ->
{200, <<"hello">>, State}.
通常库会使用二进制文件而不是标准的 Erlang 字符串,因为二进制文件比 Erlang 字符串列表更有效。