当前位置: 首页 > 知识库问答 >
问题:

'Host'和'URL. Host'for Go语言'http之间的区别是什么。请求?

南宫保臣
2023-03-14

在开发golang http应用程序时,我使用http。请求很多。当访问请求主机地址时,我将使用req。主机,但我发现有请求。网址。主机字段,但当我打印它时,它是空的。

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Println("uri Host: " + r.URL.Host + " Scheme: " + r.URL.Scheme)
    fmt.Println("Host: " + r.Host)
}

http的文档。Request给出了以下注释,而net/url没有给出多少线索。

// For server requests Host specifies the host on which the
// URL is sought. Per RFC 2616, this is either the value of
// the "Host" header or the host name given in the URL itself.
// It may be of the form "host:port". For international domain
// names, Host may be in Punycode or Unicode form. Use
// golang.org/x/net/idna to convert it to either format if
// needed.
//
// For client requests Host optionally overrides the Host
// header to send. If empty, the Request.Write method uses
// the value of URL.Host. Host may contain an international
// domain name.
Host string

在我看来,请求中有两个主机值:uri行和Host标头,如:

GET http://localhost:8080/ HTTP/1.1
Host: localhost:8080

但它并没有解决比它创造的更多的问题:

  1. 为什么请求中有两个不同的Host字段?我是说这不是一个复制品吗
  2. 同一请求中的两个Host字段是否可以不同
  3. 在什么情况下我应该使用哪一个

用一个真实的HTTP请求示例来回答将是最好的。提前谢谢。

共有2个答案

谷梁襦宗
2023-03-14

本质上是http。要求主机为方便起见。

r.hostr更容易调用。标题。获取("主机")r.URL. host.

还需要注意的是,一些路由器将主机从http剥离。要求URLsohttp。要求主机在这些情况下也很有用。

因此,它可以被认为是req。即使在其他地方修改了请求标头或url,Host也会提供Host值。

封昊天
2023-03-14

r.URL字段是通过解析HTTP请求URI创建的。

r.Host字段是主机请求头的值。它的值与调用r.Header的值相同。获取(“主机”)

如果连线上的HTTP请求为:

 GET /pub/WWW/TheProject.html HTTP/1.1
 Host: www.example.org:8080

然后r.URL。主机为“”,主机为www.example。组织:8080

r的值。URL. hostr.主机几乎总是不同的。在代理服务器上,r.URL. Host是目标服务器和r的主机。host是代理服务器本身的主机。当不通过代理连接时,客户端不会在请求URI中指定主机。在这个场景中,r.URL. Host是空字符串。

如果未实现代理,则应使用r.Host确定主机。

 类似资料:
  • 问题内容: 开发golang http应用程序时,我经常使用。访问请求主机地址时,我会使用,但是我发现有字段,但是当我打印它时,它是空的。 http.Request的文档提供了以下注释,但并没有提供太多线索。 在我看来,请求中有两个主机值:uri行和标头,例如: 但这并没有解决很多问题,它会带来很多问题: 为什么请求中有两个不同的字段?我的意思是这不是重复吗? 同一请求中两个字段可以不同吗? 在哪

  • 问题内容: 在阅读了有关该主题的一些资料之后,我仍然不确定编译语言和解释语言之间的区别。有人告诉我这是Java和JavaScript之间的区别之一。有人能帮我理解吗? 问题答案: 编译语言和解释语言之间有什么区别? 区别 不 在于语言。它在 执行中 。 从我的系统中得到了答案,这是一个答案: 在编译的实现中,原始程序被转换为本地机器指令,这些指令直接由硬件执行。 在解释的实现中,原始程序被翻译成其

  • 本文向大家介绍Java和C语言之间的区别,包括了Java和C语言之间的区别的使用技巧和注意事项,需要的朋友参考一下 Java和C都是编程世界中最流行的编程语言,由于它们的各种重要特征和特性,这两种语言都在全球范围内被广泛使用。 根据它们的功能,以下是Java和C之间的重要区别 序号 键 爪哇 C 1 介绍了 Java是在引入年份之后以C语言开发的,它是由James Gosling在1995年开发的

  • 在Java 7之前,JVM内存中有一个名为PermGen的区域,JVM以前在这里保存它的类。在Java 8中,它被移除并被称为元空间的区域所取代。 PermGen和Metaspace之间最重要的区别是什么? 我知道的唯一区别是,并且忽略了VM参数。

  • 和之间有什么区别? 是什么原因导致他们被扔?如何解决这些问题? 在修改现有代码以包含新的jar文件时,我经常会遇到这些可抛物。我在通过WebStart发布的一个Java应用程序的客户端和服务器端都碰到了它们。 我遇到的可能原因是: 代码客户端的中未包含的包 我们正在使用的新JAR缺少运行时类路径 版本与以前的JAR冲突 当我今天遇到这些问题时,我会采取跟踪和错误的方法来使事情正常工作。我需要更多的

  • 当我试图在Spring4.x上进行测试时,我使用了MockMvc web客户端,但我正在阅读和尝试Spring5.x的新特性。 我认为,WebTestClient和MockMvc是相同或非常相似的。 MockMvc和WebTestClient之间的区别是什么?