httpc 请求:错误的参数异常长度
httpc request: Bad argument exception length
我在向 Java servlet 发出 httpc 请求时遇到问题。
在我的本地系统上,代码运行良好,但如果我从 ejabberd 服务器的 erlang 文件执行调用,我会收到错误参数异常。
这是我本地系统的代码:
Body = "deviceToken=dy....[Very long FCM token]....b1&sender=epeued7o3z",
inets:start(),
httpc:request(post,
{
"http://192.168.2.110:8080/020/service", [],
"application/x-www-form-urlencoded",
Body
}, [], []).
我将代码复制到 ejabberd 服务器的 erlang 文件中,但出现此异常:
2017-11-24 18:05:40 =CRASH REPORT====
crasher:
initial call: httpc_handler:init/1
pid: <0.522.0>
registered_name: []
exception error: bad argument: [{erlang,length,[[100,101,118,105,99,101,84,111,107,101,110,61,<<"dy....[Very long FCM token]...Kn4b1">>,38,115,101,110,100,101,114,61|<<"epeued7o3z">>]],[]},{httpc_request,body_length,1,[{file,"httpc_request.erl"},{line,233}]},{httpc_request,post_data,4,[{file,"httpc_request.erl"},{line,208}]},{httpc_request,send,4,[{file,"httpc_request.erl"},{line,85}]},{httpc_handler,connect_and_send_first_request,3,[{file,"httpc_handler.erl"},{line,815}]},{httpc_handler,init,1,[{file,"httpc_handler.erl"},{line,238}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,247}]}]
ancestors: [httpc_handler_sup,httpc_sup,inets_sup,<0.439.0>]
message_queue_len: 0
messages: []
links: [<0.445.0>,#Port<0.14269>]
dictionary: []
trap_exit: true
status: running
heap_size: 610
stack_size: 27
reductions: 978
neighbours:
2017-11-24 18:05:40 =SUPERVISOR REPORT====
Supervisor: {local,httpc_handler_sup}
Context: child_terminated
Reason: {badarg,[{erlang,length,[[100,101,118,105,99,101,84,111,107,101,110,61,<<"dy...[Very long FCM token].....Kn4b1">>,38,115,101,110,100,101,114,61|<<"epeued7o3z">>]],[]},{httpc_request,body_length,1,[{file,"httpc_request.erl"},{line,233}]},{httpc_request,post_data,4,[{file,"httpc_request.erl"},{line,208}]},{httpc_request,send,4,[{file,"httpc_request.erl"},{line,85}]},{httpc_handler,connect_and_send_first_request,3,[{file,"httpc_handler.erl"},{line,815}]},{httpc_handler,init,1,[{file,"httpc_handler.erl"},{line,238}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,247}]}]}
Offender: [{pid,<0.522.0>},{id,undefined},{mfargs,{httpc_handler,start_link,undefined}},{restart_type,temporary},{shutdown,4000},{child_type,worker}]
正文长度错误/太长是对的吗,因为在我的本地程序上它运行良好?请求到servlet应该不是问题
提前致谢!
它正在崩溃,因为它试图调用 erlang:length/1
,它需要一个列表,在一个似乎是 iolist(嵌套列表和二进制文件的混合体)的值上。
您确定您的代码段准确显示了您的构建方式吗Body
?
exception error: bad argument:
[{erlang,length,[
[100,101,118,105,99,101,84,111,107,101,110,61,
<<"dy....[Very long FCM token]...Kn4b1">>,
38,115,101,110,100,101,114,61|<<"epeued7o3z">>]
] ^
|
This create an improper list that make the function length/1 fail.
您定义了一个不正确的列表,因为在 cons 运算符之后的最后一项:<<"epeued7o3z">>
是二进制,而不是列表。
你可以这样写:
[100,101,118,105,99,101,84,111,107,101,110,61,
<<"dy....[Very long FCM token]...Kn4b1">>,
38,115,101,110,100,101,114,61,
<<"epeued7o3z">>
]
或
[100,101,118,105,99,101,84,111,107,101,110,61,
<<"dy....[Very long FCM token]...Kn4b1">>,
38,115,101,110,100,101,114,61|"epeued7o3z"
]
调用length/1会returniolist的长度,注意长度是不同的,第一个list长度是22,而第二个是31。
如果你需要一个平面列表而不是 iolist,我不知道有什么函数可以直接生成它,但是你可以先将 iolist 转换为二进制,然后再将二进制转换为列表(以及长度现在是 65):
1> IoList = [100,101,118,105,99,101,84,111,107,101,110,61,<<"dy....[Very long FCM token]...Kn4b1">>,38,115,101,110,100,101,114,61,<<"epeued7o3z">>].
[100,101,118,105,99,101,84,111,107,101,110,61,
<<"dy....[Very long FCM token]...Kn4b1">>,38,115,101,110,
100,101,114,61,<<"epeued7o3z">>]
2> binary_to_list(iolist_to_binary(IoList)).
"deviceToken=dy....[Very long FCM token]...Kn4b1&sender=epeued7o3z"
我在向 Java servlet 发出 httpc 请求时遇到问题。 在我的本地系统上,代码运行良好,但如果我从 ejabberd 服务器的 erlang 文件执行调用,我会收到错误参数异常。
这是我本地系统的代码:
Body = "deviceToken=dy....[Very long FCM token]....b1&sender=epeued7o3z",
inets:start(),
httpc:request(post,
{
"http://192.168.2.110:8080/020/service", [],
"application/x-www-form-urlencoded",
Body
}, [], []).
我将代码复制到 ejabberd 服务器的 erlang 文件中,但出现此异常:
2017-11-24 18:05:40 =CRASH REPORT====
crasher:
initial call: httpc_handler:init/1
pid: <0.522.0>
registered_name: []
exception error: bad argument: [{erlang,length,[[100,101,118,105,99,101,84,111,107,101,110,61,<<"dy....[Very long FCM token]...Kn4b1">>,38,115,101,110,100,101,114,61|<<"epeued7o3z">>]],[]},{httpc_request,body_length,1,[{file,"httpc_request.erl"},{line,233}]},{httpc_request,post_data,4,[{file,"httpc_request.erl"},{line,208}]},{httpc_request,send,4,[{file,"httpc_request.erl"},{line,85}]},{httpc_handler,connect_and_send_first_request,3,[{file,"httpc_handler.erl"},{line,815}]},{httpc_handler,init,1,[{file,"httpc_handler.erl"},{line,238}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,247}]}]
ancestors: [httpc_handler_sup,httpc_sup,inets_sup,<0.439.0>]
message_queue_len: 0
messages: []
links: [<0.445.0>,#Port<0.14269>]
dictionary: []
trap_exit: true
status: running
heap_size: 610
stack_size: 27
reductions: 978
neighbours:
2017-11-24 18:05:40 =SUPERVISOR REPORT====
Supervisor: {local,httpc_handler_sup}
Context: child_terminated
Reason: {badarg,[{erlang,length,[[100,101,118,105,99,101,84,111,107,101,110,61,<<"dy...[Very long FCM token].....Kn4b1">>,38,115,101,110,100,101,114,61|<<"epeued7o3z">>]],[]},{httpc_request,body_length,1,[{file,"httpc_request.erl"},{line,233}]},{httpc_request,post_data,4,[{file,"httpc_request.erl"},{line,208}]},{httpc_request,send,4,[{file,"httpc_request.erl"},{line,85}]},{httpc_handler,connect_and_send_first_request,3,[{file,"httpc_handler.erl"},{line,815}]},{httpc_handler,init,1,[{file,"httpc_handler.erl"},{line,238}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,247}]}]}
Offender: [{pid,<0.522.0>},{id,undefined},{mfargs,{httpc_handler,start_link,undefined}},{restart_type,temporary},{shutdown,4000},{child_type,worker}]
正文长度错误/太长是对的吗,因为在我的本地程序上它运行良好?请求到servlet应该不是问题
提前致谢!
它正在崩溃,因为它试图调用 erlang:length/1
,它需要一个列表,在一个似乎是 iolist(嵌套列表和二进制文件的混合体)的值上。
您确定您的代码段准确显示了您的构建方式吗Body
?
exception error: bad argument:
[{erlang,length,[
[100,101,118,105,99,101,84,111,107,101,110,61,
<<"dy....[Very long FCM token]...Kn4b1">>,
38,115,101,110,100,101,114,61|<<"epeued7o3z">>]
] ^
|
This create an improper list that make the function length/1 fail.
您定义了一个不正确的列表,因为在 cons 运算符之后的最后一项:<<"epeued7o3z">>
是二进制,而不是列表。
你可以这样写:
[100,101,118,105,99,101,84,111,107,101,110,61,
<<"dy....[Very long FCM token]...Kn4b1">>,
38,115,101,110,100,101,114,61,
<<"epeued7o3z">>
]
或
[100,101,118,105,99,101,84,111,107,101,110,61,
<<"dy....[Very long FCM token]...Kn4b1">>,
38,115,101,110,100,101,114,61|"epeued7o3z"
]
调用length/1会returniolist的长度,注意长度是不同的,第一个list长度是22,而第二个是31。
如果你需要一个平面列表而不是 iolist,我不知道有什么函数可以直接生成它,但是你可以先将 iolist 转换为二进制,然后再将二进制转换为列表(以及长度现在是 65):
1> IoList = [100,101,118,105,99,101,84,111,107,101,110,61,<<"dy....[Very long FCM token]...Kn4b1">>,38,115,101,110,100,101,114,61,<<"epeued7o3z">>].
[100,101,118,105,99,101,84,111,107,101,110,61,
<<"dy....[Very long FCM token]...Kn4b1">>,38,115,101,110,
100,101,114,61,<<"epeued7o3z">>]
2> binary_to_list(iolist_to_binary(IoList)).
"deviceToken=dy....[Very long FCM token]...Kn4b1&sender=epeued7o3z"