当前位置: 首页 > 面试题库 >

golang`http.Request`的`Host`和`URL.Host`之间有什么区别?

濮君植
2023-03-14
问题内容

开发golang
http应用程序时,我经常使用http.Request。访问请求主机地址时,我会使用req.Host,但是我发现有req.URL.Host字段,但是当我打印它时,它是空的。

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请求示例的答案是最好的。提前致谢。


问题答案:

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

r.Host字段是主机请求标头的值。它与call的值相同r.Header.Get("Host")

如果网上的HTTP请求是:

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

然后r.URL.Host是“”和r.Hostwww.example.org:8080

的价值r.URL.Hostr.Host几乎都是不同的。在代理服务器上,r.URL.Host是目标服务器r.Host的主机,也是代理服务器本身的主机。当不通过代理连接时,客户端不会在请求URI中指定主机。在这种情况下,r.URL.Host是空字符串。

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



 类似资料:
  • 问题内容: 在Go语言中, 是一个字符串数组 并且我们也将其用作参数。 有什么区别? 功能定义: 我可以像下面这样调用此函数吗? 问题答案: 是一个字符串数组 从技术上讲,这是引用基础数组的切片 并且我们也将其用作参数。 有什么区别? 关于结构,真的没有。两种语法得出的数据类型相同。 该参数语法形成了可变参数的参数。它将接受零个或多个参数,并将它们作为切片引用。 关于调用,您可以使用以下语法将字符

  • 问题内容: 在此示例中: 无法编译为: 而被编译器接受。 这个答案说明唯一的区别是,与不同,它允许您稍后引用类型,似乎并非如此。 是什么区别,并在这种情况下,为什么不第一编译? 问题答案: 通过使用以下签名定义方法: 并像这样调用它: 在jls§8.1.2中,我们发现(有趣的部分被我加粗了): 通用类声明定义了一组参数化类型(第4.5节), 每种可能通过类型arguments调用类型参数节的类型

  • 问题内容: 今天,我按照一些说明在Linux中安装软件。有一个脚本需要首先运行。它设置一些环境变量。 指令告诉我要执行,但是我执行错误了。因此未设置环境。最后,我注意到了这一点并继续进行。 我想知道这两种调用脚本方法的区别。我对Linux完全陌生,所以请尽可能详细。 问题答案: 运行脚本,将启动一个新的运行脚本的外壳。新的外壳程序不会影响启动脚本的父外壳程序。 是的简写形式,它将在当前shell中

  • 问题内容: 我刚开始使用Spring。我遇到了很多教程。我看到使用更多的例子比。我查看了Spring文档,但无法弄清楚使用其中一个的好处。有人可以提供一些解释吗? 问题答案: 是的便捷子类。 JavaDoc描述了一些添加的属性,这些属性在某些情况下可能有用: UrlBasedViewResolver的便利子类,它支持InternalResourceView(即Servlet和JSP)以及诸如Jst

  • 问题内容: 我刚刚看到了包含标签的CSS代码。我看着MDN看看是什么,但我真的不明白。 有人可以解释它是如何工作的吗? 它会在我们通过CSS选择之前创建DOM元素吗? 问题答案: 根据这些文档,它们是等效的: 唯一的区别是CSS3中使用了双冒号,而单冒号是旧版本。 推理: CSS 3中引入了:: before表示法,以便在伪类和伪元素之间建立区别。浏览器还接受:在CSS 2中引入的表示法。

  • 问题内容: 以下哪个更好? 要么 我知道的唯一区别是,当“ a”为null时,第一个返回false,而第二个抛出异常。除此之外,它们是否总是给出相同的结果? 问题答案: 使用时,你需要B在编译时知道类。使用时可以是动态的,并且可以在运行时更改。