06-HTTP客户端

package main
import (
	"fmt"
	"io"
	"net/http"
)

func main(){
	//获取服务器应答包内容
	resp,err := http.Get( "http://www.baidu.com")
	if err != nil {
		fmt.Println( "http.Get err:", err)
		return
	}
	defer resp.Body.Close()
	//简单查看应答包
	fmt.Println( "Header :", resp.Header)
	fmt.Println(  "Status:", resp.Status)
	fmt.Println(  "Header :", resp.StatusCode)
	fmt.Println( "Proto:", resp.Proto)
	buf := make([]byte,4096)
	var result string
	var sum int
	var i int
	for {
		i ++
		n,err := resp.Body.Read(buf)
		sum += n
		//if n < 4096 {
		//	fmt.Println("--读完了00----Read finish < 4096 ",err)
		//	break
		//}
		if n == 0 {
			fmt.Println("---读完了01---Read finish == 0",err)
			break
		}

		// err != io.EOF 如果一次读取500字节,当读取最后只有320个时,err就被赋值io.EOF,下一次 读取个数为0,网络中常用n==0,判断读取完,文档中常用io.EOF
		if err != nil && err != io.EOF{ // err==io.EOF表示读完了
			fmt.Println("Body.Read err:", err)
			break
		}

		if n == 0 {
			fmt.Println("你好啊",i)
			break
		}
		result += string(buf[:n])
	}
	//fmt.Printf("|%v|\n",result)
	fmt.Printf("|字数%v|\n",sum)
}

/*
type Response struct {
    Status     string // 例如"200 OK"
    StatusCode int    // 例如200
    Proto      string // 例如"HTTP/1.0"
    ProtoMajor int    // 例如1
    ProtoMinor int    // 例如0
    // Header保管头域的键值对。
    // 如果回复中有多个头的键相同,Header中保存为该键对应用逗号分隔串联起来的这些头的值
    // (参见RFC 2616 Section 4.2)
    // 被本结构体中的其他字段复制保管的头(如ContentLength)会从Header中删掉。
    //
    // Header中的键都是规范化的,参见CanonicalHeaderKey函数
    Header Header
    // Body代表回复的主体。
    // Client类型和Transport类型会保证Body字段总是非nil的,即使回复没有主体或主体长度为0。
    // 关闭主体是调用者的责任。
    // 如果服务端采用"chunked"传输编码发送的回复,Body字段会自动进行解码。
    Body io.ReadCloser
    // ContentLength记录相关内容的长度。
    // 其值为-1表示长度未知(采用chunked传输编码)
    // 除非对应的Request.Method是"HEAD",其值>=0表示可以从Body读取的字节数
    ContentLength int64
    // TransferEncoding按从最外到最里的顺序列出传输编码,空切片表示"identity"编码。
    TransferEncoding []string
    // Close记录头域是否指定应在读取完主体后关闭连接。(即Connection头)
    // 该值是给客户端的建议,Response.Write方法的ReadResponse函数都不会关闭连接。
    Close bool
    // Trailer字段保存和头域相同格式的trailer键值对,和Header字段相同类型
    Trailer Header
    // Request是用来获取此回复的请求
    // Request的Body字段是nil(因为已经被用掉了)
    // 这个字段是被Client类型发出请求并获得回复后填充的
    Request *Request
    // TLS包含接收到该回复的TLS连接的信息。 对未加密的回复,本字段为nil。
    // 返回的指针是被(同一TLS连接接收到的)回复共享的,不应被修改。
    TLS *tls.ConnectionState
}

*/
posted @ 2022-03-18 18:51  ty1539  阅读(25)  评论(0编辑  收藏  举报