目录

  • 一、http 简介
  • 二、url 详解
  • 三、request
    • 1.get 和 post
    • 2.请求方法
    • 3.request 组成
    • 4.请求头
    • 5.get 请求参数
    • 6.post 请求参数
    • 7.post 的 body

一、http 简介

http 协议包含request(你发过去的内容)和response(返回来的内容)。http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议。

服务器上可以配置域名和服务器 ip 地址的映射,你访问的 url 到达网络通信商(比如联通、电信、移动),他们会再转发到域名地址解析服务商那,根据你请求的域名解析成具体的 ip,这样就能找到你要访问的服务器了,解析到服务器后,再根据配置的 url 的路径找到服务器下对应路径下的文件,服务器根据你的请求再将内容返回到你这端。

所以,输入百度的 url 地址就看到百度的页面了。我之前写过文章通读《图解 HTTP》脑图可以看下。

开发-洛丹伦的夏天的补充:

“ 1. 网络运营商维护着本地域名服务器,可能不需要再转发到根,顶,权威域名服务器(权威域名服务器由域名解析服务商提供)。

  1. Url 本身就是 uri 的子集,路径还是参数都是 uri 的一部分。

  2. 拿到 ip 后怎么访问服务器上的文件,是根据路径还是根据参数还是根据整个 uri,要看你所访问服务器的本地文件系统和支持远程文件访问的 server 类型。

  3. 比如你服务器上安装了 ftp 的 server,那么你客户端就可以使用 ftp 协议去访问服务器上的文件系统,至于访问到哪个文件,根据你 ftp server 的配置来解析。

  4. 支持远程文件访问的 server 是啥?它可以是很多东西,你可以用你的 tomcat,你可以用 jetty 这些 servlet 容器搭建一个,也可以用 netty 自己写一个,甚至直接使用 nginx,说到 nginx 你或许就明白了——你的 uri 能访问到哪个文件,哪个路径,假如是 http 协议的话,你可以用路径映射,可以用参数映射,甚至可以用 header 甚至可以用 cookie 来映射。

  5. 文件 server 的本质其实就是,客户端与服务器文件系统的一个中间层,uri 与文件系统的映射,取决于你这个 server 里程序是怎么个逻辑。直白的讲,用过 springboot,里面的 ResourceHandler,了解下。”

二、url 详解

http/https 协议类型
port 端口号。(默认端口是 80,它是可以省略的)
path 请求的路径(host 之后,问号之前)。路径就是通常说的接口地址。
比如baidu.com/s/xxx/sss?tn=40039514_1_oem_dg/s/xxx/sss就是路径。
接口文档上路径就是这部分,不会写 host 地址(比如 www.baidu.com)。因为接口的话,可以切换到不同的服务上,部署的机器可以搭建在不同的测试环境上,所以只会写相对路径。
参数 name=value
? 是分割,前面是地址,后面是它带的参数。就是访问这个地址的时候携带的参数。多个参数用&符合隔开。
& 多个参数用&隔开,没有参数可以不写。
  • host : 主机地址或域名。

    • 192.168.x.xx:8080 地址+端口号。(经常看到测试环境是这样的地址)
    • www.xxx.com 是域名。
    • localhost:8080 中 localhost 是本机地址。

https 和 http 相比,就是多了一个证书。一般测试环境是 http,正式环境是 https。

/s是服务器上的路径,这个路径和电脑上的路径是一样的。比如 c 盘什么的。Linux 里面没有 d 盘 c 盘这种之分,只有地址。访问的是这个服务器的地址。

打开其它的网站都是这样一个标准的格式。

因为本机可以搭建不同的服务,81 端口,80 端口,不同的端口访问的是不同的服务。

http 协议里面 url 地址里面的内容是通过 UrlEncode 这种编码统一编码的。如果是中文,会自动转换成这种编码:%e6%b8%85%e8%8f%a1%e7%9a%84%e5%8d%9a%e5%ae%a2

这样的话,不同的服务器都可以解析出来。

三、request

用 fiddler 这个工具抓包看下。

1.get 和 post

request:

从协议的内容上看,这就是 get 和 post 最明显的区别。

2.请求方法

根据 http 标准,http 请求可以使用多种方法。

http1.0 定义了三种请求方法:get,post 和 head 方法。
http1.1 新增了五种请求方法:options,put,delete,trace 和 connect 方法。一共是八种方法。
get 请求指定的页面信息,并返回实体主体。
head 类似于 get 请求,只不过返回的响应中没有具体的内容,用于获取报头。
put 从客户端向服务器传送的数据取代指定的文档的内容。
post 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。post 请求可能会导致新的资源的建立或已有资源的修改。
delete 请求服务器删除指定的页面。
connect http/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
options 允许客户端查看服务器的性能。
trace 回显服务器收到的请求,主要用于测试或诊断。

从功能上讲,get 和 post 实现的功能都是一样的。get 从服务端读取数据,post 也可以的。get 也可以往服务端提交数据。

get 的 url 后面可以带参数。post 的 url 后面也可以带参数,参数也可以放在 body 部分。

有点区别:

post 请求的 body 部分提交的数据可以比较大。body 部分可以提交图片、文件之类的。

但是 get 请求提交的时候,url 上面可提交的数据量比较小。url 上如果想带张图片是不可以的。

3.request 组成

空行是固定格式,区分请求头和请求 body 的。

user-Agent:显示是从哪个客户端发出去的。如果是从火狐浏览器发出去的,这块的内容会告诉你它是火狐浏览器。如果是从谷歌浏览器发出去的,这块的内容会告诉你它是谷歌浏览器。

服务端收到了 user-Agent 这个参数后,它知道你是从哪个浏览器发出去的。后端统计数据的时候,可以分析出我的网站访问的用户是用哪个浏览器访问的最多,哪个浏览器访问的少。

如果识别 user-Agent 没有客户端类型的话,可能就拒绝你的请求,因为可能通过脚本访问的。服务端通过 user-Agent 这个参数控制。

Accept:这个协议接收的数据类型是哪些。发出去后,需要接收哪些数据类型,告诉服务端,可以接收 image/webp 这些,可以接收哪种数据类型等。

Accept-Encoding:代表可以支持哪些压缩格式。不是电脑上普通的压缩格式,协议里面它有自己的压缩格式。例如 gzip,deflate,br。

当服务端返回的数据量比较大的时候,通过压缩的话,可以节省流量。1 兆的图片直接用原始数据去传输,要消耗 1 兆的网络,用手机去访问,发现流量消耗的非常的快并且给服务端造成很大的压力。

就像给同学发视频要压缩下,这样视频变小了,传起来快了,道理都是一样的。服务端返回数据的时候也可以压缩。

这个意思是说:从服务端返回的 body 内容被编码了,需要解开压缩。

不然的话,显示的就是乱码:

点击这个提示,就解压了,解压之后就显示正常的内容了:

4.请求头

如果是 post 请求,多了个参数叫做Content-Type:告诉服务端数据是什么类型。get 请求没这个参数,post 请求必须有这个参数。

post 请求数据类型比较多,肯定先声明,不然服务端没办法正确得解析。

5.get 请求参数

get 请求参数都在请求行里。可以在 Webforms(Webforms 是解析它的参数的意思)的 QueryString(QueryString 是 url 地址后面的参数)查看。

根据域名找到刚才模拟请求的接口,可以查看到参数:

6.post 请求参数

请求参数可以是请求行的参数,也可以是请求行的参数+body 的参数。

post 请求,QueryString 也有参数。例如:http://www.example.com/?1=1

QueryString+body

QueryString 可以为空,body 也可以为空。

Content-Type: application/x-www-form-urlencoded

QueryString 部分是 url 里面的参数,body 部分就是 request body 的参数了。

User-Agent: Fiddler
Host: www.example.com
Content-Length: 13
Content-Type: application/json

request body:

{"111":"ddd"}

7.post 的 body

post 请求的 body 部分不是瞎传的。

request body 里是的 json 格式,这是 http 协议里面的数据类型。

注意:这里是英文的引号。表单格式:传图片、文字都可以。

看 post 请求的数据格式:就看 Content-Type。这里的 Content-Type 是发出去的数据类型。

get 请求一般不写 body。get 请求加上 body,需要后端做一些特殊的处理。前端如果把数据放到 body 中,后端可以获取到。这样比较麻烦,而且用 post 更加安全一些。

附 requests 官方文档: https://requests.readthedocs.io/zh_CN/latest/


公众号清菡软件测试首发,更多原创文章:清菡软件测试 120+原创文章,欢迎关注、交流,禁止第三方擅自转载。如有转载,请标明出处。

基础篇-http协议《http 简介、url详解、request》的更多相关文章

  1. PHP 基础篇 - PHP 中 DES 加解密详解

    一.简介 DES 是对称性加密里面常见一种,全称为 Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法.密钥长度是64位(bit),超过位数密钥被忽略.所谓对 ...

  2. C++入门教程:大白话讲解,新手基础篇⭐⭐⭐(附源码及详解、视频课程资料推荐)

    目录 C++教程 前言 视频教程 文字教程 集成开发环境(IDE) 编译器 工作原理 学习指南 入门书籍 进阶书籍 算法.竞赛书籍 教程 标准构建 程序解释 第一个C++程序--"hello ...

  3. Vue.js 源码分析(八) 基础篇 依赖注入 provide/inject组合详解

    先来看看官网的介绍: 简单的说,当组件的引入层次过多,我们的子孙组件想要获取祖先组件的资源,那么怎么办呢,总不能一直取父级往上吧,而且这样代码结构容易混乱.这个就是这对选项要干的事情 provide和 ...

  4. Vue.js 源码分析(七) 基础篇 侦听器 watch属性详解

    先来看看官网的介绍: 官网介绍的很好理解了,也就是监听一个数据的变化,当该数据变化时执行我们的watch方法,watch选项是一个对象,键为需要观察的数据名,值为一个表达式(函数),还可以是一个对象, ...

  5. java基础篇---HTTP协议

    java基础篇---HTTP协议   HTTP协议一直是自己的薄弱点,也没抽太多时间去看这方面的内容,今天兴致来了就在网上搜了下关于http协议,发现有园友写了一篇非常好的博文,博文地址:(http: ...

  6. HTTP协议缓存策略深入详解之ETAG妙用

    Etag是什么: Etag 是URL的Entity Tag,用于标示URL对象是否改变,区分不同语言和Session等等.具体内部含义是使服务器控制的,就像Cookie那样. HTTP协议规格说明定义 ...

  7. Fiddler抓包6-get请求(url详解)

    前言 上一篇介绍了Composer的功能,可以模拟get和post请求,get请求有些是不带参数的,这种比较容易,直接放到url地址栏就行.有些get请求会带有参数,本篇详细介绍url地址格式. 一. ...

  8. Fiddler抓包6-get请求(url详解)【转载】

    本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/tag/fiddler/ 前言 上一篇介绍了Composer的功能,可以模拟get和post请求 ...

  9. 第8章 应用协议 图解TCP/IP 详解

    第8章 应用协议 图解TCP/IP 详解 8.1 应用层协议概要 应用层协议的定义 TCP和IP等下层协议是不依赖上层应用类型.实用性非常广的协议.而应用协议则是为了实现某种应用而设计和创造的协议. ...

随机推荐

  1. Day10 python高级特性-- 生成器 Generator

    列表生成式可以创建列表,但是受内存限制,列表容量时有限的,创建一个巨量元素的列表,不仅占用很大的存储空间,当仅仅访问前几个元素时,后面的绝大多数元素占用的空间都被浪费了. 如果list的元素可以按照算 ...

  2. 从面试角度分析ArrayList源码

    注:本系列文章中用到的jdk版本均为java8 ArrayList类图如下: ArrayList的底层是由数组实现的,数组的特点是固定大小,而ArrayList实现了动态扩容. ArrayList部分 ...

  3. 热部署Devtools

    在子工程添加devtools的依赖 <dependency> <groupId>org.springframework.boot</groupId> <art ...

  4. Restful规则及JPA导致内存溢出

    HTTP动词 对于资源的具体操作类型,由HTTP动词表示. 常用的HTTP动词有下面五个(括号里是对应的SQL命令). GET(SELECT):从服务器取出资源(一项或多项). POST(CREATE ...

  5. springmvc使用路径变量后再进行页面跳转会出现路径错误问题

    学习<Servlet.JSP和SpringMVC学习指南>遇到的一个问题,记录下. 项目代码 现象 @RequestMapping(value = "/book_edit/{id ...

  6. Hbase备份以及清表脚本

    脚本主要是方便自己工作使用,服务器环境中配置了hbase相关环境变量 1.hbase备份脚本 #!/bin/bash tableList=("table1" "table ...

  7. MySQL数据库 数据的更新

    有表A,B,有name,sal,deptNo1,数据更新update update A set sal=500 where name='zhangsan';(一次可更改多个值,用逗号隔开)2,数据的删 ...

  8. js下 Day20、综合案例

    一.购物车 效果图: 功能思路分析: 1. 面向对象框架 2. 模拟数据 1.多个店铺数组套对象 2.每个店铺多个商品,数组套对象

  9. SpringBoot从入门到精通教程(三)

    在上一篇中,我们已经讲了,SpringBoot 如何构建项目,和SpringBoot的HelloWorld, 那这一节我们继续讲 Thymeleaf Thymeleaf 官网: Thymeleaf T ...

  10. matlab随机系数矩阵产生以及矩阵的可视化函数

    clc; clear all; close all; n = 100;%所产生矩阵的大小 A= sprandsym(n,0.015,0.1,1);%产生系数矩阵函数: spy(A)矩阵图形化相当于im ...