Rest erlang响应http请求(十进制而非字母)

Rest erlang响应http请求(十进制而非字母),rest,http,post,erlang,cowboy,Rest,Http,Post,Erlang,Cowboy,我开始将Erlang与Cowboy和Leptus一起使用来创建RESTAPI 所以我尝试了一些简单的方法: myapp_handler.erl 启动服务器后,我尝试通过curl运行POST请求: curl-X POST——标题 “内容类型: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,3

我开始将Erlang与Cowboy和Leptus一起使用来创建RESTAPI

所以我尝试了一些简单的方法:

myapp_handler.erl

启动服务器后,我尝试通过curl运行POST请求:

curl-X POST——标题 “内容类型: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表中十进制字符的值。但是我想知道为什么请求的答案显示为数字而不是字母。我做错什么了吗


提前感谢您

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

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

我以前还没有使用过LPTUS,但是,让我们看看GITHUB(Real:

)上的自述文件的一个示例REST端点。 Leptus似乎还希望字符串、JSON键和JSON字符串值作为二进制文件传入。因此,如果要返回一个简单的输出字符串,可以使用以下命令:

post("/myRequest", Req, State) ->
  {200, <<"hello">>, State}.
post(“/myRequest”,请求,状态)->
{200,州}。

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

< P>我以前还没有使用过LePTUS,但是,让我们从GITHUB(Real:

)上的自述文件中查看一个示例REST端点。 Leptus似乎还希望字符串、JSON键和JSON字符串值作为二进制文件传入。因此,如果要返回一个简单的输出字符串,可以使用以下命令:

post("/myRequest", Req, State) ->
  {200, <<"hello">>, State}.
post(“/myRequest”,请求,状态)->
{200,州}。

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

感谢您的回答,它是有效的!我还有一个问题,当你想在JSON文本中放置一个对象数组时?我怎样才能做到这一点?例如:
Json=[{,[{,{,},{,},{,},{,}]}],
但它似乎不起作用。有什么建议吗?可能是将PropList转换为JSON对象。请尝试
Json=[{,}],{,},{,{,},{,},{,}]
。我在使用您的代码执行路由时出错:
Ranch listener leptus\u http已使用牛仔协议启动连接进程:在退出时启动链接/4,原因为:{nocatch,{error,invalid_ejson},[{jiffy,encode,2,[{文件,“src/jiffy.erl”},{line,34},{leptus_handler,prepare_headers_body,2,[{file,“src/leptus_handler.erl”},{line,411}},{leptus_handler,handle_response,5,[{file,“src/leptus_handler.erl”},{line,390},{leptus(handler.erl,升级,4,[{file,“src/leptus_handler.erl”},{line,82},{line,82},{cowboy牛仔协议,执行,4,{file,},{leptus(牛仔协议,{
有什么建议吗?看起来leptus正在使用jiffy进行编码()。jiffy似乎希望Erlang JSON等价物是一个包含proplist(
{proplist()}
)的单元素元组。请尝试以下操作:
{[{[{,}]},{[{,},{,},{,},{,}]}
。根据Erlang邮件列表的讨论,单元素元组似乎用于简化模式匹配Erlang JSON表示与列表。以下是讨论的链接:。感谢您的回答,它是有效的!我还有一个问题,当您想将对象数组放在JSON文本中时?我如何实现这一点示例:
Json=[{,[{,},{,},{,},{,},{,}]}],
但它似乎不起作用。有什么建议吗?可能是将PropList转换为Json对象。请尝试
Json=[{,},{,},{,},{,},{,}]]
。我在用你的代码执行我的路由时出错:
Ranch listener leptus_http已使用cowboy_协议启动连接过程:在出口处启动链接/4,原因:{{nocatch,{error,invalid_ejson},[{jiffy,encode,2,[{file,“src/jiffy.erl”},{line,34},{leptus"处理程序,准备头文件{body,2,[{file,“src/leptus"处理程序”},{line,411}]},{leptus_handler,handle_response,5,[{file,“src/leptus_handler.erl”},{line,390},{leptus_handler,upgrade,4,[{file,“src/leptus_handler.erl},{line,82}]},{cowboy(protocol protocol,execute,4,[{file,“src/cowboy(protocol protocol protocol.leptor.erl},{line,529}}}}}有任何建议吗?它看起来像是用jiffy(})编码的.Jiffy似乎希望Erlang JSON等价物是包含proplist(
{proplist()}
)的单元素元组。请尝试以下操作:
{[{,}]},{[{,},