前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >VS Code 扩展巡礼-REST Client

VS Code 扩展巡礼-REST Client

作者头像
needrunning
发布于 2019-10-15 07:36:32
发布于 2019-10-15 07:36:32
2.3K00
代码可运行
举报
文章被收录于专栏:图南科技图南科技
运行总次数:0
代码可运行
基本介绍

REST Client 是 VS Code 商店的一个 HTTP 访问扩展,官方地址 REST Client[1],用于模拟 HTTP 请求。

我们可以在官方介绍中关注两点

1 基本的 HTTP 请求模拟,HTTP 输入和 HTTP 响应 2 VS Code 自带的辅助功能,如自动补全 Http Content-Type 等信息

VS Code 扩展巡礼-REST Client-图南科技.png

REST Client 的优势

REST Client 是一个 Http 请求模拟插件,有人会说我用 PostMan 也可以实现同样的功能,没错。但是在我看来,REST Client 的优势以下几点

1 与 VS Code 结合,方便开发人员进行接口单元测试

2 基于手写 HTTP 报文进行请求,报文有严格的格式,编写者可以对 HTTP 协议和报文进行深入理解,如何设置请求头,如何组织不同 Content-Type 的请求参数,都会涉及到。

3 在前后端分离已经成为开发团队主流标配的情况下,开发人员可以对后端接口进行单元测试,QA 人员可以进行单独验收,对于这些日常操作,REST Client 是一款高效可靠的工具。

HTTP 报文内容格式

以下是 VS Code REST Client 中常用的两种请求方式的 HTTP 报文内容

application/json 请求
GET
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET https://example.com/topics/1 HTTP/1.1
POST
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST https://example.com/comments HTTP/1.1
content-type: application/json

{
"name": "sample",
"time": "Wed, 21 Oct 2015 18:27:50 GMT"
}
application/x-www-form-urlencoded 请求
GET
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET https://example.com/comments
?page=2
&pageSize=10
POST
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST https://api.example.com/login HTTP/1.1
Content-Type: application/x-www-form-urlencoded

name=foo
&password=bar

如下图中所示,可以看到请求端请求和服务端返回,蓝色框中是跨域相关的设置

REST Client-图南科技.png

发送嵌套 json 请求
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST  http://monitor.com/callback/callin
Content-Type: application/json

{
    "type":1,
    "data":{
        "vcc_code" : "",
        "server_num" : "0102000558",
        "cus_phone" : "100",
        "cus_phone_areacode" : "",
        "cus_phone_areaname" : "",
        "cus_phone_type" : "TEL",
        "ag_name" : "20",
        "ag_num" : "30",
        "ag_phone" : "8001",
        "endResult_code" : "12",
        "user_data" : []
    }
}

HTTP Language

Add language support for HTTP request, with features like syntax highlight, auto completion, code lens and comment support, when writing HTTP request in Visual Studio Code. By default, the language association will be automatically activated in two cases:

  1. File with extension .http or .rest
  2. First line of file follows standard request line in RFC 2616[2], with Method SP Request-URI SP HTTP-Version format

以上是 github 文档中的说明,大致两个意思

1 Http 报文的文件后缀可以是.http 或者.rest. 这样 VS Code 可以识别出来这是报文文件,自动提示,色彩显示呀,很漂亮。

项目中可以将报文以 http 文件的形式归档整理,作为项目的一部分。

2 报文的格式,严格按照 RFC 2616,主要是一行一个元素。

再说 ContentType

这里做一个简单的基础内容回顾

multipart/form-data:当需要在表单中进行文件上传时,使用该格式 application/json:application/json 这个 Content-Type 作为响应头大家肯定不陌生。

实际上,现在越来越多的人把 application/json 作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串

application/x-www-form-urlencoded:默认的 contencType,当 form 表单请求为 get 时,数据被编码为 key/value 格式(name1=value1&name2=value2…),然后把这个字串 append 到 url 后面,用 ? 分割,加载这个新的 url 发送到服务器(表单默认的提交数据的格式)。

当请求为 post 时,浏览器把 form 数据封装到 http body 中,然后发送到 server。(form 的 enctype 属性为编码方式,常用有两种:application/x-www-form-urlencoded 和 multipart/form-data,默认为 application/x-www-form-urlencoded。

常见问题梳理

1 ContentType 不对应

简单来说 ContentType 的作用是来约定请求方与接收方对于 HTTP 报文的处理位置,请求方关心传递参数,服务方关心接收参数。如果 ContentType 不一致,就是造成传递与接收参数的位置不对应,客户端传值正确,服务器端接收不到值的情况。

现在大家都提倡使用 application/json,少数项目或者开发者还是坚持使用 Content-Type: application/x-www-form-urlencoded

2 报文格式不准确

切记一行一组元素

看看头部的格式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Post http://dev.com/api/v1/c/history/list HTTP/1.1
Content-Type: application/json
app-key: 562986529
time-stamp: 1553581026034
token: 9f3f7cd61ca7a4d24954c1bfc3e6ead7

token 虽然是字符串,但是没有引号。key 冒号空格 报文的书写有助于深入理解 Http 报文原理。

开发案例 case

我们以 PHP 语言为例, 编程中请求接口主要使用的组件有 Curl,Zend,Guzzle 这三种。

Curl 请求

使用 Curl 请求,需要注意的依然是 x-www-form-urlencoded 下的参数传递问题

php curl 转为 x-www-form-urlencoded 方式的坑[3]

网上转变的方法基本都是写添加下面这句:

curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));

但加上去后却根本没效果。

要想以 x-www-form-urlencoded 方式发送,最关键其实是发送的数据格式。

Content-type from-data 时发送的数据用的是 array 格式,而 Content-type 为 x-www-form-urlencoded 时需要用 key=value&key=value 的格式发送,发送的是 string 型的数据。

from-data 数据的为:$data = [ 'name' => 'xiaoming', 'sex' => 1 ];

x-www-form-urlencoded 时的数据则要变为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$params_string = http_build_query($params);

否则

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$params_json = json_encode($params);
guzzle 组件中的 content-type

组件官方文档,请移步这里 Guzzle, PHP HTTP 客户端[4]

x-www-form-urlencoded 请求

如何发送一个 application/x-www-form-urlencoded POST 请求.

guzzle-form.png

json 请求

guzzle-json.png

Guzzle 访问实例初始化失败

我们看看另一种异常

如果我们的地址拼写错误导致远程接口不能解析,会出现什么情况?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 /**
     * Post请求
     *
     * @return void
     */
    protected function post()
    {
        try {
            $this->request = $this->client->post($this->uri, ['form_params' => $this->params], $this->option);
        } catch (\GuzzleHttp\Exception\RequestException $e) {

            var_dump($error);
            die();
            Yii::warning($e);
        }
    }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2019-07-13 09:39:06 [127.0.0.1][-][-][warning][application] GuzzleHttp\Exception\ConnectException: cURL error 6: Could not resolve: xx.cn (Timeout while contacting DNS servers) (see http://curl.haxx.se/libcurl/c/libcurl-errors.html) in /Users/name/sources/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php:185
Stack trace:

总结

本篇文章从 VS Code 下的扩展 REST Client 入手,通过对基本概念,优势和应用场景的介绍,结合 HTTP 请求中关于 Content-Type 的使用注意事项,对常见的接口调用问题进行了梳理。顺便引出访问接口通常使用的 Curl,Zend,Guzzle 三种组件。

REST Client 更多的使用场景和功能扩展,可以参考官方文档,发现更多好玩有用的功能。RestClient[5]

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 图南科技 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Unity编辑器UnityEditor基础(二)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
bering
2019/12/03
2.3K0
Unity-工具-查找丢失资源的Objects
public SerializedProperty GetIterator(); 返回SerializedProperty类 objectReferenceValue 参数:Object索引的相关obj
祝你万事顺利
2019/07/15
1.6K0
Unity 编辑器开发实战【Custom Editor】- 为UI视图制作动画编辑器
为了更方便地为UI视图添加动画,将动画的编辑功能封装在了UI View类中,可以通过编辑器快速的为视图编辑动画。动画分为两种类型,一种是Unity中的Animator动画,该类型直接通过一个字符串类型变量记录动画State状态的名称即可,播放时调用Animator类中的Play方法传入该名称。另一种是DoTween动画,支持视图的移动、旋转、缩放、淡入淡出动画的编辑:
CoderZ
2022/08/29
1.7K0
Unity 编辑器开发实战【Custom Editor】- 为UI视图制作动画编辑器
Unity编辑器扩展 | 编辑器扩展基础入门
Unity编辑器扩展 是一种自定义工具和功能,可以增强和扩展Unity编辑器的默认功能,以满足特定项目或工作流程的需求。通过Unity编辑器扩展,开发者可以创建自定义的编辑器窗口、面板、工具栏按钮、菜单选项等,以提供更直观、高效的工作环境。
呆呆敲代码的小Y
2023/09/02
8890
Unity编辑器扩展 | 编辑器扩展基础入门
Week16-编辑器服务端API开发
第一章:周介绍 1-1 介绍 需求指导设计,设计指导开发。无设计不开发。 服务端技术方案设计的方法 B端和编辑器基本功能API 技术方案设计文档 第二章:技术方案设计 2-1 技术方案设计-章介绍 领导技术方案设计、评审技术方案设计。 主要产出:server端技术方案设计 主要内容: 接口设计 选择Restful,而不是GraphQL 数据库设计 sever端整体设计 注意:正视技术方案设计,设计会节约时间。 2-2 接口设计-整理所有接口 接口设计应该是在需求后的第一设计,接口设
六个周
2022/10/28
5200
Week16-编辑器服务端API开发
Unity3D--项目:CS局域网之战(二)
我们除了扔进头部中,还可以扔进骨骼头部,保持相对位置,然后通过弯腰等骨骼动画来达到相机跟随
孙寅
2020/06/02
1K0
Unity編輯器案列
Unity最强大的地方之一是它扩展性非常强的编辑器。Unite Europe 2016上有一个视频专门讲编辑器编程的:
bering
2019/12/02
1.4K0
操作系统课设详细解答
(1)学会使用 VC 编写基本的 Win32 Consol Application(控制台应用程序)。 (2)通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解 Windows 进程的“一生”。 (3)通过阅读和分析实验程序,学习创建进程、观察进程、终止进程以及父子进程同步的基本程序设计方法。
全栈程序员站长
2022/09/13
1.1K0
Java安全之SnakeYaml反序列化
YAML是一种可读性高,用来表达数据序列化的格式。YAML是”YAML Ain’t a Markup Language”(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML的意思其实是:”Yet Another Markup Language”(仍是一种标记语言),但为了强调这种语言以数据为中心,而不是以标记语言为重点,而用反向缩略语重命名。
ph0ebus
2023/09/12
6120
PHP中对象的序列化和反序列化
serialize() 可处理除了 resource 之外的任何类型。甚至可以 serialize() 那些包含了指向其自身引用的数组。
宣言言言
2019/12/18
1.4K0
JSON快速入门(Java版)-imooc
个人学习源码:https://github.com/zccodere/study-imooc
chenchenchen
2023/01/30
1.1K0
面向对象的Java实现
1-1:封装 a.为什么需要封装(封装可以是数据方便维护、增加实用性、方便扩展等等。通过面向对象的思想,模拟现实生活中的事物。) b.什么是封装(封装就是将属性私有化,提供共有的方法访问私有属性) c.如何实现封装 例如: package s2java.sg.ch01; public class AccpTeacher3{ private String name;//教员姓名 private int age;//年龄 public String getName(){ return name; } public void setName(String MyName){ name=MyName; } public int getAge(){ return age; } public void setAge(int age){ if(age<22){ System.out.println("错误!最小年龄应为22岁!"); this.age=22;//若果不符合年龄要求,则赋予默认值 }else{ this.age=age; } } /* *返回自我介绍的内容 */ public String introduction(){ return "大家好!我是"+name+",我今年"+age+"岁"; } } 1-2:构造方法 a.为什么需要构造方法(使用构造方法可以给属性赋值。而且,实例化一个对象实际上就是去调用这个对象的构造方法。) b.什么是构造方法(构造方法负责对象成员的初始化工作,为实例变量赋予合适的初始值。) 构造方法必须满足以下语法规则:方法名与类名相同和没有返回类型。或者会所二名同、无返型。 c.带参数的构造方法(带参数的构造方法可以在构造方法中传递参数。) 在使用带参数的构造方法示例化对象时,传递的值和构造方法的参数应当在个数、次序和类型上互相匹配。 例如:AccpTeacher6 teacher=new AccpTeacher6("李名",23,"本科","咨询师"); 通过调用带参数的构造方法,在创建对象时,一并完成了对象成员的初始化工作,简化了对象初始化的代码。 1-3:方法重载 a.生活中的方法重载 例如: 一个司机可以驾驶不同的车子,虽然驾驶的行为实现各不相同,但是这些 操作都称为驾驶。驾驶这一行为就构成了生活中的方法重载。 b.方法重载的代码示例 例如: public static int max(int a,int b) public static int max(long a,long b) public static int max(float a,foat b) public static int max(double a,double b) 多次调用Math类的max()方法,分别进行不同的取最大值的操作。 例如: public class Test{ public static void main(String[] args){ Math.max(1,2); Math.max(1.0F,2.F); Math.max(1.0,2); } } c.构造方法重载(构造方法重载是方法重载的一个典型特例) 例如: package s2Java.sg.ch02; public class AccpTeacher7{ private String name;//教员姓名 private String school="北京中心";//所在中心 public AccpTeacher7(String name){ this.name=name;//设定教员姓名 } public AccpTeacher7(String name,String school){ this.name=name;//设定教员姓名 this.school=school;//设定教员的所在中心 } public String introduction(){ return "大家好!我是"+school+"的"+name; } } 例如: package s2java.sg.ch01; public class AccpTeacher7Test{ public static void main(String[] args){ AccpTeacher7 teacher1=new AccpTeacher7("李明"); System.out.println(teacher1.introduction()); AccpTeacher
用户1112962
2018/09/19
6070
day17-缓冲流&转换流&序列化流&打印流&Properties
前期我们学习了基本的一些流,作为IO流的入门,今天我们要见识一些更强大的流。比如能够高效读写的缓冲流,能够转换编码的转换流,能够持久化存储对象的序列化流等等。这些功能更为强大的流,都是在基本的流对象基础之上创建而来的,就像穿上铠甲的武士一样,相当于是对基本流对象的一种增强。
张哥编程
2024/12/13
1190
Java进阶之路——从初级程序员到架构师,从小工到专家
怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序员也是工作三五年之后开始迷茫的老程序员经常会问到的问题。希望这篇文章会是你看到过的最全面最权威的回答。
凯哥Java
2019/06/28
6730
Java进阶之路——从初级程序员到架构师,从小工到专家
本文主要讲述了如何从一名初级程序员成长为一名优秀的技术管理者。首先,作者通过自己的经历,分享了在技术管理过程中遇到的问题和解决方法。接着,作者介绍了在技术管理过程中需要具备的技能和素质,包括领导力、团队协作、沟通能力、学习能力等。最后,作者提供了一些成为优秀技术管理者的实践建议,包括制定计划、分配任务、持续学习等。
Java后端工程师
2017/12/17
2.7K0
Unity性能调优手册9Unity的Script:空生命周期函数,tags,组件,string,显式销毁的类(Texture2D、Sprite、Material),burst
翻译自https://github.com/CyberAgentGameEntertainment/UnityPerformanceTuningBible/
立羽
2023/11/27
4550
Unity性能调优手册9Unity的Script:空生命周期函数,tags,组件,string,显式销毁的类(Texture2D、Sprite、Material),burst
如何实现一个优雅的Python的Json序列化库
在Python的世界里,将一个对象以json格式进行序列化或反序列化一直是一个问题。Python标准库里面提供了json序列化的工具,我们可以简单的用json.dumps来将一个对象序列化。但是这种序列化仅支持python内置的基本类型。
ThoughtWorks
2020/09/10
1.5K0
如何实现一个优雅的Python的Json序列化库
ObjectInputStream类实现对象的反序列,ObjectOutputStream类实现对象的序列化流
本文主要学习ObjectInputStream类实现对象的反序列,ObjectOutputStream类实现对象的序列化流,接下来小编带大家一起来学习!
Java进阶者
2021/11/19
4760
ObjectInputStream类实现对象的反序列,ObjectOutputStream类实现对象的序列化流
[PHP]实体类基类和序列化__sleep问题
1.构造函数传参 2.__get和__set实现,当调用不存在的属性的时候,可以取值和赋值到data属性数组 3.__sleep实现,当序列化对象的时候,只序列化data属性数组和类内初始化定义的字段 4.__isset实现,可以判断属性是否存在,通过判断data属性数组 5.toArray方法实现,返回data属性数组 6.记录了构造初始化后,动态添加的属性字段
唯一Chat
2019/09/10
5180
09 | 反序列化漏洞:使用了编译型语言,为什么还是会被注入?
我们都知道,Java 是一种高层级的语言。在 Java 中,你不需要直接操控内存,大部分的服务和组件都已经有了成熟的封装。除此之外,Java 是一种先编译再执行的语言,无法像 JavaScript 那样随时插入一段代码。因此,很多人会认为,Java 是一个安全的语言。如果使用 Java 开发服务,我们只需要考虑逻辑层的安全问题即可。但是,Java 真的这么安全吗?
小黑同学
2020/11/24
5370
09 | 反序列化漏洞:使用了编译型语言,为什么还是会被注入?
推荐阅读
相关推荐
Unity编辑器UnityEditor基础(二)
更多 >
LV.1
深圳市宜达数字有限公司总经理
目录
  • 基本介绍
  • REST Client 的优势
  • HTTP 报文内容格式
    • application/json 请求
    • GET
    • POST
    • application/x-www-form-urlencoded 请求
    • GET
    • POST
    • 发送嵌套 json 请求
  • HTTP Language
  • 再说 ContentType
  • 常见问题梳理
    • 1 ContentType 不对应
    • 2 报文格式不准确
  • 开发案例 case
    • Curl 请求
    • guzzle 组件中的 content-type
  • x-www-form-urlencoded 请求
  • json 请求
    • Guzzle 访问实例初始化失败
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档