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

yizhihongxing

哈喽大家好,我是咸鱼。今天给大家分享一个关于 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日

相关文章

  • CentOS查询软件包的安装位置

    下面是CentOS查询软件包的安装位置的完整攻略: 1. 使用yum命令查找软件包 yum是CentOS系统中用于管理软件包的命令行工具,可以使用它查找已安装或可用的软件包,并查询软件包的安装位置。下面是使用yum命令查询软件包的安装位置的详细步骤: 步骤一:打开终端 打开终端并输入以下命令,登录到root用户: sudo su 步骤二:使用yum命令查找软…

    Linux 2023年5月14日
    00
  • 阿里云服务器yum源更新问题从何而来

    标题:阿里云服务器yum源更新问题从何而来 背景 在使用阿里云服务器时,我们经常需要使用yum命令来更新安装软件,但是在一些情况下,yum命令会失败,导致无法更新软件包。这个问题从何而来呢?本文将详细说明。 原因 阿里云为了提供更加稳定、安全的服务,使用了自己的镜像源来替代CentOS官方的镜像源。但是由于阿里云的镜像源更新比较慢,导致在某些情况下,yum命…

    Linux 2023年5月14日
    00
  • 使用华为云鲲鹏弹性云服务器部署Discuz

    使用华为云鲲鹏弹性云服务器部署Discuz 目录 使用华为云鲲鹏弹性云服务器部署Discuz 实验目的与基本要求 实验摘要 部署开始 登录弹性云服务器 安装Apache 安装PHP编译器 安装PHP-MySQL插件 安装MariaDB数据库 Discuz!安装 Discuz!安装体验 华为云配置地址: 实验目的与基本要求 实验目的:Discuz!是一套通用社…

    Linux 2023年4月25日
    00
  • Ubuntu配置软件镜像源

    ​    主机系统:Ubuntu 22.04.1 LTS _Jammy Jellyfish_ – Release amd64   Ubuntu如何配置软件镜像源?   在网速可以的情况下,有时我们在使用 apt-get update 指令时会发现更新软件列表的速度很慢,一般出现这个问题的原因是用来更新软件源的服务器距离太远。    在这里,我们就需要通过添加…

    Linux 2023年5月2日
    00
  • Linux下常用的shell命令记录

     硬件篇 CPU相关 lscpu #查看的是cpu的统计信息. cat /proc/cpuinfo #查看CPU信息详细信息,如每个CPU的型号,主频等 内存相关 free -m #概要查看内存情况 这里的单位是MB cat /proc/meminfo #查看内存详细信息 磁盘相关 lsblk #查看硬盘和分区分布,显示很直观 df -h #查看各分区使用情…

    Linux 2023年4月12日
    00
  • Centos7.4服务器安装apache及安装过程出现的问题解决方法

    以下是“Centos7.4服务器安装apache及安装过程出现的问题解决方法”的完整使用攻略,包含两个示例说明。 Centos7.4服务器安装apache及安装过程出现的问题解决方法 以下是在Centos7.4服务器上安装Apache的步骤: 1. 安装Apache 使用以下命令在Centos7.4服务器上安装Apache: yum install http…

    Linux 2023年5月13日
    00
  • 如何在Linux系统上安装和配置数据库?

    在Linux系统上安装和配置数据库有多种方式,下面我将介绍其中两种常用的方式:安装MySQL和安装PostgreSQL。 安装MySQL 1. 安装MySQL 在Ubuntu和Debian系统上,可以使用以下命令来安装MySQL: sudo apt-get update sudo apt-get install mysql-server 在CentOS和Fe…

    Linux 2023年4月19日
    00
  • 阿里云云服务器Linux系统FTP服务器搭建设置教程

    阿里云云服务器Linux系统FTP服务器搭建设置教程 准备工作 首先在阿里云云服务器上,需要安装vsftpd工具: sudo apt-get update sudo apt-get install vsftpd 配置 FTP 服务器 接下来需要修改 vsftpd 的配置文件 /etc/vsftpd.conf,具体步骤如下: 1. 备份原有配置文件 sudo …

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