我的问题是向我的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的请求应该不是问题。
提前致谢!
答案 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"