HTTP(下)

529 阅读3分钟

这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战

文章内容来自本人学习《Go Web编程实战派》及自己的实践总结

响应头

响应头(Response header) 可以定义为:被用于http响应中并且和响应消息主体无关的那一类 HTTP header。像Age, LocationServer都属于响应头,他们被用于描述响应。

并非所有出现在响应中的http header都属于响应头,例如Content-Length就是一个代表响应体消息大小的entity header,虽然你也可以把它叫做响应头。

响应体

响应体是HTTP请求返回的内容;响应的正文数据都在响应体中。比如:在请求网页时,响应体就是网页的HTML代码;在请求一张图片时,响应体就是图片的二进制数据。我们请求网页后,浏览器要解析的内容就是响应体

创建简单的服务器端程序

使用Go语言编程的原因之一无疑是其高性能和开发的高效率。在Go Web开发中主要使用的是net/http

创建和解析HTTP服务器端

要创建一个Go语言的HTTP服务器端,需首先使用HandleFunc()函数注册路由,然后通过ListenAndServe()函数开启对客户端的监听

package main

import (
    "fmt"
    "net/http"
)

func main() {
    // 启动一个http服务
    server := &http.Server{
            Addr: "0.0.0.0:8081",
    }

    // 服务响应
    http.HandleFunc("/", helloFuture)

    // 监听端口并启动服务
    server.ListenAndServe()
}

func helloFuture(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "hello future")
}

运行当前程序,将终端路径切换到当前程序文件目录下,运行程序,命令:go run main.go;然后在终端中访问http://localhost:8081,效果图如下:

image-20210808105137961.png

内部调用逻辑分析

如果要创建一个Web服务器端,则需要:

  • 调用http.HandleFunc()函数

  • 调用http.ListenAndServe()函数,此函数有两个参数,当前监听的端口号和实践处理器handler

创建客户端请求

在Go语言中创建客户端,最核心的HTTP请求方法就是NewRequest()函数

创建GET请求

package main

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

func main() {
    // 启动一个http服务
    server := &http.Server{
            Addr: "0.0.0.0:8081",
    }

    // 服务响应
    http.HandleFunc("/", handleGet)

    // 监听端口并启动服务
    server.ListenAndServe()
}


func handleGet(w http.ResponseWriter, r *http.Request) {
    response, err := http.Get("https://jsonplaceholder.typicode.com/posts/1")
    if err != nil {
        fmt.Println("err", err)
    }
    closer := response.Body
    bytes, err := ioutil.ReadAll(closer)
    fmt.Fprintf(w, string(bytes))
}

运行程序后,结果如下:

image-20210808110515633.png

创建POST请求

package main

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

func main() {
    // 启动一个http服务
    server := &http.Server{
            Addr: "0.0.0.0:8081",
    }

    // 服务响应
    http.HandleFunc("/post", handlePost)

    // 监听端口并启动服务
    server.ListenAndServe()
}

func handlePost(w http.ResponseWriter, r *http.Request) {
    url := "http://localhost:5000/register"
    body := `{
        "nickname": "Forest",
        "password": "Xdm1234@qq.com",
        "email": "767425412@qq.com",
        "avatar": "",
        "motto": "我不怕失败,即使头破血流我也要奋力向前"
    }`

    response, err := http.Post(url, "application/x-www-form-urlencoded", bytes.NewBuffer([]byte(body)))
    if err != nil {
            fmt.Println("err:", err)
    }

    b, err := ioutil.ReadAll(response.Body)
if err != nil {
            fmt.Println("err:", err)
    }

    fmt.Fprintf(w, string(b))
}

创建PUT请求

PUT方法在Go语言中没有给单独封装,只能直接调用http.NewRequest()函数来实现

package main

import (
    "bytes"
    "fmt"
    "io/ioutil"
    "net/http"
    "strings"
)

func main() {
    // 启动一个http服务
    server := &http.Server{
            Addr: "0.0.0.0:8081",
    }

    // 服务响应
    http.HandleFunc("/put", handlePut)

    // 监听端口并启动服务
    server.ListenAndServe()
}

func handlePut(w http.ResponseWriter, r *http.Request) {
    url := "http://localhost:500/update"
    payload := strings.NewReader(`{
            "userId": 1,
            "nickname": "clin",
            "email": "767425412lin@gmail.com",
    }`)

    requset, _ := http.NewRequest("PUT", url, payload)
    requset.Header.Add("Content-Type", "application/json")
    response, _ := http.DefaultClient.Do(requset)

    defer response.Body.Close()
    body, _ := ioutil.ReadAll(response.Body)

    fmt.Println("body:", body)
}

创建DELETE请求

DELETE方法也一样,没有单独被封装,也只能调用http.NewRequest()函数来创建

package main

import (
    "bytes"
    "fmt"
    "io/ioutil"
    "net/http"
    "strings"
)

func main() {
    // 启动一个http服务
    server := &http.Server{
            Addr: "0.0.0.0:8081",
    }

    // 服务响应
    http.HandleFunc("/delete", handleDelete)

    // 监听端口并启动服务
    server.ListenAndServe()
}


func handleDelete(w http.ResponseWriter, r *http.Request){
    url := "http://www.shirdon.com/comment/update"
    payload := strings.NewReader(`{
            "userId": 1,
    }`)

    requset, _ := http.NewRequest("DELETE", url, payload)
    requset.Header.Add("Content-Type", "application/json")
    response, _ := http.DefaultClient.Do(requset)

    defer response.Body.Close()
    body, _ := ioutil.ReadAll(response.Body)

    fmt.Println("body:", body)
    fmt.Fprintf(w, `{success: ok}`)
}