卷曲就像在Erlang中使用一样

时间:2012-03-26 13:36:39

标签: curl erlang

我正在尝试将一些代码从shell脚本移动到erlang以获取新的内部工具。

当前的shell脚本调用curl,如下所示:

curl \
  --header "Content-type: text/xml; charset=utf-8" \
  --data @$OTAR_SOAP_FILE \
  --output $OTAR_OUT_FILE \
  --stderr $OTAR_ERR_FILE \
  --insecure \
  $OTAR_URL 

我希望能够使用inets的库从erlang中做同样的事情。

这是我到目前为止所做的,但它不起作用:

stress(Url, Message, ConcurrentAttempts, Attempts) ->
    setup_connection(),
    {ok, {{Version, ResponseCode, ReasonPhrase}, Headers, Body}} = 
        httpc:request(get, {Url, [], "text/xml", Message}).

在这种情况下,URL与$ OTAR_URL相同,Message是$ OTAR_SOAP_FILE的内容。

我如何通过curl传递OTAR中的SOAP文件中的数据,与我通过curl传递的数据相同?

2 个答案:

答案 0 :(得分:6)

您正在使用httpc:request/2,它需要两个参数:网址和个人资料。您将“获取”作为URL传递,将元组作为配置文件传递,这显然是错误的:

httpc:request(get, {Url, [], "text/xml", Message}).

您可能希望查看httpc:request函数的其他变体,例如httpc:request/4

作为备注,请始终添加您获得的特定错误。它通常包含错误的原因,并使其他用户更容易发现实际问题。

答案 1 :(得分:2)

为什么要这么麻烦?您可以使用Erlang中的脚本。我已经使用这种技术多年了。有一个名为os:cmd/1的函数。它用于执行命令或使用底层操作系统的脚本。

Remember that curl is an advanced HTTP Client. Most of the Erlang HTTP Clients
lack most features that curl has e.g. NTLM Authentication, seemless Proxy
authentication,seemeless Cookie support, e.t.c.
今年的某个时候,我正在研究一个NTLM认证代理背后的脚本,所有Erlang HTTP客户端都站在了这个位置。因此,这就是所需要的
curl \ 
--proxy {PROXY}:{PORT} --proxy-ntlm --proxy-user \
'{Domain}\{Username}:{Password}' {Link}
要在erlang中使用curl来发出这样一个简单的GET请求,我就是这样做的:
curl(Link)->
    Cmd = "curl -X GET \"" ++ Link ++ "\"",
    Output = os:cmd(Cmd),
    Output.
您需要做的就是将所有字符串变量转义为卷曲,尤其是{Link}

您使用卷曲制作的所有要求仍然可以使用Erlang的卷曲制作。将输出写入文件的示例如下所示:

curl(Link,OutputFile)->
    Cmd = "curl -X GET -o \"" ++ OutputFile ++ "\" \"" ++ Link ++ "\"",
    os:cmd(Cmd).

在这种情况下,我们不会在erlang中获得任何输出,因为我们告诉curl将所有输出都抛出到文件中。

因此可以执行任何脚本,任何termninal程序,任何使用Erlang命令

Microsoft Windows [Version 6.1.7600]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.
C:\Windows\System32>erl Eshell V5.9 (abort with ^G) 1> os:cmd("echo \"Erlang is great!!!!\" "). "\"Erlang is great!!!!\" \r\n" 2> [io:format("~s~n",[X]) || X <- string:tokens(os:cmd("ping google.com"),"\r\n")],ok. Pinging google.com [173.194.78.113] with 32 bytes of data: Reply from 173.194.78.113: bytes=32 time=273ms TTL=45 Reply from 173.194.78.113: bytes=32 time=272ms TTL=45 Reply from 173.194.78.113: bytes=32 time=274ms TTL=45 Reply from 173.194.78.113: bytes=32 time=275ms TTL=45 Ping statistics for 173.194.78.113: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 272ms, Maximum = 275ms, Average = 273ms ok 3>