【问题标题】:httpc request: Bad argument exception lengthhttpc 请求:错误的参数异常长度
【发布时间】:2018-05-08 18:33:51
【问题描述】:

我在向我的 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 ejabberd


    【解决方案1】:

    它正在崩溃,因为它试图调用 erlang:length/1,它需要一个列表,其值似乎是一个 iolist(嵌套列表和二进制文件的混合)。

    您确定您的 sn-p 准确地显示了您是如何构建 Body 的吗?

    【讨论】:

    • 是的,我确信“身体”的构造。我的 Java servlet 能够从请求中提取值“deviceToken”和“sender”。
    【解决方案2】:
    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 运算符之后:&lt;&lt;"epeued7o3z"&gt;&gt; 是一个二进制,而不是一个列表。

    你可以通过写作来解决这个问题:

    [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会返回iolist的长度,注意长度不同,第一个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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-09
      相关资源
      最近更新 更多