2017-11-24 16 views
0

Java 서블릿에 httpc 요청을하는 데 문제가 있습니다. 내 로컬 시스템에서 코드가 제대로 작동하지만 ejabberd 서버의 erlang 파일에서 호출을 실행하면 잘못된 인수 예외가 발생합니다. 나는 ejabberd 서버의 얼랑 파일에 코드를 복사하여 나는이 예외 가지고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 }, [], []).

:

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. 

당신은 부적절한 목록을 정의했습니다.

당신을 writting에 의해이 문제를 해결 할 수 있습니다

[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이고 두 번째 것은 31입니다.

iolist보다는 평면 목록이 필요하면 직접 작성하는 기능은 모르지만 iolist를 이진 전나무로 변환 할 수 있습니다 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

iolist (중첩 목록과 바이너리가 혼합 된) 인 것으로 보이는 값으로 목록을 요구하는 erlang:length/1을 호출하려고하기 때문에 충돌이 발생합니다.

스 니펫에 Body을 어떻게 구성하는지 정확하게 표시되어 있습니까? <<"epeued7o3z">> 이진,하지 목록입니다 : 마지막 용어는, 단점 운영자 후에 때문에

+0

예, "Body"의 생성은 확실합니다. 내 Java 서블릿은 요청에서 "deviceToken"및 "sender"값을 추출 할 수 있습니다. – Ghostw4lk