在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
看看有多少参数……可以无限收集请求))
我明白了,换句话说,在这种情况下不太方便。
我从未遇到过问题。你做了什么操作?具体返回的错误信息是什么?
我尝试发送curl请求但不起作用(( 在我的情况下参数太大
请先阅读这份文档,在给出建议前请先尝试我的示例;)
@ext 你在第一篇帖子中提到出现了错误。现在你又说不知道是否遇到错误,只知道程序无法运行。
请向我们展示代码。
ext:
看看有多少参数……理论上可以无限收集请求参数))
10、20、100……用 request 应该也能实现……但用 curl 肯定无法实现"无限",不过用 request 或许可以(虽然我还没试过)……
没有人说过它是……
当然,你可以编写一个分词器,将字符串按照 bash 的方式进行分词,然后将得到的令牌切片传递给 exec.Command,例如:
args = tokenize(originalInputString)
exec.Command("curl", url, args...)
请阅读链接文档中的说明和示例。
- 你需要传入一个字符串形式的可执行文件名称
- 你需要将每个命令参数作为单独的字符串传递给可变参数函数
- 你需要实际执行
Cmd的Run()方法
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命令,同时保持原始命令的所有参数和格式。

