-
Notifications
You must be signed in to change notification settings - Fork 148
/
Copy pathnet_url.htm
223 lines (223 loc) · 20.7 KB
/
net_url.htm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
<!DOCTYPE html>
<html lang="en">
<head profile="http://a9.com/-/spec/opensearch/1.1/">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="../assets/site.css" rel="stylesheet">
<title>net/url</title>
<meta name="private:description" content="刘志曦翻译于2014年夏,Go 1.3版本">
</head>
<body>
<div class="container">
<h2 id="pkg-overview">package url</h2>
<p><code>import "net/url"</code>
<p>url包解析URL并实现了查询的逸码,参见<a href="http://tools.ietf.org/html/rfc3986">RFC 3986</a>。</p>
<h3 id="pkg-index" class="section-header">Index <a class="permalink" href="#pkg-index">¶</a></h3>
<a href="../main.html"><h3>返回首页</h3></a>
</br>
<li><a href="#QueryEscape">func QueryEscape(s string) string</a></li>
<li><a href="#QueryUnescape">func QueryUnescape(s string) (string, error)</a></li>
<li><a href="#Error">type Error</a></li>
<ul>
<li><a href="#Error.Error">func (e *Error) Error() string</a></li>
</ul>
<li><a href="#EscapeError">type EscapeError</a></li>
<ul>
<li><a href="#EscapeError.Error">func (e EscapeError) Error() string</a></li>
</ul>
<li><a href="#URL">type URL</a></li>
<ul>
<li><a href="#Parse">func Parse(rawurl string) (url *URL, err error)</a></li>
<li><a href="#ParseRequestURI">func ParseRequestURI(rawurl string) (url *URL, err error)</a></li>
<li><a href="#URL.IsAbs">func (u *URL) IsAbs() bool</a></li>
<li><a href="#URL.Query">func (u *URL) Query() Values</a></li>
<li><a href="#URL.RequestURI">func (u *URL) RequestURI() string</a></li>
<li><a href="#URL.String">func (u *URL) String() string</a></li>
<li><a href="#URL.Parse">func (u *URL) Parse(ref string) (*URL, error)</a></li>
<li><a href="#URL.ResolveReference">func (u *URL) ResolveReference(ref *URL) *URL</a></li>
</ul>
<li><a href="#Userinfo">type Userinfo</a></li>
<ul>
<li><a href="#User">func User(username string) *Userinfo</a></li>
<li><a href="#UserPassword">func UserPassword(username, password string) *Userinfo</a></li>
<li><a href="#Userinfo.Username">func (u *Userinfo) Username() string</a></li>
<li><a href="#Userinfo.Password">func (u *Userinfo) Password() (string, bool)</a></li>
<li><a href="#Userinfo.String">func (u *Userinfo) String() string</a></li>
</ul>
<li><a href="#Values">type Values</a></li>
<ul>
<li><a href="#ParseQuery">func ParseQuery(query string) (m Values, err error)</a></li>
<li><a href="#Values.Get">func (v Values) Get(key string) string</a></li>
<li><a href="#Values.Set">func (v Values) Set(key, value string)</a></li>
<li><a href="#Values.Add">func (v Values) Add(key, value string)</a></li>
<li><a href="#Values.Del">func (v Values) Del(key string)</a></li>
<li><a href="#Values.Encode">func (v Values) Encode() string</a></li>
</ul>
</ul>
<h4 id="pkg-examples">Examples <a class="permalink" href="#pkg-index">¶</a></h4>
<a href="../main.html"><h3>返回首页</h3></a>
</br>
<li><a href="#example-URL" onclick="$('#ex-URL').addClass('in').removeClass('collapse').height('auto')">URL</a></li>
<li><a href="#example-Values" onclick="$('#ex-Values').addClass('in').removeClass('collapse').height('auto')">Values</a></li>
</ul>
<h3 id="QueryEscape">func <a title="View Source" href="https://github.com/golang/go/blob/master/src/net/url/url.go?name=release#173">QueryEscape</a> <a class="permalink" href="#pkg-index">¶</a></h3>
<pre class="funcdecl">func QueryEscape(s <a href="http://godoc.org/builtin#string">string</a>) <a href="http://godoc.org/builtin#string">string</a></pre>
<p>QueryEscape函数对s进行转码使之可以安全的用在URL查询里。</p>
<h3 id="QueryUnescape">func <a title="View Source" href="https://github.com/golang/go/blob/master/src/net/url/url.go?name=release#112">QueryUnescape</a> <a class="permalink" href="#pkg-index">¶</a></h3>
<pre class="funcdecl">func QueryUnescape(s <a href="http://godoc.org/builtin#string">string</a>) (<a href="http://godoc.org/builtin#string">string</a>, <a href="http://godoc.org/builtin#error">error</a>)</pre>
<p align="left">QueryUnescape函数用于将QueryEscape转码的字符串还原。它会把%AB改为字节0xAB,将'+'改为' '。如果有某个%后面未跟两个十六进制数字,本函数会返回错误。</p>
<h3 id="Error">type <a title="View Source" href="https://github.com/golang/go/blob/master/src/net/url/url.go?name=release#18">Error</a> <a class="permalink" href="#pkg-index">¶</a></h3>
<pre>type Error struct {
<span id="Error.Op">Op</span> <a href="http://godoc.org/builtin#string">string</a>
<span id="Error.URL">URL</span> <a href="http://godoc.org/builtin#string">string</a>
<span id="Error.Err">Err</span> <a href="http://godoc.org/builtin#error">error</a>
}</pre>
<p>Error会报告一个错误,以及导致该错误发生的URL和操作。</p>
<h4 id="Error.Error">func (*Error) <a title="View Source" href="https://github.com/golang/go/blob/master/src/net/url/url.go?name=release#24">Error</a> <a class="permalink" href="#pkg-index">¶</a></h4>
<pre class="funcdecl">func (e *<a href="#Error">Error</a>) Error() <a href="http://godoc.org/builtin#string">string</a></pre>
<h3 id="EscapeError">type <a title="View Source" href="https://github.com/golang/go/blob/master/src/net/url/url.go?name=release#59">EscapeError</a> <a class="permalink" href="#pkg-index">¶</a></h3>
<pre>type EscapeError <a href="http://godoc.org/builtin#string">string</a></pre>
<h4 id="EscapeError.Error">func (EscapeError) <a title="View Source" href="https://github.com/golang/go/blob/master/src/net/url/url.go?name=release#61">Error</a> <a class="permalink" href="#pkg-index">¶</a></h4>
<pre class="funcdecl">func (e <a href="#EscapeError">EscapeError</a>) Error() <a href="http://godoc.org/builtin#string">string</a></pre>
<h3 id="URL">type <a title="View Source" href="https://github.com/golang/go/blob/master/src/net/url/url.go?name=release#230">URL</a> <a class="permalink" href="#pkg-index">¶</a></h3>
<pre>type URL struct {
<span id="URL.Scheme">Scheme</span> <a href="http://godoc.org/builtin#string">string</a>
<span id="URL.Opaque">Opaque</span> <a href="http://godoc.org/builtin#string">string</a> <span class="com">// 编码后的不透明数据</span>
<span id="URL.User">User</span> *<a href="#Userinfo">Userinfo</a> <span class="com">// 用户名和密码信息</span>
<span id="URL.Host">Host</span> <a href="http://godoc.org/builtin#string">string</a> <span class="com">// host或host:port</span>
<span id="URL.Path">Path</span> <a href="http://godoc.org/builtin#string">string</a>
<span id="URL.RawQuery">RawQuery</span> <a href="http://godoc.org/builtin#string">string</a> <span class="com">// 编码后的查询字符串,没有'?'</span>
<span id="URL.Fragment">Fragment</span> <a href="http://godoc.org/builtin#string">string</a> <span class="com">// 引用的片段(文档位置),没有'#'</span>
}</pre>
<p>URL类型代表一个解析后的URL(或者说,一个URL参照)。URL基本格式如下:</p>
<pre>scheme://[userinfo@]host/path[?query][#fragment]
</pre>
<p>scheme后不是冒号加双斜线的URL被解释为如下格式:</p>
<pre>scheme:opaque[?query][#fragment]
</pre>
<p>注意路径字段是以解码后的格式保存的,如/%47%6f%2f会变成/Go/。这导致我们无法确定Path字段中的斜线是来自原始URL还是解码前的%2f。除非一个客户端必须使用其他程序/函数来解析原始URL或者重构原始URL,这个区别并不重要。此时,HTTP服务端可以查询req.RequestURI,而HTTP客户端可以使用URL{Host: "example.com", Opaque: "//example.com/Go%2f"}代替{Host: "example.com", Path: "/Go/"}。</p>
<div class="panel-group">
<div class="panel panel-default" id="example-URL">
<div class="panel-heading" onclick="document.getElementById('ex-URL').style.display = document.getElementById('ex-URL').style.display=='none'?'block':'none';">Example</div>
<div id="ex-URL" class="panel-collapse collapse">
<div class="panel-body">
<pre>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)</pre>
<p>Output:
<pre>https://google.com/search?q=golang
</pre>
</div>
</div>
</div>
</div>
<h4 id="Parse">func <a title="View Source" href="https://github.com/golang/go/blob/master/src/net/url/url.go?name=release#333">Parse</a> <a class="permalink" href="#pkg-index">¶</a></h4>
<pre class="funcdecl">func Parse(rawurl <a href="http://godoc.org/builtin#string">string</a>) (url *<a href="#URL">URL</a>, err <a href="http://godoc.org/builtin#error">error</a>)</pre>
<p>Parse函数解析rawurl为一个URL结构体,rawurl可以是绝对地址,也可以是相对地址。</p>
<h4 id="ParseRequestURI">func <a title="View Source" href="https://github.com/golang/go/blob/master/src/net/url/url.go?name=release#353">ParseRequestURI</a> <a class="permalink" href="#pkg-index">¶</a></h4>
<pre class="funcdecl">func ParseRequestURI(rawurl <a href="http://godoc.org/builtin#string">string</a>) (url *<a href="#URL">URL</a>, err <a href="http://godoc.org/builtin#error">error</a>)</pre>
<p>ParseRequestURI函数解析rawurl为一个URL结构体,本函数会假设rawurl是在一个HTTP请求里,因此会假设该参数是一个绝对URL或者绝对路径,并会假设该URL没有#fragment后缀。(网页浏览器会在去掉该后缀后才将网址发送到网页服务器)</p>
<h4 id="URL.IsAbs">func (*URL) <a title="View Source" href="https://github.com/golang/go/blob/master/src/net/url/url.go?name=release#624">IsAbs</a> <a class="permalink" href="#pkg-index">¶</a></h4>
<pre class="funcdecl">func (u *<a href="#URL">URL</a>) IsAbs() <a href="http://godoc.org/builtin#bool">bool</a></pre>
<p>函数在URL是绝对URL时才返回真。</p>
<h4 id="URL.Query">func (*URL) <a title="View Source" href="https://github.com/golang/go/blob/master/src/net/url/url.go?name=release#677">Query</a> <a class="permalink" href="#pkg-index">¶</a></h4>
<pre class="funcdecl">func (u *<a href="#URL">URL</a>) Query() <a href="#Values">Values</a></pre>
<p>Query方法解析RawQuery字段并返回其表示的Values类型键值对。</p>
<h4 id="URL.RequestURI">func (*URL) <a title="View Source" href="https://github.com/golang/go/blob/master/src/net/url/url.go?name=release#684">RequestURI</a> <a class="permalink" href="#pkg-index">¶</a></h4>
<pre class="funcdecl">func (u *<a href="#URL">URL</a>) RequestURI() <a href="http://godoc.org/builtin#string">string</a></pre>
<p>RequestURI方法返回编码好的path?query或opaque?query字符串,用在HTTP请求里。</p>
<h4 id="URL.String">func (*URL) <a title="View Source" href="https://github.com/golang/go/blob/master/src/net/url/url.go?name=release#443">String</a> <a class="permalink" href="#pkg-index">¶</a></h4>
<pre class="funcdecl">func (u *<a href="#URL">URL</a>) String() <a href="http://godoc.org/builtin#string">string</a></pre>
<p>String将URL重构为一个合法URL字符串。</p>
<h4 id="URL.Parse">func (*URL) <a title="View Source" href="https://github.com/golang/go/blob/master/src/net/url/url.go?name=release#631">Parse</a> <a class="permalink" href="#pkg-index">¶</a></h4>
<pre class="funcdecl">func (u *<a href="#URL">URL</a>) Parse(ref <a href="http://godoc.org/builtin#string">string</a>) (*<a href="#URL">URL</a>, <a href="http://godoc.org/builtin#error">error</a>)</pre>
<p align="left">Parse方法以u为上下文来解析一个URL,ref可以是绝对或相对URL。</p>
<p align="left">本方法解析失败会返回nil, err;否则返回结果和ResolveReference一致。</p>
<h4 id="URL.ResolveReference">func (*URL) <a title="View Source" href="https://github.com/golang/go/blob/master/src/net/url/url.go?name=release#645">ResolveReference</a> <a class="permalink" href="#pkg-index">¶</a></h4>
<pre class="funcdecl">func (u *<a href="#URL">URL</a>) ResolveReference(ref *<a href="#URL">URL</a>) *<a href="#URL">URL</a></pre>
<p>本方法根据一个绝对URI将一个URI补全为一个绝对URI,参见<a href="http://tools.ietf.org/html/rfc3986">RFC 3986</a> 节 5.2。参数ref可以是绝对URI或者相对URI。ResolveReference总是返回一个新的URL实例,即使该实例和u或者ref完全一样。如果ref是绝对URI,本方法会忽略参照URI并返回ref的一个拷贝。</p>
<h3 id="Userinfo">type <a title="View Source" href="https://github.com/golang/go/blob/master/src/net/url/url.go?name=release#261">Userinfo</a> <a class="permalink" href="#pkg-index">¶</a></h3>
<pre>type Userinfo struct {
<span class="com">// 内含隐藏或非导出字段</span>
}</pre>
<p>Userinfo类型是一个URL的用户名和密码细节的一个不可修改的封装。一个真实存在的Userinfo值必须保证有用户名(但根据 <a href="http://tools.ietf.org/html/rfc2396">RFC 2396</a>可以是空字符串)以及一个可选的密码。</p>
<h4 id="User">func <a title="View Source" href="https://github.com/golang/go/blob/master/src/net/url/url.go?name=release#242">User</a> <a class="permalink" href="#pkg-index">¶</a></h4>
<pre class="funcdecl">func User(username <a href="http://godoc.org/builtin#string">string</a>) *<a href="#Userinfo">Userinfo</a></pre>
<p>User函数返回一个用户名设置为username的不设置密码的*Userinfo。</p>
<h4 id="UserPassword">func <a title="View Source" href="https://github.com/golang/go/blob/master/src/net/url/url.go?name=release#253">UserPassword</a> <a class="permalink" href="#pkg-index">¶</a></h4>
<pre class="funcdecl">func UserPassword(username, password <a href="http://godoc.org/builtin#string">string</a>) *<a href="#Userinfo">Userinfo</a></pre>
<p align="left">UserPassword函数返回一个用户名设置为username、密码设置为password的*Userinfo。</p>
<p align="left">这个函数应该只用于老式的站点,因为风险很大,不建议使用,参见<a href="http://tools.ietf.org/html/rfc2396">RFC 2396</a>。</p>
<h4 id="Userinfo.Username">func (*Userinfo) <a title="View Source" href="https://github.com/golang/go/blob/master/src/net/url/url.go?name=release#268">Username</a> <a class="permalink" href="#pkg-index">¶</a></h4>
<pre class="funcdecl">func (u *<a href="#Userinfo">Userinfo</a>) Username() <a href="http://godoc.org/builtin#string">string</a></pre>
<p>Username方法返回用户名。</p>
<h4 id="Userinfo.Password">func (*Userinfo) <a title="View Source" href="https://github.com/golang/go/blob/master/src/net/url/url.go?name=release#273">Password</a> <a class="permalink" href="#pkg-index">¶</a></h4>
<pre class="funcdecl">func (u *<a href="#Userinfo">Userinfo</a>) Password() (<a href="http://godoc.org/builtin#string">string</a>, <a href="http://godoc.org/builtin#bool">bool</a>)</pre>
<p>如果设置了密码返回密码和真,否则会返回假。</p>
<h4 id="Userinfo.String">func (*Userinfo) <a title="View Source" href="https://github.com/golang/go/blob/master/src/net/url/url.go?name=release#282">String</a> <a class="permalink" href="#pkg-index">¶</a></h4>
<pre class="funcdecl">func (u *<a href="#Userinfo">Userinfo</a>) String() <a href="http://godoc.org/builtin#string">string</a></pre>
<p>String方法返回编码后的用户信息,格式为"username[:password]"。</p>
<h3 id="Values">type <a title="View Source" href="https://github.com/golang/go/blob/master/src/net/url/url.go?name=release#482">Values</a> <a class="permalink" href="#pkg-index">¶</a></h3>
<pre>type Values map[<a href="http://godoc.org/builtin#string">string</a>][]<a href="http://godoc.org/builtin#string">string</a></pre>
<p>Values将建映射到值的列表。它一般用于查询的参数和表单的属性。不同于http.Header这个字典类型,Values的键是大小写敏感的。</p>
<div class="panel-group">
<div class="panel panel-default" id="example-Values">
<div class="panel-heading" onclick="document.getElementById('ex-Values').style.display = document.getElementById('ex-Values').style.display=='none'?'block':'none';">Example</div>
<div id="ex-Values" class="panel-collapse collapse">
<div class="panel-body">
<pre>v := url.Values{}
v.Set("name", "Ava")
v.Add("friend", "Jess")
v.Add("friend", "Sarah")
v.Add("friend", "Zoe")
<span class="com">// v.Encode() == "name=Ava&friend=Jess&friend=Sarah&friend=Zoe"</span>
fmt.Println(v.Get("name"))
fmt.Println(v.Get("friend"))
fmt.Println(v["friend"])</pre>
<p>Output:
<pre>Ava
Jess
[Jess Sarah Zoe]
</pre>
</div>
</div>
</div>
</div>
<h4 id="ParseQuery">func <a title="View Source" href="https://github.com/golang/go/blob/master/src/net/url/url.go?name=release#521">ParseQuery</a> <a class="permalink" href="#pkg-index">¶</a></h4>
<pre class="funcdecl">func ParseQuery(query <a href="http://godoc.org/builtin#string">string</a>) (m <a href="#Values">Values</a>, err <a href="http://godoc.org/builtin#error">error</a>)</pre>
<p>ParseQuery函数解析一个URL编码的查询字符串,并返回可以表示该查询的Values类型的字典。本函数总是返回一个包含了所有合法查询参数的非nil字典,err用来描述解码时遇到的(如果有)第一个错误。</p>
<h4 id="Values.Get">func (Values) <a title="View Source" href="https://github.com/golang/go/blob/master/src/net/url/url.go?name=release#488">Get</a> <a class="permalink" href="#pkg-index">¶</a></h4>
<pre class="funcdecl">func (v <a href="#Values">Values</a>) Get(key <a href="http://godoc.org/builtin#string">string</a>) <a href="http://godoc.org/builtin#string">string</a></pre>
<p>Get会获取key对应的值集的第一个值。如果没有对应key的值集会返回空字符串。获取值集请直接用map。</p>
<h4 id="Values.Set">func (Values) <a title="View Source" href="https://github.com/golang/go/blob/master/src/net/url/url.go?name=release#501">Set</a> <a class="permalink" href="#pkg-index">¶</a></h4>
<pre class="funcdecl">func (v <a href="#Values">Values</a>) Set(key, value <a href="http://godoc.org/builtin#string">string</a>)</pre>
<p>Set方法将key对应的值集设为只有value,它会替换掉已有的值集。</p>
<h4 id="Values.Add">func (Values) <a title="View Source" href="https://github.com/golang/go/blob/master/src/net/url/url.go?name=release#507">Add</a> <a class="permalink" href="#pkg-index">¶</a></h4>
<pre class="funcdecl">func (v <a href="#Values">Values</a>) Add(key, value <a href="http://godoc.org/builtin#string">string</a>)</pre>
<p>Add将value添加到key关联的值集里原有的值的后面。</p>
<h4 id="Values.Del">func (Values) <a title="View Source" href="https://github.com/golang/go/blob/master/src/net/url/url.go?name=release#512">Del</a> <a class="permalink" href="#pkg-index">¶</a></h4>
<pre class="funcdecl">func (v <a href="#Values">Values</a>) Del(key <a href="http://godoc.org/builtin#string">string</a>)</pre>
<p>Del删除key关联的值集。</p>
<h4 id="Values.Encode">func (Values) <a title="View Source" href="https://github.com/golang/go/blob/master/src/net/url/url.go?name=release#563">Encode</a> <a class="permalink" href="#pkg-index">¶</a></h4>
<pre class="funcdecl">func (v <a href="#Values">Values</a>) Encode() <a href="http://godoc.org/builtin#string">string</a></pre>
<p>Encode方法将v编码为url编码格式("bar=baz&foo=quux"),编码时会以键进行排序。</p>
</div>
<div id="x-footer" class="clearfix">
<div class="container">
<a href="http://studygolang.com/" target="_blank">Go语言中文网</a>
<span class="text-muted">|</span> <a href="http://golang.org/" target="_blank">Go Language</a>
<span class="pull-right"><a href="#">Back to top</a></span>
</div>
</div>
<script src="../assets/jquery-2.0.3.min.js"></script>
<script src="../assets/bootstrap.min.js"></script>
<script src="../assets/site.js"></script>
</body>
</html>