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

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

相关文章

  • Linux nc命令如何使用

    这篇文章主要介绍了Linux nc命令如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Linux nc命令如何使用文章都会有所收获,下面我们一起来看看吧。 一、命令简介 nc是netcat的简写,是一个功能强大的网络工具,有着网络界的瑞士军刀美誉。nc命令在linux系统中实际命令是ncat,nc是软连接到ncat。nc命…

    2023年4月8日
    00
  • 聊聊开关和CPU之间故事

    目录 开关 电报和继电器 门电路 材料学的发展 继电器与哈佛Mark1号 真空管与巨人一号 晶体管与IBM608 计算机2大特性:计算能力和记忆能力 作者:小牛呼噜噜 | https://xiaoniuhululu.github.io 大家好,我是呼噜噜,在先前的一篇文章计算机中数值和字符串怎么用二进制表示?中,我们知道了计算机为什么会采用 0 和 1 组成…

    Linux 2023年4月28日
    00
  • Linux内核通知链分析

    1. 引言 Linux是单内核架构(monolithic kernel),大多数内核子系统和模块是相互独立的,它们被动态地加载或卸载,以使内核变得小巧和可扩展.然而,子系统或模块之间需要通信,或者说某个特定模块扑捉到的事件可能其它模块对此感兴趣,这就需要一种机制来满足子系统或模块之间交互的需求. Linux使用通知链表来实现这一需求,它是一个简单的函数链表,…

    Linux 2023年4月11日
    00
  • Linux 内存管理 pt.2

    哈喽大家好我是咸鱼,在《Linux 内存管理 pt.1》中我们学习了什么是物理内存、虚拟内存,了解了内存映射、缺页异常等内容 那么今天我们来接着学习 Linux 内存管理中的多级页表和大页 多级页表&大页 在《Linux 内存管理 pt.1》中我们知道了内核为每个进程都维护了一张页表,这张页表用来记录进程虚拟内存与物理内存的映射关系 页表实际上存储在…

    Linux 2023年5月5日
    00
  • 深入理解python多进程编程

    深入理解Python多进程编程攻略 概述 Python中多进程编程是实现并行处理和提高系统性能的重要工具。本文将讲解Python多进程编程的基本概念和使用方法,并结合示例说明如何使用Python多进程编程实现并行处理。 多进程编程基本概念 进程(Process) 进程是程序在执行时的一个实例,操作系统通过进程(一个进程可以有多个线程)分配系统资源,并协调线程…

    Linux 2023年5月14日
    00
  • linux虚拟机配置静态IP地址的完整步骤

    下面是详细讲解“Linux虚拟机配置静态IP地址的完整步骤”的攻略。 1. 确定网卡名称 使用ifconfig命令查看网络接口的名称,一般情况下为eth0或enp0s3 ifconfig 2. 修改网卡配置文件 使用编辑器打开网络配置文件/etc/network/interfaces,修改其中的IP地址、网关、掩码等信息。 例如,将eth0的IP地址改为19…

    Linux 2023年5月24日
    00
  • 通过yum-cron对linux进行安全更新

    配置yum-cron工具。 安装 [root@localhost ~]# yum -y install yum-cron 配置 yum-cron有两个配置文件:/etc/yum/yum-cron.conf 和 /etc/yum/yum-cron-hourly.conf。这两个配置文件内容差不多,用于配置每天需要执行的内容和每小时需要执行的内容。 在配置文件中…

    Linux 2023年4月11日
    00
  • Linux下快速手动产生core文件

    原文链接:https://blog.csdn.net/jctian000/article/details/79695006   当我们配置好自动生成core文件的环境后,若不想写导致崩溃的程序验证,那要怎么快速产生core呢? 先看下产生core文件的条件: 当程序接收到以下UNIX信号会产生core文件:    在系统默认动作列,“终止w/core”表示在…

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