为什么访问同一个网址却返回不同的内容

哈喽大家好,我是咸鱼。今天给大家分享一个关于 HTTP 有趣的现象

链接:https://csvbase.com/meripaterson/stock-exchanges

我们用浏览器访问这个链接,可以看到下面的网页
为什么访问同一个网址却返回不同的内容
但如果我们使用 curl 命令去访问这个链接呢?
为什么访问同一个网址却返回不同的内容
可以看到返回的是一个 csv 文件

我们用 wget 命令下载下来看看
为什么访问同一个网址却返回不同的内容
可以看到 text/csv 字段,表示下载了一个 csv 格式的文件

奇怪,同样的 url ,为什么浏览器返回的内容跟 curl、wget 命令返回的内容却不一样

内容协商

当 HTTP 客户端去发送响应给 HTTP 服务端的时候,响应里面会包含响应头(headers)

我们来看下 Google浏览器发送的响应头
为什么访问同一个网址却返回不同的内容
我们着重注意一下响应头里的 accept 字段
为什么访问同一个网址却返回不同的内容
这个 accept 报头是一个无序列表,它告诉了 HTTP 服务端应该返回什么媒体类型(又称内容类型或文件格式)的内容给我

以上面 Google 浏览器的 accept 报头为例:这段 accept 报头表示该请求中浏览器可接受的媒体类型(或文件格式)的偏好。从左到右,各类型的优先级逐渐降低

  • text/html: 浏览器首选的媒体类型,即 HTML 文本。
  • application/xhtml+xml: 次选的媒体类型,即 XHTML 文本。
  • application/xml;q=0.9: 服务器可以发送的 XML 类型的文本,但是客户端更愿意接收前面的两种媒体类型,所以权重为 0.9。
  • image/avif,image/webp,image/apng: 浏览器能够接受的图片类型,优先级逐渐降低。如果服务器返回多种可接受的图片类型,则浏览器将选择优先级最高的那个。
  • */*;q=0.8: 如果服务器无法以以上任何一种类型响应,则浏览器愿意接受任何类型,但是这个类型的优先级最低,只有 0.8。
  • application/signed-exchange;v=b3;q=0.7: 该媒体类型是用于实现 Web 页面“前进”和“后退”功能的标准。客户端更愿意接受前面提到的其他媒体类型,所以该类型的权重为 0.7。

所以说我们用 Google 浏览器去访问这个 url (csvbase.com)时,会跟 HTTP 服务端去协商:你应该返回什么类型的内容给我,优先是 text/html

而 curl 命令或者 wget 命令去访问请求这个 url 时,默认情况下发送的请求头中的 Accept 字段的值是 */*,表示支持接受所有类型的响应

而这个网站 csvbase 默认格式是 csv,所以说当 curl 命令或者 wget 命令去访问请求这个 url 时,得到的是一个 csv 格式返回内容

这就是 HTTP 协议中的内容协商(content negotiation)

HTTP内容协商是指客户端和服务器端协商出最适合的响应数据格式、语言等内容的过

HTTP中的内容协商机制,可以确保客户端和服务器端发送和接收的内容格式是一致的,从而提高通信的效率和可靠性

HTTP内容协商通常有三种类型:

  • 基于请求头的内容协商(Header-based content negotiation)
  • 基于URL的内容协商(URL-based content negotiation)
  • 基于实体的内容协商(Entity-based content negotiation)

基于请求头的内容协商是指客户端在请求头中指定自己可以接受的内容类型(MIME类型),服务器根据客户端的请求头中所指定的信息,选择最合适的响应内容类型进行响应

常用的请求头字段是 Accept 和 Accept-Language。服务器端根据 Accept 字段的内容,选择最匹配的响应类型进行响应

如果客户端所能接受的响应类型都不能满足服务器端的响应类型,则会返回一个 406 Not Acceptable 的错误状态码

那有小伙伴可能会想:我用 curl 命令或者 wget 命令不想得到一个 csv 格式的响应,我想 HTTP 服务端返回其他类型的响应,这时候该怎么办

我们可以手动修改请求头来告诉 HTTP 服务端它可以接受的媒体类型(即文件格式)的偏好
为什么访问同一个网址却返回不同的内容

参考文章:

How does it know I want csv? ⁠— An HTTP trick (csvbase.com)

原文链接:https://www.cnblogs.com/edisonfish/p/17391840.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:为什么访问同一个网址却返回不同的内容 - Python技术站

(0)
上一篇 2023年5月11日
下一篇 2023年5月11日

相关文章

  • 使用yum更新时不升级Linux内核的方法

    欢迎来到本站,接下来我将为大家介绍“使用yum更新时不升级Linux内核的方法”的完整攻略。 问题描述 在使用yum更新时,由于安全和稳定性考虑,你可能需要禁止升级Linux内核。但是默认情况下,在执行yum update时,yum将会升级所有可以升级的软件包,包括Linux内核。所以,我们需要机制来保持Linux内核版本不变,而其他软件包可以正常更新。 解…

    Linux 2023年5月14日
    00
  • vmware中CentOS7网络设置教程详解

    VMware中CentOS7网络设置教程详解 在VMware中安装CentOS7时,可能需要设置网络以便连接互联网。本教程将介绍如何在VMware中安装CentOS7并设置网络。 步骤1:安装CentOS 首先,到CentOS官网(https://www.centos.org/download/)下载CentOS7的DVD ISO文件。 打开VMware P…

    Linux 2023年5月24日
    00
  • Linux openssl:OpenSSL命令

    Linux OpenSSL: OpenSSL命令简介 OpenSSL是一个强大的开源SSL/TLS通信加密工具包,可以用于创建私有密钥、创建CSR(certificate signing request)、管理数字证书、创建数字证书、加解密等等操作。 OpenSSL命令可以用于生成数字证书、CSR、p12/pem证书以及加解密等操作。在本文中,将详细介绍Op…

    Linux 2023年3月28日
    00
  • KVM虚拟化Linux Bridge环境部署的方法步骤

    下面就来详细讲解一下“KVM虚拟化Linux Bridge环境部署的方法步骤”。 1. 准备环境 在部署KVM虚拟化Linux Bridge环境之前,需要先准备好以下环境: CentOS 7操作系统(或其他支持KVM虚拟化的操作系统) KVM虚拟化环境(需要安装KVM和相关依赖) Linux Bridge网络桥接工具(需要安装bridge-utils) 管理…

    Linux 2023年5月24日
    00
  • linux下can调试工具canutils安装与使用

    0、  编译环境所需要的工具 libsocketcan-0.0.11.tar.bz2 canutils-4.0.6.tar.bz2 下载路径 https://public.pengutronix.de/software/libsocketcan/libsocketcan-0.0.11.tar.bz2 #0.0.11版本 https://public.peng…

    Linux 2023年4月11日
    00
  • Linux tput命令

    Linux tput命令用于输出终端控制字符,可以用来在终端窗口上改变文本颜色、光标位置、清屏等操作。在命令行中输入“man tput”可以查看其详细用法。 语法格式 tput [-T 设备名] capability [参数列表…] 参数说明 -T 设备名:指定终端设备。 capability:指定一个或多个终端能力,如:clear(清屏)、setf(设…

    Linux 2023年3月28日
    00
  • 收藏!最全Linux思维导图

    收藏!最全Linux思维导图 目录 收藏!最全Linux思维导图 1. 认识 Linux 2. Linux 命令 3. Linux学习路径 4. Linux 桌面介绍 5. FHS:文件系统目录标准 6. Linux 需要特别注意的目录 7. Linux 内核学习路线 8. Linux Security Coaching 9. Linux 命令参考 10. …

    Linux 2023年5月10日
    00
  • socket 到底是个啥

      哈喽大家好,我是咸鱼   我相信大家在面试过程中或多或少都会被问到这样一个问题:你能解释一下什么是 socket 吗   我记得我当初的回答很是浅显:socket 也叫套接字,用来负责不同主机程序之间的网络通信连接,socket 的表现方式由四元组(ip地址:端口)组成   那么今天,咸鱼将跟大家打开 socket 的神秘大门,不但要搞清楚 socket…

    Linux 2023年4月17日
    00
合作推广
合作推广
分享本页
返回顶部