erlang响应http请求的十进制而不是字母

时间:2015-04-10 04:39:14

标签: rest http post erlang cowboy

我开始使用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 - 标题   “内容类型:文本/ 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表中十进制字符的值。但我想知道为什么请求的答案以数字而不是字母显示。我做错了吗?

提前谢谢

2 个答案:

答案 0 :(得分:4)

我之前没有使用过Leptus,但是,让我们看一下来自Github上的README的示例REST端点(https://github.com/s1n4/leptus):

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}.

如果您发布{json, Term}元组,它会自动将您的Erlang字词转换为JSON。因此,不是手动制作JSON,而是使用:

post("/myRequest", Req, State) ->
  Json = [{<<"test">>, <<"hello">>}],
  {200, {json, Json}, State}.

Leptus似乎还希望您的字符串和JSON键以及JSON字符串值作为二进制文件传递。因此,如果您想返回一个简单的输出字符串,您将使用以下内容:

post("/myRequest", Req, State) ->
  {200, <<"hello">>, State}.

通常,库将使用二进制文件而不是标准的Erlang字符串,因为二进制文件比Erlang字符串列表更有效。

答案 1 :(得分:3)

Erlang字符串是整数列表,所以你得到的正是你应该的(实际上,这种数据可能是二进制字符串或列表字符串)。在shell中查看响应的奇怪之处在于shell认为是格式化输出的合适方式:作为字符串或列表。如果有任何ASCII“控制”字符或大于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