一节课学会curl基本使用
curl命令可以用来执行下载、发送各种HTTP请求,指定HTTP头部等操作。如果系统没有curl可以使用 yum install curl 安装,也可以下载安装 基本用法 curl http://
一节课学会curl基本使用
发布时间:2023-10-17 (2023-10-17)

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":"/"}