Spec-Zone.ru › Go

Пакет url

  • import "net/url"
  • Обзор
  • Индекс
  • Примеры

Обзор

Пакет url анализирует URL-адреса и реализует экранирование запросов.

Индекс

  • func JoinPath(base string, elem ...string) (result string, err error)
  • func PathEscape(s string) string
  • func PathUnescape(s string) (string, error)
  • func QueryEscape(s string) string
  • func QueryUnescape(s string) (string, error)
  • тип Error
  • func (e *Error) Error() string
  • func (e *Error) Temporary() bool
  • func (e *Error) Timeout() bool
  • func (e *Error) Unwrap() error
  • тип EscapeError
  • func (e EscapeError) Error() string
  • тип InvalidHostError
  • func (e InvalidHostError) Error() string
  • тип URL
  • func Parse(rawURL string) (*URL, error)
  • func ParseRequestURI(rawURL string) (*URL, error)
  • func (u *URL) AppendBinary(b []byte) ([]byte, error)
  • func (u *URL) EscapedFragment() string
  • func (u *URL) EscapedPath() string
  • func (u *URL) Hostname() string
  • func (u *URL) IsAbs() bool
  • func (u *URL) JoinPath(elem ...string) *URL
  • 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) Redacted() string
  • func (u *URL) RequestURI() string
  • func (u *URL) ResolveReference(ref *URL) *URL
  • func (u *URL) String() string
  • func (u *URL) UnmarshalBinary(text []byte) error
  • тип 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
  • тип 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) Has(key string) bool
  • func (v Values) Set(key, value string)

Примеры

ParseQuery
PathEscape
PathUnescape
QueryEscape
QueryUnescape
URL
URL.EscapedFragment
URL.EscapedPath
URL.Hostname
URL.IsAbs
URL.JoinPath
URL.MarshalBinary
URL.Parse
URL.Port
URL.Query
URL.Redacted
URL.RequestURI
URL.ResolveReference
URL.String
URL.UnmarshalBinary
URL (Раундтрип)
Values
Values.Add
Values.Del
Values.Encode
Values.Get
Values.Has
Values.Set

Файлы пакета

url.go

func JoinPath 1.19

func JoinPath(base string, elem ...string) (result string, err error)

JoinPath возвращает строку URL с объединенными элементами пути к существующему пути base, а результирующий путь очищается от элементов ./ или ../.

func PathEscape 1.8

func PathEscape(s string) string

PathEscape экранирует строку, чтобы она могла безопасно размещаться в сегменте пути URL, заменяя специальные символы (включая /) на последовательности %XX по мере необходимости.

Пример

Код:

path := url.PathEscape("my/cool+blog&about,stuff")
fmt.Println(path)

Вывод:

my%2Fcool+blog&about%2Cstuff

func PathUnescape 1.8

func PathUnescape(s string) (string, error)

PathUnescape выполняет обратное преобразование PathEscape, преобразуя каждую 3-байтовую закодированную подстроку вида «%AB» в шестнадцатерично декодированный байт 0xAB. Возвращает ошибку, если любой «%» не следует за двумя шестнадцатеричными цифрами.

PathUnescape идентичен QueryUnescape, за исключением того, что он не экранирует '+' в ' ' (пробел).

Пример

Код:

escapedPath := "my%2Fcool+blog&about%2Cstuff"
path, err := url.PathUnescape(escapedPath)
if err != nil {
    log.Fatal(err)
}
fmt.Println(path)

Вывод:

my/cool+blog&about,stuff

func QueryEscape

func QueryEscape(s string) string

QueryEscape экранирует строку, чтобы она могла безопасно размещаться в запросе URL.

Пример

Код:

query := url.QueryEscape("my/cool+blog&about,stuff")
fmt.Println(query)

Вывод:

my%2Fcool%2Bblog%26about%2Cstuff

func QueryUnescape

func QueryUnescape(s string) (string, error)

QueryUnescape выполняет обратное преобразование QueryEscape, преобразуя каждую 3-байтовую закодированную подстроку вида «%AB» в шестнадцатерично декодированный байт 0xAB. Возвращает ошибку, если любой «%» не следует за двумя шестнадцатеричными цифрами.

Пример

Код:

escapedQuery := "my%2Fcool%2Bblog%26about%2Cstuff"
query, err := url.QueryUnescape(escapedQuery)
if err != nil {
    log.Fatal(err)
}
fmt.Println(query)

Вывод:

my/cool+blog&about,stuff

тип Error

Error сообщает об ошибке и операции и URL, которые ее вызвали.

type Error struct {
    Op  string
    URL string
    Err error
}

func (*Error) Error

func (e *Error) Error() string

func (*Error) Temporary 1.6

func (e *Error) Temporary() bool

func (*Error) Timeout 1.6

func (e *Error) Timeout() bool

func (*Error) Unwrap 1.13

func (e *Error) Unwrap() error

тип EscapeError

type EscapeError string

func (EscapeError) Error

func (e EscapeError) Error() string

тип InvalidHostError 1.6

type InvalidHostError string

func (InvalidHostError) Error 1.6

func (e InvalidHostError) Error() string

тип URL

URL представляет собой обработанный URL-адрес (в техническом смысле, URI-ссылка).

Общий представленный вид:

[scheme:][//[userinfo@]host][/]path[?query][#fragment]

URL, которые не начинаются с косой черты после схемы, интерпретируются как:

scheme:opaque[?query][#fragment]

Поле Host содержит компоненты хоста и порта URL-адреса. Когда порт присутствует, он отделяется от хоста двоеточием. Когда хост является IPv6-адресом, он должен быть заключен в квадратные скобки: "[fe80::1]:80". Функция net.JoinHostPort объединяет хост и порт в строку, подходящую для поля Host, добавляя квадратные скобки к хосту при необходимости.

Обратите внимание, что поле Path хранится в декодированной форме: /%47%6f%2f становится /Go/. Следствием является невозможность определить, какие косые черты в Path были косыми чертами в исходном URL-адресе, а какие — %2f. Это различие редко имеет значение, но когда это необходимо, код должен использовать метод URL.EscapedPath, который сохраняет исходное кодирование Path.

Поле RawPath — необязательное поле, которое устанавливается только тогда, когда стандартное кодирование Path отличается от экранированного пути. Подробнее см. в методе EscapedPath.

Метод String объекта URL использует метод EscapedPath для получения пути.

type URL struct {
    Scheme      string
    Opaque      string    // encoded opaque data
    User        *Userinfo // username and password information
    Host        string    // host or host:port (see Hostname and Port methods)
    Path        string    // path (relative paths may omit leading slash)
    RawPath     string    // encoded path hint (see EscapedPath method); added in Go 1.5
    OmitHost    bool      // do not emit empty host (authority); added in Go 1.19
    ForceQuery  bool      // append a query ('?') even if RawQuery is empty; added in Go 1.7
    RawQuery    string    // encoded query values, without '?'
    Fragment    string    // fragment for references, without '#'
    RawFragment string    // encoded fragment hint (see EscapedFragment method); added in Go 1.15
}

Пример

Код:

u, err := url.Parse("http://bing.com/search?q=dotnet")
if err != nil {
    log.Fatal(err)
}
u.Scheme = "https"
u.Host = "google.com"
q := u.Query()
q.Set("q", "golang")
u.RawQuery = q.Encode()
fmt.Println(u)

Вывод:

https://google.com/search?q=golang

Пример (Раундтрип)

Код:

// Parse + String preserve the original encoding.
u, err := url.Parse("https://example.com/foo%2fbar")
if err != nil {
    log.Fatal(err)
}
fmt.Println(u.Path)
fmt.Println(u.RawPath)
fmt.Println(u.String())

Вывод:

/foo/bar
/foo%2fbar
https://example.com/foo%2fbar

func Parse

func Parse(rawURL string) (*URL, error)

Parse анализирует исходный URL-адрес в структуру URL.

URL-адрес может быть относительным (путь без хоста) или абсолютным (начинающимся со схемы). Попытка проанализировать имя хоста и путь без схемы недействительна, но необязательно возвращает ошибку из-за неоднозначностей при анализе.

func ParseRequestURI

func ParseRequestURI(rawURL string) (*URL, error)

ParseRequestURI анализирует исходный URL-адрес в структуру URL. Предполагается, что URL-адрес получен в HTTP-запросе, поэтому URL-адрес интерпретируется только как абсолютный URI или абсолютный путь. Строка url предполагается не содержащей суффикса #fragment. (Веб-браузеры удаляют #fragment перед отправкой URL-адреса веб-серверу.)

func (*URL) AppendBinary 1.24

func (u *URL) AppendBinary(b []byte) ([]byte, error)

func (*URL) EscapedFragment 1.15

func (u *URL) EscapedFragment() string

EscapedFragment возвращает экранированную форму u.Fragment. В целом существует несколько возможных экранированных форм любого фрагмента. EscapedFragment возвращает u.RawFragment, если это действительное экранирование u.Fragment. В противном случае EscapedFragment игнорирует u.RawFragment и вычисляет собственную экранированную форму. Метод URL.String использует EscapedFragment для построения своего результата. В общем случае код должен вызывать EscapedFragment вместо непосредственного чтения u.RawFragment.

Пример

Код:

u, err := url.Parse("http://example.com/#x/y%2Fz")
if err != nil {
    log.Fatal(err)
}
fmt.Println("Fragment:", u.Fragment)
fmt.Println("RawFragment:", u.RawFragment)
fmt.Println("EscapedFragment:", u.EscapedFragment())

Вывод:

Fragment: x/y/z
RawFragment: x/y%2Fz
EscapedFragment: x/y%2Fz

func (*URL) EscapedPath 1.5

func (u *URL) EscapedPath() string

EscapedPath возвращает экранированную форму u.Path. В целом существует несколько возможных экранированных форм любого пути. EscapedPath возвращает u.RawPath, если это действительное экранирование u.Path. В противном случае EscapedPath игнорирует u.RawPath и вычисляет собственную экранированную форму. Методы URL.String и URL.RequestURI используют EscapedPath для построения своих результатов. В общем случае код должен вызывать EscapedPath вместо непосредственного чтения u.RawPath.

Пример

Код:

u, err := url.Parse("http://example.com/x/y%2Fz")
if err != nil {
    log.Fatal(err)
}
fmt.Println("Path:", u.Path)
fmt.Println("RawPath:", u.RawPath)
fmt.Println("EscapedPath:", u.EscapedPath())

Вывод:

Path: /x/y/z
RawPath: /x/y%2Fz
EscapedPath: /x/y%2Fz

func (*URL) Hostname 1.8

func (u *URL) Hostname() string

Hostname возвращает u.Host, удаляя любой допустимый номер порта, если он присутствует.

Если результат заключён в квадратные скобки, как это происходит с литеральными адресами IPv6, то квадратные скобки из результата удаляются.

Пример

Код:

u, err := url.Parse("https://example.org:8000/path")
if err != nil {
    log.Fatal(err)
}
fmt.Println(u.Hostname())
u, err = url.Parse("https://[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:17000")
if err != nil {
    log.Fatal(err)
}
fmt.Println(u.Hostname())

Вывод:

example.org
2001:0db8:85a3:0000:0000:8a2e:0370:7334

func (*URL) IsAbs

func (u *URL) IsAbs() bool

IsAbs сообщает, является ли URL абсолютным. Абсолютным означает, что у него есть непустой схему.

Пример

Код:

u := url.URL{Host: "example.com", Path: "foo"}
fmt.Println(u.IsAbs())
u.Scheme = "http"
fmt.Println(u.IsAbs())

Вывод:

false
true

func (*URL) JoinPath 1.19

func (u *URL) JoinPath(elem ...string) *URL

JoinPath возвращает новый URL с предоставленными элементами пути, соединёнными с любым существующим путём, и полученный путь очищен от элементов ./ или ../. Любые последовательности нескольких символов / будут сведены к одному /.

Пример

Код:

u, err := url.Parse("https://example.com/foo/bar")
if err != nil {
    log.Fatal(err)
}

fmt.Println(u.JoinPath("baz", "qux"))

Вывод:

https://example.com/foo/bar/baz/qux

func (*URL) MarshalBinary 1.8

func (u *URL) MarshalBinary() (text []byte, err error)

Пример

Код:

u, _ := url.Parse("https://example.org")
b, err := u.MarshalBinary()
if err != nil {
    log.Fatal(err)
}
fmt.Printf("%s\n", b)

Вывод:

https://example.org

func (*URL) Parse

func (u *URL) Parse(ref string) (*URL, error)

Parse парсит URL в контексте получателя. Предоставленный URL может быть относительным или абсолютным. Parse возвращает nil, err при сбое разбора, в противном случае его возвращаемое значение такое же, как у URL.ResolveReference.

Пример

Код:

u, err := url.Parse("https://example.org")
if err != nil {
    log.Fatal(err)
}
rel, err := u.Parse("/foo")
if err != nil {
    log.Fatal(err)
}
fmt.Println(rel)
_, err = u.Parse(":foo")
if _, ok := err.(*url.Error); !ok {
    log.Fatal(err)
}

Вывод:

https://example.org/foo

func (*URL) Port 1.8

func (u *URL) Port() string

Port возвращает часть порта u.Host без ведущей двоеточия.

Если u.Host не содержит допустимого числового порта, Port возвращает пустую строку.

Пример

Код:

u, err := url.Parse("https://example.org")
if err != nil {
    log.Fatal(err)
}
fmt.Println(u.Port())
u, err = url.Parse("https://example.org:8080")
if err != nil {
    log.Fatal(err)
}
fmt.Println(u.Port())

Вывод:

8080

func (*URL) Query

func (u *URL) Query() Values

Query парсит RawQuery и возвращает соответствующие значения. Он безмолвно отбрасывает неправильно сформированные пары ключ-значение. Чтобы проверить ошибки, используйте ParseQuery.

Пример

Код:

u, err := url.Parse("https://example.org/?a=1&a=2&b=&=3&&&&")
if err != nil {
    log.Fatal(err)
}
q := u.Query()
fmt.Println(q["a"])
fmt.Println(q.Get("b"))
fmt.Println(q.Get(""))

Вывод:

[1 2]

3

func (*URL) Redacted 1.15

func (u *URL) Redacted() string

Redacted аналогичен URL.String, но заменяет любой пароль на "xxxxx". Заменяется только пароль в u.User.

Пример

Код:

u := &url.URL{
    Scheme: "https",
    User:   url.UserPassword("user", "password"),
    Host:   "example.com",
    Path:   "foo/bar",
}
fmt.Println(u.Redacted())
u.User = url.UserPassword("me", "newerPassword")
fmt.Println(u.Redacted())

Вывод:

https://user:xxxxx@example.com/foo/bar
https://me:xxxxx@example.com/foo/bar

func (*URL) RequestURI

func (u *URL) RequestURI() string

RequestURI возвращает закодированную строку пути?запрос или непрозрачную?строку запроса, которая использовалась бы в HTTP-запросе для u.

Пример

Код:

u, err := url.Parse("https://example.org/path?foo=bar")
if err != nil {
    log.Fatal(err)
}
fmt.Println(u.RequestURI())

Вывод:

/path?foo=bar

func (*URL) ResolveReference

func (u *URL) ResolveReference(ref *URL) *URL

ResolveReference разрешает ссылку URI в абсолютный URI от абсолютного базового URI u, согласно RFC 3986 Раздел 5.2. Ссылка URI может быть относительной или абсолютной. ResolveReference всегда возвращает новый экземпляр URL, даже если возвращаемый URL идентичен либо базовому, либо ссылке. Если ref является абсолютным URL, то ResolveReference игнорирует base и возвращает копию ref.

Пример

Код:

u, err := url.Parse("../../..//search?q=dotnet")
if err != nil {
    log.Fatal(err)
}
base, err := url.Parse("http://example.com/directory/")
if err != nil {
    log.Fatal(err)
}
fmt.Println(base.ResolveReference(u))

Вывод:

http://example.com/search?q=dotnet

func (*URL) String

func (u *URL) String() string

String повторно собирает URL в допустимую строку URL. Общий вид результата — один из:

scheme:opaque?query#fragment
scheme://userinfo@host/path?query#fragment

Если u.Opaque не пусто, String использует первый формат; в противном случае он использует второй формат. Любые не-ASCII символы в имени хоста экранируются. Для получения пути String использует u.EscapedPath().

Во втором формате применяются следующие правила:

  • если u.Scheme пусто, схема: опускается.
  • если u.User равен nil, userinfo@ опускается.
  • если u.Host пусто, host/ опускается.
  • если u.Scheme и u.Host пусты, а u.User равен nil, вся схема://userinfo@host/ опускается.
  • если u.Host не пусто, а u.Path начинается с /, формат host/path не добавляет свой /.
  • если u.RawQuery пусто, ?query опускается.
  • если u.Fragment пусто, #fragment опускается.

Пример

Код:

u := &url.URL{
    Scheme:   "https",
    User:     url.UserPassword("me", "pass"),
    Host:     "example.com",
    Path:     "foo/bar",
    RawQuery: "x=1&y=2",
    Fragment: "anchor",
}
fmt.Println(u.String())
u.Opaque = "opaque"
fmt.Println(u.String())

Вывод:

https://me:pass@example.com/foo/bar?x=1&y=2#anchor
https:opaque?x=1&y=2#anchor

func (*URL) UnmarshalBinary 1.8

func (u *URL) UnmarshalBinary(text []byte) error

Пример

Код:

u := &url.URL{}
err := u.UnmarshalBinary([]byte("https://example.org/foo"))
if err != nil {
    log.Fatal(err)
}
fmt.Printf("%s\n", u)

Вывод:

https://example.org/foo

type Userinfo

Тип Userinfo — это неизменяемая оболочка данных имени пользователя и пароля для URL. Существующее значение Userinfo гарантированно имеет установленное имя пользователя (возможно, пустое, как разрешено RFC 2396) и необязательно пароль.

type Userinfo struct {
    // contains filtered or unexported fields
}

func User

func User(username string) *Userinfo

User возвращает Userinfo, содержащий предоставленное имя пользователя и без установленного пароля.

func UserPassword

func UserPassword(username, password string) *Userinfo

UserPassword возвращает Userinfo, содержащий предоставленное имя пользователя и пароль.

Эта функциональность должна использоваться только с устаревшими веб-сайтами. RFC 2396 предупреждает, что интерпретация Userinfo таким образом «НЕ РЕКОМЕНДУЕТСЯ, так как передача информации об аутентификации в открытом тексте (например, в URI) оказалась риском для безопасности почти во всех случаях, когда она использовалась».

func (*Userinfo) Password

func (u *Userinfo) Password() (string, bool)

Password возвращает пароль, если он установлен, и установлен ли он.

func (*Userinfo) String

func (u *Userinfo) String() string

String возвращает закодированную информацию userinfo в стандартном формате "username[:password]".

func (*Userinfo) Username

func (u *Userinfo) Username() string

Username возвращает имя пользователя.

type Values

Values отображает строковый ключ на список значений. Он обычно используется для параметров запроса и значений форм. В отличие от карты http.Header, ключи в карте Values чувствительны к регистру.

type Values map[string][]string

Пример

Код:

v := url.Values{}
v.Set("name", "Ava")
v.Add("friend", "Jess")
v.Add("friend", "Sarah")
v.Add("friend", "Zoe")
// v.Encode() == "name=Ava&friend=Jess&friend=Sarah&friend=Zoe"
fmt.Println(v.Get("name"))
fmt.Println(v.Get("friend"))
fmt.Println(v["friend"])

Вывод:

Ava
Jess
[Jess Sarah Zoe]

func ParseQuery

func ParseQuery(query string) (Values, error)

ParseQuery парсит URL-кодированную строку запроса и возвращает карту, перечисляющую значения, указанные для каждого ключа. ParseQuery всегда возвращает непустую карту, содержащую все найденные действительные параметры запроса; err описывает первую ошибку декодирования, если таковая имеется.

Запрос ожидается как список настроек key=value, разделённых амперсандом. Настройка без знака равенства интерпретируется как ключ, установленный в пустое значение. Настройки, содержащие не закодированную в URL точку с запятой, считаются недопустимыми.

Пример

Код:

m, err := url.ParseQuery(`x=1&y=2&y=3`)
if err != nil {
    log.Fatal(err)
}
fmt.Println(toJSON(m))

Вывод:

{"x":["1"], "y":["2", "3"]}

func (Values) Add

func (v Values) Add(key, value string)

Add добавляет значение к ключу. Он добавляет к любым существующим значениям, связанным с ключом.

Пример

Код:

v := url.Values{}
v.Add("cat sounds", "meow")
v.Add("cat sounds", "mew")
v.Add("cat sounds", "mau")
fmt.Println(v["cat sounds"])

Вывод:

[meow mew mau]

func (Values) Del

func (v Values) Del(key string)

Del удаляет значения, связанные с ключом.

Пример

Код:

v := url.Values{}
v.Add("cat sounds", "meow")
v.Add("cat sounds", "mew")
v.Add("cat sounds", "mau")
fmt.Println(v["cat sounds"])

v.Del("cat sounds")
fmt.Println(v["cat sounds"])

Вывод:

[meow mew mau]
[]

func (Values) Encode

func (v Values) Encode() string

Encode кодирует значения в форму «кодированной по URL» ("bar=baz&foo=quux"), отсортированную по ключу.

Пример

Код:

v := url.Values{}
v.Add("cat sounds", "meow")
v.Add("cat sounds", "mew/")
v.Add("cat sounds", "mau$")
fmt.Println(v.Encode())

Вывод:

cat+sounds=meow&cat+sounds=mew%2F&cat+sounds=mau%24

func (Values) Get

func (v Values) Get(key string) string

Get получает первое значение, связанное с заданным ключом. Если значений, связанных с ключом, нет, Get возвращает пустую строку. Чтобы получить доступ к нескольким значениям, используйте карту напрямую.

Пример

Код:

v := url.Values{}
v.Add("cat sounds", "meow")
v.Add("cat sounds", "mew")
v.Add("cat sounds", "mau")
fmt.Printf("%q\n", v.Get("cat sounds"))
fmt.Printf("%q\n", v.Get("dog sounds"))

Вывод:

"meow"
""

func (Values) Has 1.17

func (v Values) Has(key string) bool

Has проверяет, установлен ли данный ключ.

Пример

Код:

v := url.Values{}
v.Add("cat sounds", "meow")
v.Add("cat sounds", "mew")
v.Add("cat sounds", "mau")
fmt.Println(v.Has("cat sounds"))
fmt.Println(v.Has("dog sounds"))

Вывод:

true
false

func (Values) Set

func (v Values) Set(key, value string)

Метод set устанавливает значение ключа. Он заменяет любые существующие значения.

Пример

Код:

v := url.Values{}
v.Add("cat sounds", "meow")
v.Add("cat sounds", "mew")
v.Add("cat sounds", "mau")
fmt.Println(v["cat sounds"])

v.Set("cat sounds", "meow")
fmt.Println(v["cat sounds"])

Вывод:

[meow mew mau]
[meow]

© Google, Inc.
Licensed under the Creative Commons Attribution License 3.0.
http://golang.org/pkg/net/url/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API