在Golang终端中使用curl的方法与技巧

在Golang终端中使用curl的方法与技巧 您好。

需要帮助。

我可以在我的项目中使用curl命令吗?

请不要使用请求库,

例如curl(参数字符串)?

var curlstr = `curl -H 'Host: www.bos.de' -H 'Cache-Control: max-age=0' -H 'Origin:     https://www.bos.de' -H 'Upgrade-Insecure-Requests: 1' -H 'Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryMB2FxJ70TX1UemBu' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3' -H 'Referer: https://www.bos.de/en/contact/send-message.html' -H 'Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7' -H 'Cookie: _ga=GA1.2.659292183.1561542752; _gid=GA1.2.611660608.1561542752' -H 'DNT: 1' --data-binary '------WebKitFormBoundaryMB2FxJ70TX1UemBu
Content-Disposition: form-data; name="tx_powermail_pi1[__referrer][@extension]"

Powermail
------WebKitFormBoundaryMB2FxJ70TX1UemBu
Content-Disposition: form-data; name="tx_powermail_pi1[__referrer][@vendor]"

In2code
------WebKitFormBoundaryMB2FxJ70TX1UemBu
Content-Disposition: form-data; name="tx_powermail_pi1[__referrer][@controller]"

Form
------WebKitFormBoundaryMB2FxJ70TX1UemBu
Content-Disposition: form-data; name="tx_powermail_pi1[__referrer][@action]"

form
------WebKitFormBoundaryMB2FxJ70TX1UemBu
Content-Disposition: form-data; name="tx_powermail_pi1[__referrer][arguments]"

YTowOnt98ee02f22bba789d397ac6678624087794688bcf3
------WebKitFormBoundaryMB2FxJ70TX1UemBu
Content-Disposition: form-data; name="tx_powermail_pi1[__referrer][@request]"

a:4:{s:10:"@extension";s:9:"Powermail";s:11:"@controller";s:4:"Form";s:7:"@action";s:4:"form";s:7:"@vendor";s:7:"In2code";}405f1bef0ad6e766c981df2a295a365e54c5fc44
------WebKitFormBoundaryMB2FxJ70TX1UemBu
Content-Disposition: form-data; name="tx_powermail_pi1[__trustedProperties]"

a:2:{s:4:"mail";a:1:{s:4:"form";i:1;}s:5:"field";a:7:{s:4:"__hp";i:1;s:9:"firstname";i:1;s:8:"lastname";i:1;s:5:"email";i:1;s:10:"callnumber";i:1;s:7:"company";i:1;s:7:"message";i:1;}}f5f40bc8468d58edae0aee164cda03327f5c5cd3
------WebKitFormBoundaryMB2FxJ70TX1UemBu
Content-Disposition: form-data; name="tx_powermail_pi1[mail][form]"

3
------WebKitFormBoundaryMB2FxJ70TX1UemBu
Content-Disposition: form-data; name="tx_powermail_pi1[field][__hp]"

------WebKitFormBoundaryMB2FxJ70TX1UemBu
Content-Disposition: form-data; name="tx_powermail_pi1[field][firstname]"

Deion www.google.com
------WebKitFormBoundaryMB2FxJ70TX1UemBu
Content-Disposition: form-data; name="tx_powermail_pi1[field][lastname]"

Sipes
------WebKitFormBoundaryMB2FxJ70TX1UemBu
Content-Disposition: form-data; name="tx_powermail_pi1[field][email]"

------WebKitFormBoundaryMB2FxJ70TX1UemBu
Content-Disposition: form-data; name="tx_powermail_pi1[field][callnumber]"

037-081-3533
------WebKitFormBoundaryMB2FxJ70TX1UemBu
Content-Disposition: form-data; name="tx_powermail_pi1[field][company]"

Monahan, Wisozk and Wilderman
------WebKitFormBoundaryMB2FxJ70TX1UemBu
Content-Disposition: form-data; name="tx_powermail_pi1[field][message]"

example text
------WebKitFormBoundaryMB2FxJ70TX1UemBu--
' --compressed 'https://www.bos.de/en/contact/send-message.html?tx_powermail_pi1%5Baction%5D=create&tx_powermail_pi1%5Bcontroller%5D=Form&cHash=c2f7e72652576d4f6dba8460063ff64e'`

curl(curlstr) ???


更多关于在Golang终端中使用curl的方法与技巧的实战教程也可以访问 https://www.itying.com/category-94-b0.html

17 回复

谢谢

更多关于在Golang终端中使用curl的方法与技巧的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


看看有多少参数……可以无限收集请求))

我明白了,换句话说,在这种情况下不太方便。

我从未遇到过问题。你做了什么操作?具体返回的错误信息是什么?

我尝试发送curl请求但不起作用(( 在我的情况下参数太大

请先阅读这份文档,在给出建议前请先尝试我的示例;)

@ext 你在第一篇帖子中提到出现了错误。现在你又说不知道是否遇到错误,只知道程序无法运行。

请向我们展示代码。

ext:

看看有多少参数……理论上可以无限收集请求参数))

10、20、100……用 request 应该也能实现……但用 curl 肯定无法实现"无限",不过用 request 或许可以(虽然我还没试过)……

没有人说过它是……

当然,你可以编写一个分词器,将字符串按照 bash 的方式进行分词,然后将得到的令牌切片传递给 exec.Command,例如:

args = tokenize(originalInputString)
exec.Command("curl", url, args...)

请阅读链接文档中的说明和示例。

  1. 你需要传入一个字符串形式的可执行文件名称
  2. 你需要将每个命令参数作为单独的字符串传递给可变参数函数
  3. 你需要实际执行 CmdRun() 方法
fmt.Println(exec.Command("curl", "https://example.com").Run())

我不清楚Charles是谁。但是通过Go使用curl实现这一目标的唯一方法是:将你的长字符串分割成多个独立字符串,每个字符串代表bash能够理解和解析的单个参数,然后将这些字符串依次作为参数提供给exec.Command

只要你尝试使用单个长字符串,curl就无法正确解析它。

func main() {
    fmt.Println("hello world")
}

如果我在Mac OS的命令行中执行所有操作,一切都能正常工作,请求也能成功发送。 但如果通过Go语言来实现,虽然没有任何错误提示,所有操作看似正常,但我不知道如何追踪它是否真正起作用,而实际上在这种情况下它并没有正常工作。

func main() {
    fmt.Println("hello world")
}

你可以使用 os/exec 包中的函数来调用 curl 并传入任意参数。

package main

import (
    "os/exec"
)

func main() {
    cmd := exec.Command("curl", "https://example.com")
    err := cmd.Run()
    if err != nil {
        panic(err)
    }
}

很高兴你知道有文档可以参考,但你可能没有仔细阅读,而我尝试运行了你的代码(尽管我本不需要这么做)。

它试图运行这样的curl命令:

curl "curl url -H 'Host: www.bos.de' -H 'Cache-Control: max-age=0' …"

所以你只用了一个参数来调用它。

正如我之前所说,你需要为每个bash参数提供一个单独的参数。

exec.Command("curl", "http://example.com", "-H", "Host: www.bos.de", "-h", "Cache-Control: max-age=0", …)

是的,确实如此。但如果有很多参数,即使是curl到post请求的转换器(确实存在)也无法帮助处理大型请求,就像我的例子中那样,该怎么办?即使post请求…

我在做什么? 我通过Charles研究请求,复制curl,任务是在Go中重复该请求。

在我给出的例子中有很多参数)那么我该怎么办,如何正确解析它们,或者自动解析这些参数并正确发出请求?

为什么我选择curl,因为从Charles导出时我得到了现成的curl请求,只需要重复执行即可

任务就是如何重复执行,我有一个现成的请求,该如何重复它?=)

在Go语言中,您可以通过os/exec包执行系统命令,包括curl。以下是如何在Go程序中执行给定的curl命令字符串的示例代码:

package main

import (
    "os"
    "os/exec"
    "strings"
)

func main() {
    curlstr := `curl -H 'Host: www.bos.de' -H 'Cache-Control: max-age=0' -H 'Origin: https://www.bos.de' -H 'Upgrade-Insecure-Requests: 1' -H 'Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryMB2FxJ70TX1UemBu' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3' -H 'Referer: https://www.bos.de/en/contact/send-message.html' -H 'Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7' -H 'Cookie: _ga=GA1.2.659292183.1561542752; _gid=GA1.2.611660608.1561542752' -H 'DNT: 1' --data-binary '------WebKitFormBoundaryMB2FxJ70TX1UemBu
Content-Disposition: form-data; name="tx_powermail_pi1[__referrer][@extension]"

Powermail
------WebKitFormBoundaryMB2FxJ70TX1UemBu
Content-Disposition: form-data; name="tx_powermail_pi1[__referrer][@vendor]"

In2code
------WebKitFormBoundaryMB2FxJ70TX1UemBu
Content-Disposition: form-data; name="tx_powermail_pi1[__referrer][@controller]"

Form
------WebKitFormBoundaryMB2FxJ70TX1UemBu
Content-Disposition: form-data; name="tx_powermail_pi1[__referrer][@action]"

form
------WebKitFormBoundaryMB2FxJ70TX1UemBu
Content-Disposition: form-data; name="tx_powermail_pi1[__referrer][arguments]"

YTowOnt98ee02f22bba789d397ac6678624087794688bcf3
------WebKitFormBoundaryMB2FxJ70TX1UemBu
Content-Disposition: form-data; name="tx_powermail_pi1[__referrer][@request]"

a:4:{s:10:"@extension";s:9:"Powermail";s:11:"@controller";s:4:"Form";s:7:"@action";s:4:"form";s:7:"@vendor";s:7:"In2code";}405f1bef0ad6e766c981df2a295a365e54c5fc44
------WebKitFormBoundaryMB2FxJ70TX1UemBu
Content-Disposition: form-data; name="tx_powermail_pi1[__trustedProperties]"

a:2:{s:4:"mail";a:1:{s:4:"form";i:1;}s:5:"field";a:7:{s:4:"__hp";i:1;s:9:"firstname";i:1;s:8:"lastname";i:1;s:5:"email";i:1;s:10:"callnumber";i:1;s:7:"company";i:1;s:7:"message";i:1;}}f5f40bc8468d58edae0aee164cda03327f5c5cd3
------WebKitFormBoundaryMB2FxJ70TX1UemBu
Content-Disposition: form-data; name="tx_powermail_pi1[mail][form]"

3
------WebKitFormBoundaryMB2FxJ70TX1UemBu
Content-Disposition: form-data; name="tx_powermail_pi1[field][__hp]"

------WebKitFormBoundaryMB2FxJ70TX1UemBu
Content-Disposition: form-data; name="tx_powermail_pi1[field][firstname]"

Deion www.google.com
------WebKitFormBoundaryMB2FxJ70TX1UemBu
Content-Disposition: form-data; name="tx_powermail_pi1[field][lastname]"

Sipes
------WebKitFormBoundaryMB2FxJ70TX1UemBu
Content-Disposition: form-data; name="tx_powermail_pi1[field][email]"

------WebKitFormBoundaryMB2FxJ70TX1UemBu
Content-Disposition: form-data; name="tx_powermail_pi1[field][callnumber]"

037-081-3533
------WebKitFormBoundaryMB2FxJ70TX1UemBu
Content-Disposition: form-data; name="tx_powermail_pi1[field][company]"

Monahan, Wisozk and Wilderman
------WebKitFormBoundaryMB2FxJ70TX1UemBu
Content-Disposition: form-data; name="tx_powermail_pi1[field][message]"

example text
------WebKitFormBoundaryMB2FxJ70TX1UemBu--
' --compressed 'https://www.bos.de/en/contact/send-message.html?tx_powermail_pi1%5Baction%5D=create&tx_powermail_pi1%5Bcontroller%5D=Form&cHash=c2f7e72652576d4f6dba8460063ff64e'`

    // 将curl命令字符串分割成参数列表
    args := strings.Fields(curlstr)
    
    // 移除第一个元素("curl"),因为exec.Command需要命令和参数分开
    cmd := exec.Command("curl", args[1:]...)
    
    // 设置标准输出和标准错误输出
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr
    
    // 执行命令
    err := cmd.Run()
    if err != nil {
        panic(err)
    }
}

如果您希望将curl命令作为单个字符串执行(例如通过shell),可以使用以下方法:

package main

import (
    "os"
    "os/exec"
)

func main() {
    curlstr := `curl -H 'Host: www.bos.de' ...` // 完整的curl命令字符串
    
    // 通过shell执行整个命令字符串
    cmd := exec.Command("sh", "-c", curlstr)
    
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr
    
    err := cmd.Run()
    if err != nil {
        panic(err)
    }
}

要捕获命令输出而不是直接打印到终端:

package main

import (
    "fmt"
    "os/exec"
)

func main() {
    curlstr := `curl -H 'Host: www.bos.de' ...` // 完整的curl命令字符串
    
    cmd := exec.Command("sh", "-c", curlstr)
    
    // 捕获输出
    output, err := cmd.CombinedOutput()
    if err != nil {
        fmt.Printf("命令执行错误: %v\n", err)
        return
    }
    
    fmt.Printf("命令输出:\n%s\n", output)
}

这些方法允许您在Go程序中执行curl命令,同时保持原始命令的所有参数和格式。

回到顶部