2017-11-24 10 views
0

私のJavaサーブレットにhttpc要求を行うのに問題があります。 私のローカルシステムでは、コードは正常に動作していますが、ejabberdサーバーのerlangファイルから呼び出しを実行すると、不正な引数例外が発生します。httpc要求:不正な引数の例外長

これは私のローカルシステムからの私のコードです:

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

です私のローカルプログラムではうまく働いているので、体の長さは間違っているか長いですか?サーブレットへのリクエストは問題ではありません。

ありがとうございます!

答えて

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

あなたは短所演算子の後に、最後の項ため、不適切なリストを定義している:<<"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" 
] 

長さ/ 1の呼び出しは、長さが異なることに注意して、最初のリストをiolistというの長さを返します。長さは22で、2番目は31です。

iolistではなくフラットなリストが必要な場合は、直接作成する機能はわかりませんが、iolistをバイナリfirに変換できますst)に変換し、リストに変換します(長さは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" 
+0

ありがとう、これは私のために働く! – Ghostw4lk

0

リストを必要とするerlang:length/1を呼び出す際に、iolist(ネストされたリストとバイナリが混在している)のように見えるため、クラッシュしています。

スニペットでは、Bodyの構築方法を正確に示していますか?

+0

はい、私は "Body"の構築については確信しています。私のJavaサーブレットはリクエストから値「deviceToken」と「sender」を抽出することができます。 – Ghostw4lk

関連する問題