Всем привет, меня зовут Се Вэй, я программист.
В ближайшее время будет синхронизировано изучение встроенной библиотеки, а основными ссылками являются официальные документы и исходники.
Тема этого раздела: URL-адреса
На самом деле это относительно небольшая встроенная функция, в основном используемая в сетевых запросах, и наиболее вероятное использование — для обработки параметров сетевых запросов. Конечно, если вы часто пишете restful API в своем проекте, то вы также можете часто его использовать.
Контур:
- Основные знания
- основное использование
- что ты изучал
1. Основные знания
URL-адрес: унифицированное расположение ресурсов, называемое унифицированным указателем ресурсов.
Появляется предыстория: Например, если вы ищете что-то дома, в первую очередь вы анализируете принадлежность вещи, например, кухонного ножа, вы, скорее всего, идете на кухню, чтобы можно было найти с большой вероятностью. То же самое и с ресурсами в сети.Чтобы точно найти ресурсы на сервере, есть url.
Итак, что вы знаете об URL-адресах?
- значение представления
- Компоненты: вам нужно знать конкретную форму URL-адреса, верно?
- грамматика
1.1 Значение представления
Буквально: унифицированный указатель ресурсов, который однозначно находит ресурсы в сети.
1.2 Компоненты
Сначала приведите пример:
https://www.google.com
- Схема схемы: в основном указывает, какой протокол используется, например HTTP, FTP и т. д.
- Адрес сервера: вы можете использовать IP-адрес или доменное имя, поэтому между IP-адресом и доменным именем существует связь.
- Путь к ресурсу: эта часть нацелена на адрес сетевых ресурсов.
Это легко понять.Он имеет то же значение, что и наш ежедневный домашний адрес и адрес компании.Сначала найдите провинцию, затем найдите городской район, а затем продолжайте поиск, пока не найдете свой адрес.
Ресурсы в сети в основном используют эту идею: сначала найти адрес на сервере, а затем найти адрес конкретного ресурса. Вот что означает URL.
1.3 Синтаксическая композиция
Для стандартизации адресов ресурсов в этих сетях необходим набор спецификаций Что именно содержит эта грамматика?
- Схема: схема, указывающая, какой протокол используется для доступа к ресурсам на сервере.
- Пользователь: некоторые протоколы могут передавать в открытом виде имя пользователя и пароль для получения ресурсов, например FTP.
- пароль
- Хост: адрес сервера, который может быть IP-адресом или информацией о доменном имени.
- порт: строка чисел
- путь: путь к ресурсу, разделенный "/"
- Параметры: example=one&hello=world пара ключ-значение, подобная этой
- Запрос: Идентификатор "?" используется с параметрами
- Фрагмент: Идентификатор "#"
Ну, это трудно понять, например:
https://godoc.org/net/url#example-Values
- scheme: https
- Пользователь: нет
- Пароль: нет
- Хозяин:godoc.org
- Порт: нет
- Путь: сеть/url
- Параметры: нет
- Запрос: нет
- Фрагмент: пример-значения
Некоторые из них являются необязательными, поэтому, в конце концов, обычно используются следующие понятия:
- схема (схема, протокол)
- хост (адрес сервера)
- порт (порт сервера)
- путь (путь)
- параметры (параметр)
- фрагмент (фрагмент)
Кроме того, есть проблема в процессе запроса: кодировка, используемая для представления различных небезопасных символов в URL.
Распространенные кодировки:
персонаж | Пример |
---|---|
~ | %7 |
космос | %20 |
% | %25 |
2. Основное использование
И согласно приведенному выше объяснению, мы понимаем значение URL, но в конце концов это фактически строка строк, но на уровне запросов сетевых ресурсов эта строка строк дает больше смысла.
Оставив в стороне использование официальной встроенной библиотеки, мы сначала хотим реализовать ее сами, как это сделать?
В соответствии с составом URL-адреса мы можем оформить его следующим образом.
type Url struct {
Scheme string
User string
Password string
Host string
Port string
Path string
Params map[string][]string
Fragment string
}
Что ж, если он разработан таким образом, мы преобразуем строку строк в тип URL, который мы определяем, как мы получаем каждую часть?
https://godoc.org/net/url#example-Values
В отличие от различных значений, наша идея должна состоять в том, чтобы обработать эту строку символов, например, нажать:,//,/,#
И так далее, чтобы получить то, что нам нужно.
Вышеизложенное является нашим собственным мышлением. Если вам интересно, вы можете реализовать это самостоятельно. Подумайте об этом: какие публичные методы вы предоставите? Какие вспомогательные функции будут разработаны?
Ознакомьтесь с официальной реализацией ниже:
Пример:
package main
import (
"fmt"
"net/url"
)
var urlCollection struct {
urlOne string
urlTwo string
urlThree string
urlFour string
urlFive string
}
func init() {
urlCollection.urlOne = "https://www.google.com"
urlCollection.urlTwo = "http://localhost:8887/v1/api/cloud_api/fetcher?email=1156143589@qq.com"
// https://developer.readsense.cn/docs/retail/retailv2/regions.html#删除区域
urlCollection.urlThree = "https://developer.readsense.cn/docs/retail/retailv2/regions.html#%E5%88%A0%E9%99%A4%E5%8C%BA%E5%9F%9F"
urlCollection.urlFour = "https://joe:joepassword@www.email.com/share_info.txt"
urlCollection.urlFive = "https://godoc.org/net/url#example-Values"
}
func main() {
OpUrl(urlCollection.urlOne)
OpUrl(urlCollection.urlTwo)
OpUrl(urlCollection.urlThree)
OpUrl(urlCollection.urlFour)
OpUrl(urlCollection.urlFive)
}
func OpUrl(urlString string) {
URL, _ := url.Parse(urlString)
fmt.Println("user", URL.User)
fmt.Println("scheme", URL.Scheme)
fmt.Println("host", URL.Host)
fmt.Println("port", URL.Port())
fmt.Println("rawQuery", URL.RawQuery)
fmt.Println("rawPath", URL.RawPath)
fmt.Println("path", URL.Path)
fmt.Println("forceQuery", URL.ForceQuery)
fmt.Println("fragment", URL.Fragment)
}
Как можно видеть:url.Parse
Строка может быть преобразована в объект URL, который содержит:User,Scheme,Host,Path,RawPath,ForceQuery,Fragment
поля и некоторые методы.
Просмотрите исходный код, чтобы увидеть, как определяется объект типа URL?
type URL struct {
Scheme string
Opaque string // encoded opaque data
User *Userinfo // username and password information
Host string // host or host:port
Path string // path (relative paths may omit leading slash)
RawPath string // encoded path hint (see EscapedPath method)
ForceQuery bool // append a query ('?') even if RawQuery is empty
RawQuery string // encoded query values, without '?'
Fragment string // fragment for references, without '#'
}
Вроде не сильно отличается от того, что мы ожидали, но автор мыслит глубже нас, например кодировка тоже учитывается, и будут такие поля как RawQuery, RawPath и так далее.
Продолжайте проверять:
func PathEscape(s string) string
func PathUnescape(s string) (string, error)
func QueryEscape(s string) string
func QueryUnescape(s string) (string, error)
type Error
func (e *Error) Error() string
func (e *Error) Temporary() bool
func (e *Error) Timeout() bool
type EscapeError
func (e EscapeError) Error() string
type InvalidHostError
func (e InvalidHostError) Error() string
type URL
func Parse(rawurl string) (*URL, error)
func ParseRequestURI(rawurl string) (*URL, error)
func (u *URL) EscapedPath() string
func (u *URL) Hostname() string
func (u *URL) IsAbs() bool
func (u *URL) MarshalBinary() (text []byte, err error)
func (u *URL) Parse(ref string) (*URL, error)
func (u *URL) Port() string
func (u *URL) Query() Values
func (u *URL) RequestURI() string
func (u *URL) ResolveReference(ref *URL) *URL
func (u *URL) String() string
func (u *URL) UnmarshalBinary(text []byte) error
type Userinfo
func User(username string) *Userinfo
func UserPassword(username, password string) *Userinfo
func (u *Userinfo) Password() (string, bool)
func (u *Userinfo) String() string
func (u *Userinfo) Username() string
type Values
func ParseQuery(query string) (Values, error)
func (v Values) Add(key, value string)
func (v Values) Del(key string)
func (v Values) Encode() string
func (v Values) Get(key string) string
func (v Values) Set(key, value string)
Можно видеть, что важными обычаями являются:
- Преобразуйте строку в объект URL, объект URL получит соответствующие компоненты, и есть соответствующие методы
- Значения параметров в URL очень важны, особенно в процессе написания restful API, мы тоже подумаем об этой проблеме, параметрах запроса. ее нижняя часть
map[string][]string
, так что вы можетеAdd, Del, Get,Set
Дождитесь метода, это дело надо запомнить, в следующий раз будем разбиратьnet/http
Важная часть библиотеки: обработка параметров запроса
Наконец, посмотрите на обработку ошибок этой библиотеки:
type EscapeError string
func (e EscapeError) Error() string {
return "invalid URL escape " + strconv.Quote(string(e))
}
type InvalidHostError string
func (e InvalidHostError) Error() string {
return "invalid character " + strconv.Quote(string(e)) + " in host name"
}
- определить структуру
- Реализуйте метод Error, который, в свою очередь, реализует интерфейс ошибок.
3. Чему вы научились
- Думая с точки зрения дизайнера, как я должен проектировать?
- Идея того, как проектировать, исходит из принципов, а не случайного мышления.
- Вернитесь и прочитайте принципы в книге