Как Go Web обрабатывает веб-запросы?

Go

Оригинальный автор, публичный аккаунт [программист чтение], прошу обратить внимание на паблик-аккаунт, просьба указывать источник перепечатываемой статьи.

Самая важная функция веб-приложения — получать запросы от клиентов (обычно браузеров или приложений) и возвращать статические HTML-страницы или динамически генерировать данные, которые хочет клиент, в соответствии с методом и типом запроса.net/httpОн сделал в работе с очень хорошим пакетом данных запроса, так что обработка данных веб-запросов с использованием кода Go и генерация данных ответа становится очень простой, чтобы узнать об этом вместе ниже!

Веб-запрос

Мы знаем, что HTTP-транзакция состоит из请求и响应Композиция, в этой статье мы говорим только о части веб-запросов.

Клиент обычно черезURLЧтобы инициировать запрос к серверу, самый простой пример — ввести в адресной строке браузера:juejin.cn.

Chrome Browser и введите URL Rig Xin

Каждый веб-запрос состоит из трех частей:请求行,请求头,请求实体.

метод запроса

请求方法существует请求行Среди них протокол HTTP поддерживает различные请求方法(method), существует семь основных типов:

GET,POST,PUT,HEADER,PATCH,DELETE,OPTIONS.

Одним из наиболее распространенных в веб-разработке являетсяGETМетоды иPOSTметод, используяGETметод, инициированный запросом, нет请求实体(body), Поскольку некоторые данные запрашиваются обычно толькоURLсередина查询参数(query)Передается на сервер, и запросы с использованием метода POST будут нести请求实体,существует请求实体Содержит данные, переданные на сервер.

Content-Type

Content-Typeда请求头部(Header)один используется для обозначения请求实体Тип заголовка контента, используемый в запросах или ответах для ссылки.请求实体Какие данные хранятся в конце, поэтому только толкает ремень请求实体метод работает какPOSTметод.

В общей веб-разработке наиболее часто используемые значения Content-Type следующие:

  1. application/json: данные JSON

  2. application/x-www-form-urlencoded: тип, используемый формой запроса, все символы будут закодированы перед отправкой

  3. multipart/form-data: Нет кодировки символов, обычно используется для загрузки файлов.

  4. text/html: обычно используется для заголовка ответа в ответе, сообщая клиенту, что HTML-документ возвращен.

Параметры запроса (запрос)

Параметр запроса – это часть URL-адреса, за которой следует знак ?. Например, введите: Go в поле поиска Nuggets, и мы увидим, что адресная строка браузера примет вид:

Nuggets.IM/search?Взять…

параметры запросаquery=Go&type=1, Параметры запроса разделены &. Это способ получения метода получения данных. Язык Go поддерживает получение параметров детали параметра запроса.

Объект запроса (тело)

请求实体Это часть веб-запроса, содержащая данные. Как правило, эта часть есть только у POST-запросов. Сервер оценивается по заголовку Content-Type.请求实体Если вы хотите отправить на сервер большой объем данных, вы обычно используете запрос POST.

Перейти к обработке данных веб-запроса

В языке Go используйтеhttp.RequestHttp-запросы для обработки структуры данных в методе, в котором мы определяем запрос на обработку, для передачи в пример http.Request, следующий кодrequestЭкземпляр, представляющий запрос.

http.HandleFunc("/hello", func(writer http.ResponseWriter, request *http.Request) {
    //使用request可以获取http请求的数据
})

В официальной документации golang вы можете увидеть список доступных методов вне пакета http.Request:

Список методов http.Request

Ниже приведены поля, доступные в http.Request.

type Request struct {
        Method string //方法:POST,GET...
        URL *url.URL //URL结构体
        Proto      string // 协议:"HTTP/1.0"
        ProtoMajor int    // 1
        ProtoMinor int    // 0
        Header Header    //头部信息
        Body io.ReadCloser //请求实体
        GetBody func() (io.ReadCloser, error) // Go 1.8
        ContentLength int64  //首部:Content-Length
        TransferEncoding []string
        Close bool           //是否已关闭
        Host string          //首部Host
        Form url.Values      //参数查询的数据
        PostForm url.Values // application/x-www-form-urlencoded类型的body解码后的数据
        MultipartForm *multipart.Form //文件上传时的数据
        Trailer Header
        RemoteAddr string          //请求地址
        RequestURI string          //请求的url地址
        TLS *tls.ConnectionState
        Cancel <-chan struct{} // 
        Response *Response //      响应数据
}

Получить заголовок запроса (Header)

Для общей информации заголовка запроса структура http.Request имеет соответствующие поля и методы, как показано ниже:

http.HandleFunc("/hello", func(writer http.ResponseWriter, request *http.Request) {
    request.RemoteAddr
    request.RequestURI
    request.ContentLength 
    request.Proto
    request.Method 
    request.Referer()
    request.UserAgent()
})

Конечно, другие домашние страницы можно получить через поле request.Header, определение request.Header выглядит следующим образом:

type Header map[string][]string

Другими словами, request.Header — это тип карты, а request.Header также предоставляет соответствующие методы, как показано ниже:

То есть, помимо использования описанного выше метода для получения информации заголовка, мы также можем использовать request.Header для ее получения, например:

http.HandleFunc("/hello", func(writer http.ResponseWriter, request *http.Request) {
    request.Header.Get("Content-Type")//返回的是string
    request.Header["Content-Type"] //返回的是[]string
})

Получить параметры запроса (Query)

Как получить параметры запроса (часть, разделенная & в URL-адресе?)? Вы можете использовать метод request.FormValue(key) для получения параметров запроса, где ключ — это имя параметра, а код выглядит следующим образом:

package main
import (
	"fmt"
	"net/http"
)
func main() {
    http.HandleFunc("/hello", func(writer http.ResponseWriter, request *http.Request) {
        username := request.FormValue("username")
        gender := request.FormValue("gender")
        fmt.Fprintln(writer,fmt.Sprintf("用户名:%s,性别:%s",username,gender))
    })
    fmt.Println(http.ListenAndServe(":8080",nil))
}

Введите http://localhost:8080/hello?username=test&gender=male в Postman.

Получить информацию о форме (Форма)

Когда мы говорим, что получение информации формы, мы обычно называем получение типа контента, которыйapplication/x-www-form-urlencodedилиmultipart/form-dataчас,请求实体Если у вас есть опыт отправки данных в формах на традиционных веб-страницах, я считаю, что вы должны быть знакомы с этими двумя способами отправки данных иmultipart/form-dataОбычно используется для загрузки файлов.

application/x-www-form-urlencoded

Чтобы получить данные, отправленные, когда Content-Type имеет значение application/x-www-form-urlencoded, вы можете использовать методы request.PostForm field request.Form и request.PostFormValue(key), чтобы получить их, но вы должны сначала вызвать request .ParseForm() для сохранения данных Запись в поле request.PostForm.

Шаги:

  1. Использовать запрос. Параметры параметров корпуса.
  2. Его можно получить с помощью request.Form, request.PostForm или request.PostFormValue(key)

Обратите внимание, что тип url.Values ​​для request.Form и request.PostForm, структура определяется следующим образом:

type Values map[string][]string

Пример выглядит следующим образом:

package main
import (
	"fmt"
	"net/http"
)
func main(){
    http.HandleFunc("/hello", func(writer http.ResponseWriter, request *http.Request) {
        err := request.ParseForm()
        if err != nil{
        fmt.Fprintln(writer,"解析错误")
        }
        username1 := request.PostForm["username"][0]
        username2 := request.PostFormValue("username")
        username3 := request.Form["username"][0]
        fmt.Fprintln(writer,fmt.Sprintf("username1:%s,username2:%s,usernam3:%s",username1,username2,username3))
    })
    fmt.Println(http.ListenAndServe(":8080",nil))
}

Используя Postman для ввода http://localhost:8080/hello, результат выглядит следующим образом:

multipart/form-data

ПолучатьContent-Typeзаmultipart/form-dataПри подаче данных последовательность действий следующая:

  1. Используйте request.ParseMultipartForm(maxMemory) для анализа параметров и записи параметров в поле MultipartForm, где maxMemory — это максимальный объем памяти для загруженного файла.
  2. Используя request.FormFile (поле файла), вы можете получить загруженный файловый объект: multipart.File
  3. Помимо поля файла, параметры можно получить из поля request.PostForm, обратите внимание, что на данный момент нет необходимости вызывать request.ParseForm().
package main
import (
	"fmt"
	"net/http"
)
func main() {
    http.HandleFunc("/upload", func(writer http.ResponseWriter, request *http.Request) {
        err := request.ParseMultipartForm(32 << 20)
        if err != nil {
            fmt.Fprintln(writer,"文件上传错误")
            return
        }
        fmt.Println(request.FormFile("file"))
    })
    fmt.Println(http.ListenAndServe(":8080",nil))
}

Суммировать

Вышеприведенное кратко описывает, как использовать язык Go для получения данных, отправленных по HTTP-запросу, с акцентом на получение данных формы, но на самом деле, в текущей тенденции развития разделения интерфейса и сервера и разработки приложений, содержание -Тип относится к application/json — это более распространенные данные. Отправьте метод, вы можете изучить его позже, когда у вас будет время.


Ваше внимание — самое большое поощрение на моем писательском пути!