2012-03-26 35 views
1

我試圖將一些代碼從shell腳本移動到erlang以獲取新的內部工具。喜歡在Erlang中使用捲曲

當前的shell腳本調用捲曲這樣的:

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'庫二郎這樣做。

這是我這麼遠,但它不工作:

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

在這種情況下,URL是一樣的$ OTAR_URL和消息是$ OTAR_SOAP_FILE內容。

如何通過curlang從erlang中的soap文件傳遞OTAR_URL的數據?

回答

6

您正在使用httpc:request/2,它需要兩個參數:Url和Profile。你傳遞「得到」作爲URL和一個元組作爲一個配置文件,這顯然是錯誤的:

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

你可能會想看看在httpc的其他變體:請求的功能,如httpc:request/4

作爲一個說明,總是添加你得到的具體錯誤。它通常包含包含錯誤的原因,並使其他用戶更容易發現實際問題。

+0

你可以舉一個使用httpc:request/4的例子嗎?我是erlang的新手,它的文檔有點不透明。 – Malfist 2012-03-29 12:12:44

+0

'httpc:request(get,{「http://www.google.com」,[]},[],[])。' – 2012-03-29 12:51:03

+0

我明白,但是如何將字符串傳遞給一堆數據在GET? – Malfist 2012-03-29 13:05:19

1

爲什麼要麻煩?你可以使用來自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}
要使用捲曲在二郎山做出這樣一個簡單的GET請求,這是我做了什麼:
 
curl(Link)-> 
    Cmd = "curl -X GET \"" ++ Link ++ "\"", 
    Output = os:cmd(Cmd), 
    Output. 
所有你需要做的就是逃避所有字符串變量捲曲,特別是{鏈接}

所有使用curl製作的請求仍然可以使用來自Erlang的捲曲製作。其輸出寫入文件的一個例子是這樣的:

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

在這種情況下,我們不會得到任何輸出在二郎山,因爲我們已經告訴捲曲到所有輸出扔到文件。

因此它可能執行任何腳本,任何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>

+0

來自doc:「OS模塊中的功能是特定於操作系統的,小心使用這些功能會導致只能在特定平臺上運行的程序。」另外,os:cmd/1是一個「同步」操作。總是要記住的東西。 – 2012-03-28 10:56:17

+0

是真的。但是,我認爲這是顯而易見的。需要確保'curl'在'$ PATH'中,系統將在Windows或Linux上運行。 Windows上的'cygwin'帶有curl,一個erlang應用程序可以運行的環境。但我相信如果知道他們的應用依賴於捲曲,爲什麼不確定它的安裝? – 2012-03-28 11:03:40

+0

Erlang在大多數情況下不會構建客戶端桌面應用程序。我們更多地在後端服務器上使用它。如果您的應用程序更多地依賴於Lunix/Unix腳本,爲什麼將其部署到Windows服務器上? – 2012-03-28 11:05:43