掌握http请求报文信息,加快前后端接口调试速率

项目场景:

在实际开发过程中会遇到前后端对接调试接口的场景,对于刚入职场的前端新手来说,如何跟后端快速的完成接口的调试对于整个开发的进度来说至关重要,而了解http请求报文,有助于提高调试接口的效率。

接下来我们就来一起了解http报文的组成部分及相关的概念,然后着重分析http报文中的content-type 属性

一、http报文中的组成部分

浏览器中最常见的两个请求方式 get和post其中两者的报文头的格式都是包含以下四个部分,我们先来说说第一个 General

(1)General

Request URL:
请求的地址,指的是我们客户端像服务端请求的地址,这个在开发过程中由后端开发人员提供,就是所谓的接口。
Request Method:
请求的类型,最常见的就是post和get请求,其他的很少,这里都不说了,说到get和post的请求,我这里简单说下二者的主要区别:1.数据传输的长度限制,get由于浏览器对url长度的限制至多传输的数据大小在2kb,post请求没有数据大小的限制 2:安全性:由于get请求中的参数都是通过浏览器的url来进行传输,你所需要的数据都会在浏览器中看到,而post请求则将请求的数据信息存储在请求体中,所以get请求的安全性较差,一般敏感信息都经过加密由post请求进行传输.3:get请求的速度比post快,所以如果对请求没有特殊要求时,一般使用get。
Status Code:
状态码,反应了这个请求最终的状态,一般通过这个来判断你的请求是否成功,如:200代表了你成功的访问到了服务端。302:重定向,你访问的路径后端给你重新定向到另一个页面。403:拒绝访问,也许是跨域,也许是后端做了访问限制。404:你的访问路径有问题 。500:服务端出现错误,具体关于状态码的内容大家可以百度仔细去了解。
Remote Address
服务器ip地址,通过这个属性可以查看服务端的ip地址

(2)Responses Header
response.png

Content-Type
内容类型,用于定义网络文件的类型和网页的编码,决定文件接收方将以什么形式、什么编码读取这个文件,简而言之就是定义了数据实体的媒介类型。
因为这个是在Responses Header里所以根据Content-Type定义可知这个是服务端返回的数据媒介类型,所以我们可以通过这个来查看后端返回的媒介类型是什么,一般比较常见的有如下几种。
text/html:HTML格式
text/plain:纯文本格式
application/json;charset=UTF-8:JSON数据格式
在上图中我们可以看到Content-Type为application/json;charset=UTF-8,即后端返回的数据格式为json,前端拿到数据就可以以对象的形式直接处理数据了
Date
显示当前时间
Server
服务端采用的是什么服务器
Transfer-Encoding: chunked
表示输出的内容长度不能确定

(3)Request Header
requestHeader.png

这个是我们重点要关注的信息,因为里面的属性是由我们自己来控制的,我们来从头开始慢慢分析
(1)、accept:属于请求头信息,代表发送端(客户端)希望接受的数据类型,我们通过代码来实践一下

//在ajax请求中可以通过设置dataType来改变http请求中的accept属性,看如下代码
      $.ajax({
            type: "POST",
            url: url,
            data: jsondata,
            dataType: 'json',
            success: function (data) {              
              callback(data);
            },
            error: function (error) {
              console.log(error);
            }
        });

这是jquery的一个ajax请求,其中我设置了dataType 的类型为json,作为客户端是希望服务端给我返回的媒体类型为json格式的数据:


save.png

其中请求中的accept 和返回中的Content-Type为一致的(后端返回的实体类型为json格式,下同)所以此时前端可以直接以对象的处理方式来使用后端返回的数据,如果此时我更改一下前端的请求数据格式,看看会发生什么。

$.ajax({
           type: "POST",
           url: url,
           data: jsondata,
              dataType: 'text',
          success: function (data) {               
             callback(data);
           },
           error: function (error) {
             console.log(error);
           }
    });

此时我将请求头的信息改为text,意思是希望从后端接收的媒体类型为字符串,如下所示

accept.png

此时accept的属性变为text/plain ,那客户端获取到的数据格式会发生变化吗?
通过抓包发现从后端返回的数据由json对象变成了json字符串,说明设置生效了。
如果不对dataType进行设置,则浏览器默认此时的Accept:/,此时代表浏览器可以接收任意类型的。
小结:accept可以理解为客户端希望获取到的媒介格式,浏览器会优先按照accept设置的类型对返回内容进行编码,所以我们如果不对accept进行设置,浏览器会根据后端返回的content-type来进行编码,我们只需要按照后端返回的媒介类容进行响应的处理即可,一般情况下我们不进行相关设置。

(2) content-type(一般get请求中没有该属性,因为他的传值方式决定了他不需要进行对内容体的设置)
request 头信息中的content-type代表着客户端像服务端传输数据的媒介类型或者是数据实体类型,如果客户端设置的数据类型不能被服务端正常解析,服务端会报错误,从而断开连接,看下面代码

$.ajax({
            type: "POST",
            url: url,
            data:  JSON.stringify(jsonData),
               dataType: 'json',
              contentType: "application/json",
           success: function (data) {               
              callback(data);
            },
            error: function (error) {
              console.log(error);
            }
     });

当你将contentType设置为json格式时即代表你客户端要向后端传送的数据为json格式,那么如上会发生什么了?

content.png

此时后端就拿不到前端所传过来的json数据,这个和前端设置accept时出现的情况一样,即我希望你传过来的数据和你真正传过来的数据格式不一致,此时就需要前后端统一媒介类型了。

$.ajax({
            type: "POST",
            url: url,
            data: jsonData,
               dataType: 'json',
              success: function (data) {            
              callback(data);
            },
            error: function (error) {
              console.log(error);
            }
     });

此时页面的信息

applation.png

如上,当我代码中没有设置content-type属性是,ajax默认的content-type为application/x-www-form-urlencoded,是表单的默认提交方式。
application/x-www-form-urlencoded:窗体数据被编码为名称/值对,此时post的提交的数据被编码为键和值的格式,所以当我们将content-type设置为此属性时,浏览器就会将我们传过去的值编码为键值的形似,如上图所示,因为后台默认的就是按照这种规则进行取值的,所以前端data就需要按照正常的对象传值就可以了,不能转字符串或者其它形式,否则后端拿不到数据,就会报错。比如

$.ajax({
            type: "POST",
            url: url,
            data: JSON.stringify(jsonData),
               dataType: 'json',
              success: function (data) {            
              callback(data);
            },
            error: function (error) {
              console.log(error);
            }
     });
save1.png

当前端传过去的数据被解析成上图所示,后端在原先不变的情况下是不能直接进行数据处理的,故会抛出错误,中断连接。
。。。。剩下的其它属性,大家可以自己了解了解,暂时就不说了,以后会补上。

总结

这个是基于项目中如何能快速的根据http的一些信息来加快接口的调试速度,总结如下。
1.首先前后端要统一http请求的方式是用get还是post。

2.客户端在进行ajax请求的时候,一般都不对datatype进行设置,我们通过查看响应头的content-type来查看服务端到返回的数据格式,然后在前端进行相应的数据处理。

3.在客户端进行ajax请求时,我们需要和后端确定我们需要传入的数据格式,此时我们可以通过ajax中的content-type来定义我们的实体数据的类型,默认情况下和表单的提交编码格式一致,如果这里设置两边不统一就会造成后端拿不到数据,服务端出错直接断开服务。
总的来说,对于接口的调试,如果能按照设计文档一步一步来,应该不会出现什么问题,如果一断出现问题,则大概率原因就是前后端对数据的格式出现了不统一,此时我们可以通过http来查看到底是哪里出现问题了,有利于快速的找到问题所在。
关于网络协议这块,后面我会补上剩下的属性介绍,并探讨如何利用这些属性来进行问题的分析。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,579评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,373评论 25 707
  • .你的梦想是什么? 在所有的梦想中,长远看哪个梦想对你最重要? 这个梦想为什么对你如此重要? 你在多大程度上相信你...
    阿牛Newton阅读 268评论 0 1
  • 不知道为什么,最近下班走路回家的时候总会情不自禁地想哭,流眼泪。 快到家的时候打开了一个视频,一听音乐眼泪哗哗地流
    元子丰丰阅读 140评论 0 1
  • 2017,新的一年开始了,一颗减肥的心又开始不安分的躁动了。。 减肥这件事,每一年我都要拿出来喊几次,但每次坚持不...
    晚安喵喵阅读 173评论 0 0