HTTP状态码
当你得到一个值的时候,如果你想要知道这个值代表的是什么状态,可以使用:
func StatusText
func StatusText(code int) string
StatusText返回HTTP状态码code对应的文本,如220对应"OK"。如果code是未知的状态码,会返回""。
package main
import(
"fmt"
"net/http"
func main() {
sta1 := http.StatusText(307)
sta2 := http.StatusText(200)
fmt.Println(sta1) //Temporary Redirect
fmt.Println(sta2) //OK
var DefaultClient = &Client{}
DefaultClient是用于包函数Get、Head和Post的默认Client。
var DefaultServeMux = NewServeMux()
DefaultServeMux是用于Serve的默认ServeMux。
func CanonicalHeaderKey(s string) string
CanonicalHeaderKey函数返回头域(表示为Header类型)的键s的规范化格式。规范化过程中让单词首字母和'-'后的第一个字母大写,其余字母小写。例如,"accept-encoding"规范化为"Accept-Encoding"。
package main
import(
"fmt"
"net/http"
func main() {
hea1 := http.CanonicalHeaderKey("uid-test")
hea2 := http.CanonicalHeaderKey("accept-encoding")
fmt.Println(hea1) //Uid-Test
fmt.Println(hea2) //Accept-Encoding
func DetectContentType
func DetectContentType(data []byte) string
DetectContentType函数实现了http://mimesniff.spec.whatwg.org/描述的算法,用于确定数据的Content-Type。函数总是返回一个合法的MIME类型;如果它不能确定数据的类型,将返回"application/octet-stream"。它最多检查数据的前512字节。
出处:https://www.cnblogs.com/52fhy/p/5436673.html
Http Header里的Content-Type一般有这三种:
application/x-www-form-urlencoded:数据被编码为名称/值对。这是标准的编码格式。
multipart/form-data: 数据被编码为一条消息,页上的每个控件对应消息中的一个部分。
text/plain: 数据以纯文本形式(text/json/xml/html)进行编码,其中不含任何控件或格式字符。postman软件里标的是RAW。
网页中form的enctype属性为编码方式,常用有两种:
application/x-www-form-urlencoded,默认编码方式
multipart/form-data
1)当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2...),然后把这个字串追加到url后面,用?分割,加载这个新的url。
2)当action为post时候,浏览器把form数据封装到http
body中,然后发送到server。
如果没有type=file的控件,用默认的application/x-www-form-urlencoded就可以了。
但是如果有type=file的话,就要用到multipart/form-data了。
3)当action为post且Content-Type类型是multipart/form-data,浏览器会把整个表单以控件为单位分割,并为每个部分加上Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件name)等信息,并加上分割符(boundary)。
4)当然还有很多其他的类型,可以查看http://www.runoob.com/http/http-content-type.html
因此可以使用DetectContentType来检测传入的[]byte类型的数据是哪种Content-Type,举例说明:\
package main
import(
"fmt"
"net/http"
func main() {
cont1 := http.DetectContentType([]byte{}) //text/plain; charset=utf-8
cont2 := http.DetectContentType([]byte{1, 2, 3}) //application/octet-stream
cont3 := http.DetectContentType([]byte(`<HtMl><bOdY>blah blah blah</body></html>`)) //text/html; charset=utf-8
cont4 := http.DetectContentType([]byte("\n<?xml!")) //text/xml; charset=utf-8
cont5 := http.DetectContentType([]byte(`GIF87a`)) //image/gif
cont6 := http.DetectContentType([]byte("MThd\x00\x00\x00\x06\x00\x01")) //audio/midi
fmt.Println(cont1)
fmt.Println(cont2)
fmt.Println(cont3)
fmt.Println(cont4)
fmt.Println(cont5)
fmt.Println(cont6)
const TimeFormat = "Mon, 02 Jan 2006 15:04:05 GMT"
TimeFormat是当解析或生产HTTP头域中的时间时,用与time.Parse或time.Format函数的时间格式。这种格式类似time.RFC1123但强制采用GMT时区。
func ParseTime
func ParseTime(text string) (t time.Time, err error)
ParseTime用3种格式TimeFormat, time.RFC850和time.ANSIC尝试解析一个时间头的值(如Date: header)。
package main
import(
"fmt"
"net/http"
"time"
var parseTimeTests = []struct {
h http.Header
err bool
{http.Header{"Date": {""}}, true},
{http.Header{"Date": {"invalid"}}, true},
{http.Header{"Date": {"1994-11-06T08:49:37Z00:00"}}, true},
{http.Header{"Date": {"Sun, 06 Nov 1994 08:49:37 GMT"}}, false},
{http.Header{"Date": {"Sunday, 06-Nov-94 08:49:37 GMT"}}, false},
{http.Header{"Date": {"Sun Nov 6 08:49:37 1994"}}, false},
func main() {
expect := time.Date(1994, 11, 6, 8, 49, 37, 0, time.UTC)
fmt.Println(expect) //1994-11-06 08:49:37 +0000 UTC
for i, test := range parseTimeTests {
d, err := http.ParseTime(test.h.Get("Date"))
fmt.Println(d)
if err != nil {
fmt.Println(i, err)
if !test.err { //test.err为false才进这里
fmt.Errorf("#%d:\n got err: %v", i, err)
continue //有错的进入这后继续下一个循环,不往下执行
if test.err { //test.err为true,所以该例子中这里不会进入
fmt.Errorf("#%d:\n should err", i)
continue
if !expect.Equal(d) { //说明后三个例子的结果和expect是相同的,所以没有报错
fmt.Errorf("#%d:\n got: %v\nwant: %v", i, d, expect)
userdeMBP:go-learning user$ go run test.go
1994-11-06 08:49:37 +0000 UTC
0001-01-01 00:00:00 +0000 UTC //默认返回的空值
0 parsing time "" as "Mon Jan _2 15:04:05 2006": cannot parse "" as "Mon"
0001-01-01 00:00:00 +0000 UTC
1 parsing time "invalid" as "Mon Jan _2 15:04:05 2006": cannot parse "invalid" as "Mon"
0001-01-01 00:00:00 +0000 UTC
2 parsing time "1994-11-06T08:49:37Z00:00" as "Mon Jan _2 15:04:05 2006": cannot parse "1994-11-06T08:49:37Z00:00" as "Mon"
1994-11-06 08: