Golong——http

1.服务器:响应客户端的请求
法1:

package main

import (
	"log"
	"net/http"
)

type server int

func (h *server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	log.Println(r.URL.Path)
	w.Write([]byte("Hello World!"))
}

func main() {
	var s server
	http.ListenAndServe("localhost:9999", &s)
}

1)主函数:调用 http.ListenAndServe
func ListenAndServe(address string, h Handler) error
第一个参数:表示在 9999 端口启动 http 服务,服务器在本地的此端口监听
第二个参数:代表处理HTTP请求的实例,类型时Handler。
nil 代表使用标准库中的实例处理请求,上面的代码处理请求的对象为 s server
2)Handler是什么?是一个接口
任何实现了此接口中方法的类型,都可以作为ListenAndServe的第二个参数

type Handler interface {
    ServeHTTP(w ResponseWriter, r *Request)
}

第一个参数 响应:ResponseWriter ,利用 ResponseWriter 构造对请求的响应内容。发送给客户端的响应是 ResponseWriter对象
响应报文分为三部分:https://laravelacademy.org/post/21659
状态行:包含了 HTTP 协议版本和响应状态码,200 OK 表示响应成功
响应头:包含了 HTTP 响应的首部字段,比如内容类型/编码、缓存控制、Cookie 信息等
响应实体:返回的 XML/JSON 格式数据,对与 HTML 视图响应,就是一个标准的 HTML 文档

type ResponseWriter interface {
    // 用于设置响应状态码
	WriteHeader(statusCode int)
	
   // 用于设置/获取所有响应头信息
	Header() Header
	
   // 用于写入数据到响应实体
	Write([]byte) (int, error)
}

第二个参数 请求:*Request ,客户端请求信息都封装到了 Request 对象,该对象包含了该HTTP请求的所有的信息,比如请求地址、Header和Body等信息。

法2:
注册路由:
在web开发中,路由(route)是指根据url分配到对应的处理程序

func main() {
	http.HandleFunc("/", indexHandler)
	http.HandleFunc("/hello", helloHandler)
	log.Fatal(http.ListenAndServe(":9999", nil))
}

// handler echoes r.URL.Path
func indexHandler(w http.ResponseWriter, req *http.Request) {
	fmt.Fprintf(w, "URL.Path = %q\n", req.URL.Path)
}

// handler echoes r.URL.Header
func helloHandler(w http.ResponseWriter, req *http.Request) {
	for k, v := range req.Header {
		fmt.Fprintf(w, "Header[%q] = %q\n", k, v)
	}
}

2.客户端 net/url
url.QueryEscape: 将字符串转义,以便它可以安全地放置在 URL 查询中
查询字符串是URL的一部分,其中包含可以传递给Web应用程序的数据。该数据需要进行编码,并且使用url.QueryEscape进行编码

http.Get()

//基本的GET请求
package main
import (
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    resp, err := http.Get("http://httpbin.org/get")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
    fmt.Println(resp.StatusCode)
    if resp.StatusCode == 200 {
        fmt.Println("ok")
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值