httpc请求:错误的参数异常长度

时间:2017-11-24 18:26:34

标签: erlang ejabberd

我的问题是向我的Java servlet发出httpc请求。 在我的本地系统上,代码工作正常,但如果我从ejabberd服务器的erlang文件执行调用,我会得到一个错误的参数异常。

这是我本地系统的代码:

library(shiny) library(shinyWidgets) ui <- fluidPage( navbarPage("This is an App", tabPanel("Start Here - Page 0"), navbarMenu("This is Page 1", tabPanel("p1 t1", uiOutput("p1t1_out"), checkboxInput("test", "here")), tabPanel("p2 t2")), navbarMenu("This is Page 2", tabPanel("p2 t1"), tabPanel("p2 t2")))) server <- function(input, output, session) { output$p1t1_out <- renderUI({ dropdownButton( circle = FALSE, label = "Select Here", status = "default", width = 300, actionButton(inputId = "p1t1_all", label = "(Un)select All"), checkboxGroupInput( inputId = "p1t1_choice", label = "select vars", choices = as.list(names(mtcars)), selected = as.list(names(mtcars)) ) ) }) # Select all / Unselect all observeEvent(input$p1t1_all, { if (is.null(input$p1t1_choice)) { updateCheckboxGroupInput( session = session, inputId = "p1t1_choice", selected = as.list(names(mtcars)) ) } else { updateCheckboxGroupInput( session = session, inputId = "p1t1_choice", selected = "" ) } }) } shinyApp(ui, server)

我将代码复制到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 }, [], []).

身体长度是错误的还是长的是正确的,因为在我的本地计划中它运作良好?对servlet的请求应该不是问题。

提前致谢!

2 个答案:

答案 0 :(得分:0)

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

您确定自己的代码段能够准确地展示您构建Body的方式吗?

答案 1 :(得分: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.

您定义了一个不正确的列表,因为在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的调用将返回iolist的长度,请注意长度不同,第一个列表长度为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"