2011-11-17 83 views
3

您好我只是想創建一個簡單的golang應用程序,使用爲什麼這個curl命令不起作用?

curl -u username:password http://example.com/api/statuses/update.xml -d status='Howdy!' -d lat='30.468' -d long='-94.743' 

該帖子在identi.ca一個新的凹痕這是到目前爲止我的代碼和恕我直言,這應該工作,但實際上它是不工作,有人知道如何解決這個問題嗎?

編輯:都能跟得上:我沒有得到任何錯誤消息:/

package main 

import(
     "fmt" 
     "os" 
     "bufio" 
     "exec" 
) 
func main() { 

var err os.Error 
var username string 

print("Username: ") 
_, err = fmt.Scanln(&username) 
if err != nil { 
    fmt.Println("Error: ", err) 
} 

var password string 
print("Password: ") 
_, err = fmt.Scanln(&password) 
if err != nil { 
    fmt.Println("Error: ", err) 
} 

var status string 
print("Status: ") 
in := bufio.NewReader(os.Stdin); 
status, err = in.ReadString('\n'); 
if err != nil { 
    fmt.Println("Error: ", err) 
} 

exec.Command("curl -u " + username + ":" + password + "https://identi.ca/api/statuses/update.xml -d status='" + status + "'" + "-d source='API'").Run() 
+0

你是什麼意思,「它不工作」?你有錯誤嗎?如果是這樣,哪個? – DarkDust

+0

不,我沒有得到一個錯誤,但我認爲有一個錯誤的捲曲命令:/ –

回答

4

exec.Command()不採取全命令行作爲一個參數。您需要將其稱爲:

exec.Command("curl", "-u", username+":"+password, ...url..., "-d", "status="+status, "-d", "source=API").Run() 

如何知道您是否遇到錯誤?您不檢查Run()的返回值。

實際上應該將命令創建與運行分開。通過這種方式,您可以將流程的stdout和stderr設置爲除/dev/null之外的其他內容,例如

c := exec.Command("curl", "-u", username+":"+password, "https://identi.ca/api/statuses/update.xml", "-d", "status="+status, "-d", "source=API") 
c.Stdout = os.Stdout 
c.Stderr = os.Stderr 
err = c.Run() 
if err != nil { 
    fmt.Println("Error: ", err) 
} 
+0

當我添加第二個代碼時,我總是得到輸出,即使凹痕發佈succsesfull ... –

+0

你可以做什麼,而不是將'c.Stdout'連接到'os.Stdout'的方法是使用'Cmd'的'Output()'方法,它與此類似,但是在字節片中返回命令的輸出。 – mkb

0

至於解釋hereexec.Command不分裂命令行參數,像正常的shell環境呢(bash中,CMD等)。

所以除了在參數填充爲

exec.Command("your_executable", "-switch1", "value1", "-switch2", "value2") 

你可以bash或命令行(視窗)幫助您

exec.Command("cmd","/C", "your_executable -switch1 value1 -switch2 value2") 

,或者你可以自行分割參數字符串(ref

arguments := "-switch1 value1 -switch2 value2" 

arg_slice := strings.Split(arguments, " ") 

exec.Command("your_executable", arg_slice...) 

這是最方便的,因爲你可能建立arguments字符串在運行時。