2011-11-17 132 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字符串在运行时。