go使用http请求

190 阅读4分钟

前言

go自带http请求工具,不用额外引入http工具包,Go语言内置的net/http包,提供了HTTP客户端和服务端的实现

http使用

Get请求

http.Get使用

使用http接口

@GetMapping("/hello")
public String hello(@RequestParam Long id) {
    log.info("id的值为:{{}}", id);
    return "success";
}

使用http.Get发送Get请求

package main

import (
    "fmt"
    "io"
    "net/http"
)

func main() {

    response, _ := http.Get("http://localhost:3008/hello?id=1")
    fmt.Println(response.StatusCode)
    if response.StatusCode == http.StatusOK {
       data, _ := io.ReadAll(response.Body)
       fmt.Println(string(data))
    }
}

返回值为

企业微信截图_17196448409260.png 还可以

package main

import (
    "fmt"
    "io"
    "log"
    "net/http"
    "net/url"
)

func main() {

    apiUrl := "http://127.0.0.1:3008/hello"
    data := url.Values{}
    data.Set("id", "1")
    u, err := url.ParseRequestURI(apiUrl)
    if err != nil {
       log.Println("请求发生异常:", err)
       return
    }
    u.RawQuery = data.Encode() // URL encode
    fmt.Println(u.String())
    response, err1 := http.Get(u.String())
    if err1 != nil {
       log.Println("请求发生异常:", err1)
       return
    }
    if response.StatusCode == http.StatusOK {
       data, _ := io.ReadAll(response.Body)
       fmt.Println(string(data))
    }
}
post请求

定义一个实体类

public record User(Long id, String name, Integer age) {
}

以及一个post请求

@PostMapping("/save")
public String save(@RequestBody User user) {
    log.info("保存的值为:{{}}", user);
    return "success";
}

http.post使用如下

package main

import (
    "encoding/json"
    "fmt"
    "io"
    "log"
    "net/http"
    "strings"
)

type User struct {
    Id   int64  `json:"id"`
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    var user = User{1, "aa", 12}
    url := "http://127.0.0.1:3008/save"
    contentType := "application/json"
    data, err1 := json.Marshal(user)
    if err1 != nil {
       log.Println("json异常:", err1)
       return
    }
    resp, err := http.Post(url, contentType, strings.NewReader(string(data)))
    if err != nil {
       log.Println("请求异常:", err)
       return
    }
    b, err := io.ReadAll(resp.Body)
    if err != nil {
       fmt.Println("解析异常:", err)
       return
    }
    log.Println(string(b))
}

使用http.post发送表单请求

1、定义一个接口

@PostMapping("/postForm")
public String postForm(User user) {
    log.info("保存的值为:{{}}", user);
    return "success";
}

2、发送http表单请求

package main

import (
    "fmt"
    "io"
    "log"
    "net/http"
    "strings"
)

func main() {
    url := "http://127.0.0.1:3008/postForm"
    contentType := "application/x-www-form-urlencoded"
    data := "id=1&name=aa"
    resp, err := http.Post(url, contentType, strings.NewReader(string(data)))
    if err != nil {
       log.Println("请求异常:", err)
       return
    }
    b, err := io.ReadAll(resp.Body)
    if err != nil {
       fmt.Println("解析异常:", err)
       return
    }
    log.Println(string(b))
}

或者

package main

import (
    "fmt"
    "io"
    "log"
    "net/http"
    "net/url"
)

func main() {
    targetUrl := "http://127.0.0.1:3008/postForm"

    payload := url.Values{"name": {"hello"}, "id": {"1"}}

    response, err := http.PostForm(targetUrl, payload)

    if err != nil {
       log.Println("请求异常:", err)
       return
    }
    b, err := io.ReadAll(response.Body)
    if err != nil {
       fmt.Println("解析异常:", err)
       return
    }
    log.Println(string(b))
}

http.NewRequest使用

Get请求

1、定义一个get接口


@GetMapping("/hello")
public String hello(@RequestParam Long id) {
    log.info("id的值为:{{}}", id);
    return "success";
}

发送get请求

package main

import (
    "fmt"
    "io"
    "log"
    "net/http"
)

func main() {
    url := "http://127.0.0.1:3008/hello?id=1"

    req, _ := http.NewRequest("GET", url, nil)

    req.Header.Add("Authorization", "hello")

    response, err := http.DefaultClient.Do(req)
    if err != nil {
       log.Println("请求异常:", err)
       return
    }
    b, err := io.ReadAll(response.Body)
    if err != nil {
       fmt.Println("解析异常:", err)
       return
    }
    log.Println(string(b))
}
post发送json请求

1、定义一个实体类

public record User(Long id, String name, Integer age) {
}

2、定义一个接口


@PostMapping("/save")
public String save(@RequestBody User user) {
    log.info("保存的值为:{{}}", user);
    return "success";
}

3、发送post以及json请求

package main

import (
    "encoding/json"
    "fmt"
    "io"
    "log"
    "net/http"
    "strings"
)

type User struct {
    Id   int64  `json:"id"`
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    targetUrl := "http://127.0.0.1:3008/save"

    var user = User{1, "aa", 12}
    data, err1 := json.Marshal(user)
    if err1 != nil {
       log.Println("json异常:", err1)
       return
    }

    req, err := http.NewRequest("POST", targetUrl, strings.NewReader(string(data)))

    if err != nil {
       log.Println("请求异常:", err)
       return
    }

    req.Header.Add("Content-Type", "application/json")

    response, err := http.DefaultClient.Do(req)

    if err != nil {
       log.Println("请求异常:", err)
       return
    }
    b, err := io.ReadAll(response.Body)
    if err != nil {
       fmt.Println("解析异常:", err)
       return
    }
    log.Println(string(b))
}
DELETE请求

1、定义一个delete请求接口

@DeleteMapping("/deleteById")
public String deleteById(@RequestParam Long id) {
    log.info("id的值为:{{}}", id);
    return "success";
}

2、发送delete请求

package main

import (
    "fmt"
    "io"
    "log"
    "net/http"
)

func main() {
    targetUrl := "http://127.0.0.1:3008/deleteById?id=12"

    req, err := http.NewRequest(http.MethodDelete, targetUrl, nil)

    if err != nil {
       log.Println("请求异常:", err)
       return
    }

    response, err := http.DefaultClient.Do(req)

    if err != nil {
       log.Println("请求异常:", err)
       return
    }
    b, err := io.ReadAll(response.Body)
    if err != nil {
       fmt.Println("解析异常:", err)
       return
    }
    log.Println(string(b))
}
put请求

1、定义一个put请求


@PutMapping("/update")
public String update(@RequestBody User user) {
    log.info("更新的值为:{{}}", user);
    return "success";
}

2、发送put请求

package main

import (
    "encoding/json"
    "fmt"
    "io"
    "log"
    "net/http"
    "strings"
)

type User struct {
    Id   int64  `json:"id"`
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    targetUrl := "http://127.0.0.1:3008/update"

    var user = User{1, "aa", 12}
    data, err1 := json.Marshal(user)
    if err1 != nil {
       log.Println("json异常:", err1)
       return
    }

    req, err := http.NewRequest(http.MethodPut, targetUrl, strings.NewReader(string(data)))

    req.Header.Add("Content-Type", "application/json")

    if err != nil {
       log.Println("请求异常:", err)
       return
    }

    response, err := http.DefaultClient.Do(req)

    if err != nil {
       log.Println("请求异常:", err)
       return
    }
    b, err := io.ReadAll(response.Body)
    if err != nil {
       fmt.Println("解析异常:", err)
       return
    }
    log.Println(string(b))
}
patch请求

1、定义一个patch请求

@PatchMapping("/update1")
public String update1(@RequestBody User user) {
    log.info("更新的值为:{{}}", user);
    return "success";
}

2、发送patch请求

package main

import (
    "encoding/json"
    "fmt"
    "io"
    "log"
    "net/http"
    "strings"
)

type User struct {
    Id   int64  `json:"id"`
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    targetUrl := "http://127.0.0.1:3008/update1"

    var user = User{1, "aa", 12}
    data, err1 := json.Marshal(user)
    if err1 != nil {
       log.Println("json异常:", err1)
       return
    }

    req, err := http.NewRequest(http.MethodPatch, targetUrl, strings.NewReader(string(data)))

    req.Header.Add("Content-Type", "application/json")
    req.Header.Add("Authorization", "hello")

    if err != nil {
       log.Println("请求异常:", err)
       return
    }

    response, err := http.DefaultClient.Do(req)

    if err != nil {
       log.Println("请求异常:", err)
       return
    }
    b, err := io.ReadAll(response.Body)
    if err != nil {
       fmt.Println("解析异常:", err)
       return
    }
    log.Println(string(b))
}
post表单

1、定义一个实体类

public record User(Long id, String name, Integer age) {
}

2、定义一个接口

@PostMapping("/postForm")
public String postForm(User user) {
    log.info("保存的值为:{{}}", user);
    return "success";
}

3、发送http表单请求

package main

import (
    "fmt"
    "io"
    "log"
    "net/http"
    "net/url"
    "strings"
)

type User struct {
    Id   int64  `json:"id"`
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    targetUrl := "http://127.0.0.1:3008/postForm"
    urlMap := url.Values{}
    urlMap.Add("id", "1")
    urlMap.Add("name", "aaaa")
    urlMap.Add("age", "18")

    req, err := http.NewRequest(http.MethodPost, targetUrl, strings.NewReader(urlMap.Encode()))

    req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
    req.Header.Add("Authorization", "hello")

    if err != nil {
       log.Println("请求异常:", err)
       return
    }

    response, err := http.DefaultClient.Do(req)

    if err != nil {
       log.Println("请求异常:", err)
       return
    }
    b, err := io.ReadAll(response.Body)
    if err != nil {
       fmt.Println("解析异常:", err)
       return
    }
    log.Println(string(b))
}

总结

go自带的net/http包是十分优秀的http包,也不用引入第三方包,就可以发送http请求