目录

认识“状态码”(status code)

200 OK

404 Not Found

403 Forbidden

405 Method Not Allowed

500 Internal Server Error

504 Gateway Timeout

302 Move temporarily

301 Moved Permanently

418 I am a teaport

状态码小结:

认识响应“报头”(header)

Content - Type

构造 HTTP 请求

通过第三方工具进行构造

通过代码来构造 HTTP 请求

完!


认识“状态码”(status code)

状态码是表示一个页面的结果。(是访问成功,还是失败,话是其他的一些情况...)

HTTP 中的状态码都是约定好的:

上面的状态码并不需要全部都记住,只需要直到几个常见的状态码即可~~

200 OK

这是一个最常见的状态码, 表示访问成功

404 Not Found

表示没有找到资源。

浏览器输入一个 URL,目的就是为了访问对方服务器上的一个资源。如果这个 URL 标识的资源不存在,那么就会出现 404。例如,在浏览器中输入 www.bilibli.com/index.html,此时就在尝试访问 哔哩哔哩上的 /index.html 这个资源。

如果输入正确,就可以正确访问到,但是如果输入错误,比如 www.bilibili.com/index333.html,就会看到 404 这样的响应。(不过 bilibili 比较有特点,他特意为 404 做了一个比较符合宅男动漫的页面~~)

403 Forbidden

表示访问被拒绝。有的页面通常需要用户具有一定的权限(比如登陆后才能进行访问)如果用户没有登录直接访问,就容易看到 403。

例如:我们在码云上查看一个其他人的私人仓库,就会出现 403,参考链接:https://gitee.com/HGtz2222/blog_python

405 Method Not Allowed

前面我们学习了 HTTP 中所支持的方法,有 GET,POST,PUT,DELETE 等等。

但是对方的服务器不一定支持所有的方法,比如:服务器只支持 GET 请求,但是我们发送了一个 POST,就会出现 405 Method Not Allowed。

500 Internal Server Error

服务器内部出现错误,一般是服务器的代码执行过程中,遇到了一些特殊的情况(服务器崩溃)会产生这个状态码~~

504 Gateway Timeout

当服务器负载比较大的时候,服务器处理单条请求的时间消耗的时间就会很长,就可能出现访问服务器超时。这种情况可能是服务器挂了,也可能是网络挂了~~

302 Move temporarily

临时重定向

理解“重定向”

就相当于手机号码中的“呼叫转移”功能。

比如我们本来的手机号是 123-4567-7899,后来换了一个新的号码是 999-4567-7891,此时难道是一个一个朋友告诉我们的新号码码??

我们可以去办理一个呼叫转移业务,其他人拨打 123-4567-7899 的时候,就会自动转移到999-4567-7891 上

我们在登录页面经常会见到 302,用户实现登陆成功后自动跳转到主页。

响应报文中的 header 部分会包含一个 Location 字段,表示要跳转到那个页面~~

我们以码云的登录为例:登陆后的抓包结果:

可以看到 header 中的 Location:https://gitee.com/,接下来浏览器就会自动发送 GET 

请求,获取 https://gitee.com/ 

301 Moved Permanently

永久重定向,当浏览器收到这种响应时候,后续的请求都会被自动改成新的地址,不必多一次跳转了。(可以影响到浏览器的缓存)

在上面 301 和 302 这种重定向报文的响应中,会有一个特殊的 header 叫做 Location,描述了要重定向的位置是在哪里~~

418 I am a teaport

一个特殊的状态码,没有实际的含义,I am a teaport 我是个茶壶(我是个杯具~~) 

设计 HTTP 协议的大佬开玩笑 == 》 “彩蛋~”

状态码小结:

认识响应“报头”(header)

响应报头的基本格式和请求报头的格式基本一致

类似 Content - Type,Content - Length 等属性的含义也和请求中的含义一致~~

Content - Type

响应中的 Content - Type 常见取值有以下几种:

text/html :body 数据格式是 HTML

text/css: body 数据格式是 CSS

application/javascript: body 数据格式是 Javascript

application/json: body 数据格式是 JSON

构造 HTTP 请求

通过第三方工具进行构造

使用 postman 就可以构造 HTTP 请求~

每个标签页,就是一个构造 HTTP 请求的配置页面了,点击 Send 发送按钮,就能发送请求到目标服务器了~~

还有一个很牛逼的点是:postman 是一个有对象的软件 == > postwoman~~

通过代码来构造 HTTP 请求

任何一种编程语言,只要能够操作网络,都可以构造 HTTP 请求!!

所谓”发送 HTTP 请求“,本质上就是按照 HTTP 的格式往 TCP Socket 中写入一个字符串。

所谓”接受 HTTP 响应“,本质上就是从 TCP Socket 中读取一个字符串,再按照 HTTP 的格式来解析。

我们就可以基于 Socket 的知识,构造出一个简单的 HTTP 客户端程序,用来发送各种类型的 HTTP 请求。

public class HttpClient {private Socket socket;private String ip;private int port;public HttpClient(String ip, int port) throws IOException {this.ip = ip;this.port = port;socket = new Socket(ip, port);}public String get(String url) throws IOException {StringBuilder request = new StringBuilder();// 构造首行request.append("GET " + url + " HTTP/1.1\n");// 构造 headerrequest.append("Host: " + ip + ":" + port + "\n");// 构造空行request.append("\n");// 发送数据OutputStream outputStream = socket.getOutputStream();outputStream.write(request.toString().getBytes());// 读取响应数据InputStream inputStream = socket.getInputStream();byte[] buffer = new byte[1024 * 1024];int n = inputStream.read(buffer);return new String(buffer, 0, n, "utf-8");}public String post(String url, String body) throws IOException {StringBuilder request = new StringBuilder();// 构造首行request.append("POST " + url + " HTTP/1.1\n");// 构造 headerrequest.append("Host: " + ip + ":" + port + "\n");request.append("Content-Length: " + body.getBytes().length + "\n");request.append("Content-Type: text/plain\n");// 构造空行request.append("\n");// 构造 bodyrequest.append(body);// 发送数据OutputStream outputStream = socket.getOutputStream();outputStream.write(request.toString().getBytes());// 读取响应数据InputStream inputStream = socket.getInputStream();byte[] buffer = new byte[1024 * 1024];int n = inputStream.read(buffer);return new String(buffer, 0, n, "utf-8");}public static void main(String[] args) throws IOException {HttpClient httpClient = new HttpClient("www.bilibili.com",80);String resp = httpClient.get("/index.html");System.out.println(resp);String postResp = httpClient.post("/index.html","this is a body");System.out.println(postResp);}
}

完!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/79140.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/79140.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/79140.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot中集成Guava Cache或者Caffeine

一、在Spring Boot(1.x版本)中集成Guava Cache 注意&#xff1a; Spring Boot 2.x用户&#xff1a;优先使用Caffeine&#xff0c;性能更优且维护活跃。 1. 添加依赖 在pom.xml中添加Guava依赖&#xff1a; <dependency><groupId>com.google.guava</groupId&…

Linux工作台文件操作命令全流程解析

全文目录 1 确认当前工作路径2 导航与目录管理2.1 关键命令2.2 逻辑衔接 3 文件基础操作3.1 创建 → 备份 → 重命名 → 清理3.2 文件查看和编辑3.3 文件链接3.4 文件diff 4 文件权限与所有权管理5 文件打包与归档6 参考文献 写在前面 shell是一种命令解释器&#xff0c;它提供…

LeetCode第183题_从不订购的客户

LeetCode 第183题&#xff1a;从不订购的客户 题目描述 表: Customers ---------------------- | Column Name | Type | ---------------------- | id | int | | name | varchar | ---------------------- id 是该表的主键。 该表包含消费者的 id 和…

c语言的常用关键字

c语言的常用关键字 c语言的关键字表示数据类型的关键字autocharfloatdoubleintlongshortvoidsignedstruct、enum、unionunsigned 表示分支语句的关键字ifelseswitchbreakcasecontinuedefault 表示循环语句的关键字whiledoforgoto 用于修饰变量或函数的关键字constconst修饰变量…

MCU通用输入输出端口(GPIO)设计指南

在嵌入式系统开发中&#xff0c;MCU的GPIO接口是一个基础但非常实用的功能模块。GPIO全称是通用输入输出端口&#xff0c;它让MCU可以灵活地与外部设备进行交互。 GPIO的主要特点包括&#xff1a; 多功能性&#xff1a;每个引脚都可以单独配置为输入或输出 可编程性&#xff…

STM32完整内存地址空间分配详解

在STM32这类基于ARM Cortex-M的32位微控制器中&#xff0c;整个4GB的地址空间(从0x00000000到0xFFFFFFFF)有着非常系统化的分配方案&#xff0c;每个区域都有其特定的用途。下面我将详细介绍这些地址区域的分配及其功能&#xff1a; STM32完整内存地址空间分配详解(0x00000000…

实现水平垂直居中的多种方法

在前端开发中&#xff0c;元素的居中是一个常见但又经常让人头疼的问题。本文将全面总结各种CSS居中方法&#xff0c;特别是如何实现一个div的水平垂直居中。 为什么居中这么重要&#xff1f; 居中布局是现代网页设计中最基础也最重要的布局方式之一。无论是导航菜单、登录框…

如何实现服务的自动扩缩容(Auto Scaling)

在云计算和分布式系统的时代,系统的弹性和适应性已成为企业构建高效IT基础设施的核心需求。自动扩缩容(Auto Scaling)作为一种关键技术,旨在根据实时负载变化动态调整计算资源,以确保系统性能稳定,同时优化资源利用效率。简单来说,自动扩缩容是指系统能够根据预设规则或…

uniapp+vue3+ts 使用canvas实现安卓端、ios端及微信小程序端二维码生成及下载

加粗样式uniapp多端生成带二维码海报并保存至相册的实现 在微信小程序开发中&#xff0c;我们常常会遇到生成带有二维码的海报并保存到手机相册的需求&#xff0c;比如分享活动海报、产品宣传海报等。今天就来和大家分享一下如何通过代码实现这一功能。 准备工作 在开始之前&am…

架构师面试(三十八):注册中心架构模式

题目 在微服务系统中&#xff0c;当服务达到一定数量时&#xff0c;通常需要引入【注册中心】组件&#xff0c;以方便服务发现。 大家有没有思考过&#xff0c;注册中心存在的最根本的原因是什么呢&#xff1f;注册中心在企业中的最佳实践是怎样的&#xff1f;注册中心的服务…

Day.js和Moment.js对比,日期时间库怎么选?

在JavaScript的日期处理库中&#xff0c;Moment.js 和 Day.js 是两个非常流行的选择。本文将基于从npmtrends的数据&#xff0c;对这两个库进行详细的对比分析。 Moment.js的重度使用者。凡是遇到时间和日期的操作&#xff0c;就把Moment.js引用上。 直到有天我发现加载的mome…

罗默如何用木星卫星“宇宙钟表”测量光速?

一、17世纪的“宇宙级实验” 1676年&#xff0c;丹麦天文学家奥勒罗默&#xff08;Ole Rmer&#xff09;在巴黎天文台做出惊人发现&#xff1a; 木星卫星的“迟到早退”现象&#xff0c;竟能揭示光速的秘密&#xff01; 通过观察木卫一&#xff08;Io&#xff09;的轨道周期变…

deepseek 技巧整理

1、导出word 和excel 功能&#xff0c;在使用以下提示词。 请帮我列出减肥期间可以吃的水果&#xff0c;并分析该水果含有的营养元素&#xff0c;以表格的形式星现。1.要以html的方式输出 2.要可以直接运行 3.页面要提供可以直接下载word和excel功能

思考软件框架

数据库是达梦数据库 假定里面有40张表&#xff0c;软件的业务逻辑比较复杂。 当然&#xff0c;依然是对数据库中数据的增&#xff0c;删&#xff0c;改&#xff0c;查&#xff0c;组合&#xff0c;显示。 但是也涉及到多种软件&#xff0c;多台设备之间的通信。 我们可以使用…

探索 Disruptor:高性能并发框架的奥秘

在当今的软件开发领域&#xff0c;处理高并发场景是一项极具挑战性的任务。传统的并发解决方案&#xff0c;如基于锁的队列&#xff0c;往往在高负载下表现出性能瓶颈。而 Disruptor 作为一个高性能的并发框架&#xff0c;凭借其独特的设计和先进的技术&#xff0c;在处理海量数…

前端面经-VUE3篇--vue3基础知识(一)插值表达式、ref、reactive

一、计算属性(computed) 计算属性&#xff08;Computed Properties&#xff09;是 Vue 中一种特殊的响应式数据&#xff0c;它能基于已有的响应式数据动态计算出新的数据。 计算属性有以下特性&#xff1a; 自动缓存&#xff1a;只有当它依赖的响应式数据发生变化时&#xff…

数据结构6 · BinaryTree二叉树模板

代码函数功能顺序如下&#xff1a; 1&#xff1a;destroy&#xff1a;递归删除树 2&#xff1a;copy&#xff1a;复制二叉树 3&#xff1a;preOrder&#xff1a;递归前序遍历 4&#xff1a;inOrder&#xff1a;递归中序遍历 5&#xff1a;postOrder&#xff1a;递归后续遍…

C++/SDL进阶游戏开发 —— 双人塔防游戏(代号:村庄保卫战 13)

&#x1f381;个人主页&#xff1a;工藤新一 &#x1f50d;系列专栏&#xff1a;C面向对象&#xff08;类和对象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;终会照亮我前方的路 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 文章目录 十…

强化学习之基于无模型的算法之时序差分法

2、时序差分法(TD) 核心思想 TD 方法通过 引导值估计来学习最优策略。它利用当前的估计值和下一个时间步的信息来更新价值函数&#xff0c; 这种方法被称为“引导”&#xff08;bootstrapping&#xff09;。而不需要像蒙特卡罗方法那样等待一个完整的 episode 结束才进行更新&…

AE/PR模板 100个现代文字标题动态排版效果动画 Motion Titles

Motion Titles是一个令人惊艳的AE/PR模板&#xff0c;提供了100个现代文字标题的动态排版效果动画。这些动画效果能够为你的项目增添视觉冲击力和专业感&#xff0c;为文字标题注入活力和动感。该模板适用于Adobe After Effects CC或更高版本以及Adobe Premiere Pro 2020或更高…