Golang中"net/http"的客户端HTTP请求和服务器HTTP请求的区别是什么?

4
我曾看到有人在测试API时使用"net/http"包的NewRequest()方法。为什么不使用"net/http/httptest"中的NewRequest()方法呢?它们之间有什么区别?文档建议如下:httptest.go
// To generate a client HTTP request instead of a server request, see
// the NewRequest function in the net/http package.

在处理cookie方面,两者有什么区别呢?它们看起来非常相似。

2
Request 字段和方法文档指出了客户端使用和服务器使用之间的区别。httptest.NewRequest 初始化一个请求,就好像它已经在服务器上接收到一样。http.NewRequest 初始化一个用于客户端使用的请求。 - Charlie Tumahai
1个回答

5
TL;DR:它们是相同类型,用于两种不同的用例并以不同的方式初始化以服务这些用例。
区别只在于用法——它们是相同类型的http.Requesthttp.NewRequest 用于更多“生产”用例,即客户端——“创建一个新请求发送到服务器”。编写HTTP服务器时,有时会创建用于测试的请求,这就是httptest.NewRequest的作用。这里http.NewRequest的文档很有帮助:
“NewRequest返回适用于Client.Do或Transport.RoundTrip的请求。要创建用于测试Server Handler的请求,请使用net/http/httptest包中的NewRequest函数、使用ReadRequest,或手动更新Request字段。请参阅Request类型的文档,了解入站和出站请求字段之间的差异。”
如果您查看http.Request type的文档,您会发现像这样的内容:
// URL specifies either the URI being requested (for server
// requests) or the URL to access (for client requests).
//
// For server requests, the URL is parsed from the URI
// supplied on the Request-Line as stored in RequestURI.  For
// most requests, fields other than Path and RawQuery will be
// empty. (See RFC 7230, Section 5.3)
//
// For client requests, the URL's Host specifies the server to
// connect to, while the Request's Host field optionally
// specifies the Host header value to send in the HTTP
// request.
URL *url.URL

请注意“针对客户端请求”与“针对服务器请求”的区别。
如果您看到某个地方没有使用httptest.NewRequest,可能是因为:
1.他们不知道它的存在
2.或者他们需要更仔细的微调,http.NewRequest无法提供

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接