golang中net/http包用法

http包包含http客户端和服务端的实现,利用Get,Head,Post,以及PostForm实现HTTP或者HTTPS的请求.

当客户端使用完response body后必须使用close对其进行关闭.如下所示

resp, err := http.Get("http://example.com/")
if err != nil {
    // handle error
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
// ...

变量:

以下错误是http server使用的

var (
        ErrHeaderTooLong        = &ProtocolError{
    "header too long"}
        ErrShortBody            = &ProtocolError{
    "entity body too short"}
        ErrNotSupported         = &ProtocolError{
    "feature not supported"}
        ErrUnexpectedTrailer    = &ProtocolError{
    "trailer header without chunked transfer encoding"}
        ErrMissingContentLength = &ProtocolError{
    "missing ContentLength in HEAD response"}
        ErrNotMultipart         = &ProtocolError{
    "request Content-Type isn't multipart/form-data"}
        ErrMissingBoundary      = &ProtocolError{
    "no multipart boundary param in Content-Type"}
)

var (
        ErrWriteAfterFlush = errors.New("Conn.Write called after Flush")
        ErrBodyNotAllowed  = errors.New("http: request method or response status code does not allow body")
        ErrHijacked        = errors.New("Conn has been hijacked")
        ErrContentLength   = errors.New("Conn.Write wrote more than the declared Content-Length")
)
var DefaultClient = &Client{} //默认客户端,被Get,Head以及Post使用
var DefaultServeMux = NewServeMux()//Serve使用的默认ServeMux
var ErrBodyReadAfterClose = errors.New("http: invalid Read on closed Body")//当读取一个request或者response body是在这个body已经关闭之后,便会返回该错误.这种错误主要发生情况是:当http handler调用writeheader或者write关于responsewrite之后进行读操作.
var ErrHandlerTimeout = errors.New("http: Handler timeout")//超时错误
var ErrLineTooLong = internal.ErrLineTooLong//当读取格式错误的分块编码时便会出现该错误.
var ErrMissingFile = errors.New("http: no such file")//当利用FormFile进行文件请求时,如果文件不存在或者请求中没有该文件就会出现该错误.
var ErrNoCookie = errors.New("http: named cookie not present")

var ErrNoLocation = errors.New("http: no Location header in response")


函数:
func CanonicalHeaderKey(s string) string//返回header key的规范化形式,规范化形式是以"-"为分隔符,每一部分都是首字母大写,其他字母小写.例如"accept-encoding" 的标准化形式是 "Accept-Encoding".
func DetectContentType(data []byte) string//检查给定数据的内容类型Content-Type,最多检测512byte数据,如果有效的话,该函数返回一个MIME类型,否则的话,返回一个"application/octet-stream"

func Error(w ResponseWriter, error string, code int)//利用指定的错误信息和Http code来响应请求,其中错误信息必须是纯文本.
func NotFound(w ResponseWriter, r *Request)//返回HTTP404 not found错误

func Handle(pattern string, handler Handler)//将handler按照指定的格式注册到DefaultServeMux,ServeMux解释了模式匹配规则
func HandleFunc(pattern string, handler func(ResponseWriter, *Request))//同上, 主要用来实现动态文件内容的展示,这点与ServerFile()不同的地方。

func ListenAndServe(addr string, handler Handler) error//监听TCP网络地址addr然后调用具有handler的Serve去处理连接请求.通常情况下Handler是nil,使用默认的DefaultServeMux
func ListenAndServeTLS(addr string, certFile string, keyFile string, handler Handler) error//该函数与ListenAndServe功能基本相同,二者不同之处是该函数需要HTTPS连接.也就是说,必须给该服务Serve提供一个包含整数的秘钥的文件,如果证书是由证书机构签署的,那么证书文件必须是服务证书之后跟着CA证书.

func ServeFile(w ResponseWriter, r *Request, name string)//利用指定的文件或者目录的内容来响应相应的请求.
func SetCookie(w ResponseWriter, cookie *Cookie)//给w设定cookie
func StatusText(code int) string//对于http状态码返回文本表示,如果这个code未知,则返回空的字符串.


举例说明上述函数使用方法:
package main

import (
    "fmt"
    "net/http"
)

func Test(w http.ResponseWriter, r *http.Request) {
    // http.NotFound(w, r)//用于设置404问题
    // http.Error(w, "404 page not found", 404) //状态码需和描述相符

    http.ServeFile(w, r, "1.txt") //将1.txt中内容在w中显示.
    cookie := &http.Cookie{
        Name:  http.CanonicalHeaderKey("uid-test"), //Name值为Uid-Test
        Value: "1234",
    }
    r.AddCookie(cookie)
    fmt.Println(r.Cookie("uid-test")) //<nil> http: named cookie not present
    fmt.Println(r.Cookie("Uid-Test")) //Uid-Test=1234 <nil>
    fmt.Println(r.Cookies())          //[Uid-Test=1234]

}
func main() {

    stat := http.StatusText(200)
    fmt.Println(stat) //状态码200对应的状态OK

    stringtype := http.DetectContentType([]byte("test"))
    fmt.Println(stringtype) //text/plain; charset=utf-8

    http.HandleFunc("/test", Test)
    err := http.ListenAndServe(":9999", nil)
    if err != nil {
        fmt.Println(err)
    }

}

func MaxBytesReader(w ResponseWriter, r io.ReadCloser, n int64) io.ReadCloser//该函数类似于io.LimitReader但是该函数是用来限制请求体的大小.与io.LimitReader不同的是,该函数返回一个ReaderCloser,当读超过限制时,返回一个non-EOF,并且当Close方法调用时,关闭底层的reader.该函数组织客户端恶意发送大量请求,浪费服务器资源.

func ParseHTTPVersion(vers string) (major, minor int, ok bool)//解析http字符串版本进行解析,"HTTP/1.0" 返回 (1, 0, true)// 注解析的字符串必须以HTTP开始才能够正确解析,HTTP区分大小写,其他诸如http或者Http都不能够正确解析。
func ParseTime(text string) (t time.Time, err error)//解析时间头(例如data:header),解析格式如下面三种(HTTP/1.1中允许的):TimeFormat, time.RFC850, and time.ANSIC

func ProxyFromEnvironment(req *Request) (*url.URL, error)//该函数返回一个指定请求的代理URL,这是由环境变量HTTP_PROXY,HTTPS_PROXY以及NO_PROXY决定的,对于https请求,HTTPS_PROXY优先级高于HTTP_PROXY,环境值可能是一个URL或者一个host:port,其中这两种类型都是http调度允许的,如果不是这两种类型的数值便会返回错误.如果在环境中没有定义代理或者代理不应该用于该请求(定义为NO_PROXY),将会返回一个nil URL和一个nil error.作为一个特例,如果请求rul是"localhost",无论有没有port,那么将返回一个nil rul和一个nil error.
func ProxyURL(fixedURL *url.URL) func(*Request) (*url.URL, error)//返回一个用于传输的代理函数,该函数总是返回相同的URL
func Redirect(w ResponseWriter, r *Request, urlStr string, code int)//返回一个重定向的url给指定的请求,这个重定向url可能是一个相对请求路径的一个相对路径.
func Serve(l net.Listener, handler Handler) error//该函数接受listener l的传入http连接,对于每一个连接创建一个新的服务协程,这个服务协程读取请求然后调用handler来给他们响应.handler一般为nil,这样默认的DefaultServeMux被使用.
func ServeContent(w ResponseWriter, req *Request, name string, modtime time.Time, content io.ReadSeeker)//该函数使用提供的ReaderSeeker提供的内容来恢复请求,该函数相对于io.Copy的优点是可以处理范围类请求,设定MIME类型,并且处理了If-Modified-Since请求.如果未设定content-type类型,该函数首先通过文件扩展名来判断类型,如果失效的话,读取content的第一块数据并将他传递给DetectContentType进行类型判断.name可以不被使用,更进一步说,他可以为空并且不在respone中返回.如果modtime不是0时间,该时间则体现在response的最后一次修改的header中,如果请求包括一个If-Modified-Since header,该函数利用modtime来决定是否发送该content.该函数利用Seek功能来决定content的大小.




type Client//Client是一个http客户端,默认客户端(DefaultClient)将使用默认的发送机制的客户端.Client的Transport字段一般会含有内部状态(缓存TCP连接),因此Client类型值应尽量被重用而不是创建新的。多个协程并发使用Clients是安全的.
type Client struct {
    // Transport指定执行独立、单次HTTP请求的机制如果Transport为nil,则使用DefaultTransport。
    Transport RoundTripper
    // CheckRedirect指定处理重定向的策略,如果CheckRedirect非nil,client将会在调用重定向之前调用它。
    // 参数req和via是将要执行的请求和已经执行的请求(时间越久的请求优先执行),如果CheckRedirect返回一个错误,
   //client的GetGet方法不会发送请求req,而是回之前得到的响应和该错误。
    // 如果CheckRedirect为nil,会采用默认策略:在连续10次请求后停止。
    CheckRedirect func(req *Request, via []*Request) error
    // Jar指定cookie管理器,如果Jar为nil,在请求中不会发送cookie,在回复中cookie也会被忽略。
    Jar CookieJar
    // Timeout指定Client请求的时间限制,该超时限制包括连接时间、重定向和读取response body时间。
    // 计时器会在Head,Get,Post或Do方法返回后开始计时并在读到response.body后停止计时。
  // Timeout为零值表示不设置超时。
    // Client的Transport字段必须支持CancelRequest方法,否则Client会在尝试用Head,Get,Post或Do方法执行请求时返回错误。
    // Client的Transport字段默认值(DefaultTransport)支持CancelRequest方法。
    Timeout time.Duration
}
    func (c *Client) Do(req *Request) (resp *Response, err error)//Do发送http请求并且返回一个http响应,遵守client的策略,如重定向,cookies以及auth等.错误经常是由于策略引起的,当err是nil时,resp总会包含一个非nil的resp.body.当调用者读完resp.body之后应该关闭它,如果resp.body没有关闭,则Client底层RoundTripper将无法重用存在的TCP连接去服务接下来的请求,如果resp.body非nil,则必须对其进行关闭.通常来说,经常使用Get,Post,或者PostForm来替代Do.
    func (c *Client) Get(url
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值