curl命令可以用来执行下载、发送各种HTTP请求,指定HTTP头部等操作。如果系统没有curl可以使用 yum install curl 安装,也可以下载安装
基本用法
curl http://www.fengfengzhidao.com
跟随跳转
一般是301,302重定向的网址
curl -L http://docs.fengfengzhidao.com
使用代理
curl -x 127.0.0.1:7890 https://www.google.com
数据发送
把这个程序跑起来,可以更加明确传了上面参数
package main
import (
"bytes"
"encoding/json"
"fmt"
"github.com/gin-gonic/gin"
"io"
"mime/multipart"
"net/url"
"os"
"strings"
)
func response(c *gin.Context) {
contentType := c.Request.Header.Get("Content-Type")
data := gin.H{
"method": c.Request.Method,
"url": c.Request.URL.String(),
"Content-Type": contentType,
"ip": c.ClientIP(),
}
var body []byte
if c.Request.Method != "GET" {
body, _ = io.ReadAll(c.Request.Body)
}
if strings.HasPrefix(contentType, "application/x-www-form-urlencoded") {
values, err := url.ParseQuery(string(body))
if err != nil {
fmt.Println(err)
} else {
data["x-www-form-urlencoded"] = values
}
}
if strings.HasPrefix(contentType, "application/json") {
var jsonMap = map[string]any{}
err := json.Unmarshal(body, &jsonMap)
if err != nil {
fmt.Println(err)
} else {
data["application/json"] = jsonMap
}
}
if strings.HasPrefix(contentType, "multipart/form-data") {
boundary := strings.Split(contentType, "; boundary=")[1]
var dataMap = map[string]any{}
buffer := bytes.NewBuffer(body)
reader := multipart.NewReader(buffer, boundary)
for {
part, err := reader.NextPart()
if err != nil {
fmt.Println(part, err)
break
}
// 检查字段是否是文件
if part.FileName() == "" {
// 普通字段
fieldName := part.FormName()
value, err := io.ReadAll(part)
if err != nil {
break
}
dataMap[fieldName] = string(value)
} else {
// 文件字段
fileName := part.FileName()
// 处理文件数据...
// 可以使用part.Read()读取文件内容
fileData, _ := io.ReadAll(part)
err = os.WriteFile(fileName, fileData, 066)
if err != nil {
fmt.Println(err)
}
fmt.Printf("File name: %s\n", fileName)
}
}
data["multipart/form-data"] = dataMap
}
c.JSON(200, data)
}
func main() {
router := gin.Default()
router.Any("", response)
router.Run(":80")
}
发送其他请求方式
curl -X POST http://127.0.0.1
curl -X DELETE http://127.0.0.1
curl -X PUT http://127.0.0.1
curl -X PATCH http://127.0.0.1
三大数据请求方式
json
windows和linux不太一样
// 都可以这样写
curl -X POST -H "Content-Type: application/json" -d {\"id\":1234} http://127.0.0.1
// linux可以这样写
curl -X POST -H "Content-Type: application/json" -d '{"id":1234}' http://192.168.100.113
form-data
curl -X POST -F a=2 -F c=1 http://127.0.0.1
curl -X POST --form a=1 --form c=2 http://127.0.0.1
urlencoded
curl -X POST -d "a=1&b=helloworld" http://127.0.0.1
文件上传
curl -X POST -F "file=@rst.txt" http://127.0.0.1
下载相关
下载文件
curl -o image.jpg http://www.fengfengzhidao.com/media/site_bg/wallhaven-y8lqo7.jpg
// 使用图片原本的名字 例如 wallhaven-y8lqo7.jpg
curl -O http://www.fengfengzhidao.com/media/site_bg/wallhaven-y8lqo7.jpg
高级用法
免ssl请求
curl https://192.168.200.10
curl: (35) schannel: next InitializeSecurityContext failed: Unknown error (0x80092012) - 吊销功能无法检查证书是否吊销。
curl -k https://192.168.200.10
需要认证
curl -H "token:&HGFHG#$%" http://127.0.0.1
curl -u admin:1234 http://127.0.0.1
显示完整的http通信过程
curl -v http://127.0.0.1
* Trying 127.0.0.1:80...
* Connected to 127.0.0.1 (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> Host: 127.0.0.1
> User-Agent: curl/8.0.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: application/json; charset=utf-8
< Date: Thu, 17 Aug 2023 01:29:13 GMT
< Content-Length: 117
<
{"Content-Type":"","header":{"Accept":["*/*"],"User-Agent":["curl/8.0.1"]},"ip":"127.0.0.1","method":"GET","url":"/"}* Connection #0 to host 127.0.0.1 left intact
只显示响应头和内容
curl -i http://192.168.100.185
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Date: Thu, 17 Aug 2023 01:38:55 GMT
Content-Length: 117
{"Content-Type":"","header":{"Accept":["*/*"],"User-Agent":["curl/8.0.1"]},"ip":"127.0.0.1","method":"GET","url":"/"}