HTTP Client HTTP客户端
Go标准库中的net/http包对HTTP客户端和服务器提供了极好的支持。
在本例中,我们将使用它来发出简单的HTTP请求。若要向服务器发出HTTP GET请求,使用函数http.Get是最便捷的方法,它创建http.Client对象并调用其Get方法;它使用的是http.DefaultClient对象,该对象具有默认设置。
程序中打印http响应状态,并打印响应正文的前5行。
结果:
$ go run http-clients.go
Response status: 200 OK
<!DOCTYPE html>
<html>
<head>
<meta charset=”utf-8″>
<title>Go by Example</title>
HTTP Server HTTP服务器
使用net/HTTP包很容易编写一个基本的HTTP服务器。net/HTTP服务器中的一个基本概念是handler处理器。处理器是实现http.handler接口的对象。
编写处理程序的常见方法是把包函数http.HandleFunc用作具有规定签名的函数的适配器。用作处理程序的函数必须采用http.ResponseWriter和http. Request 作为参数。响应编写器用于填充http响应。
在以下程序,hello处理程序只是一个简单响应返回”hello\n”。headers处理程序通过读取所有HTTP请求头并将它们回送到响应体中。
使用HTTP.HandleFunc便利函数在服务器路由上注册处理程序。它的作用是在net/http包中设置默认的路由。
最后,用端口和一个处理程序调用ListenAndServe。nil告诉服务器使用刚刚设置的默认路由。
结果:
$ go run http- server s.go &
$ curl localhost:8090/hello
hello
Context 上下文
HTTP服务器适合于用来演示context.Context的用法,该对象用来控制取消操作非常有用。上下文可以携带截止日期、取消信号和其他跨API边界和协程的值等一些与请求相关的信息。
net/http机制为每个HTTP请求创建一个context.Context,请求对象有一个Context方法返回上下文对象。
hello处理程序接收到请求后,监听定时器通道,等待10秒,模拟服务器正在进行的一些工作后再返回响应。同时,监听上下文的Done通道,以获取我们取消工作的信号并返回响应。上下文的Err方法返回一个错误,该错误解释了关闭Done通道的原因。
和以前一样,在“/hello”路由上注册处理程序,然后开始HTTP服务监听指定端口。在后台运行服务器,开始模拟对/hello页面的请求,然后按下Ctrl+C模拟中断请求信号,结果如下所示。
结果:
$ go run context-in-http-servers.go &
$ curl localhost:8090/hello
server: hello handler started
^C
server: context canceled
server: hello handler ended