Vert.x Web服务有两种协议,一种是HTTP,另外一种是使用ssl的HTTPS,请求的方式有五种,分别是get、post、put、delete、head。为了简单,服务端主要实现对HTTP协议的get和post的请求处理。如下

 @Override
public void start() throws Exception { HttpServer server = vertx.createHttpServer();
Router router = Router.router(vertx); // 处理get请求
router.get("/get").handler(request -> {
String username = request.request().getParam("username");
String password = request.request().getParam("password"); System.out.println(username + " " + password); request.response().end("get request success");
}); // 处理post请求
router.post("/post").handler(request -> {
request.request().bodyHandler(body->{
System.out.println(body.toJsonObject().toString());
JsonObject responseData = new JsonObject()
.put("msg","success");
request.response().end(responseData.toString());
});
}); server.requestHandler(router::accept);
server.listen(80); }

上面的代码就是创建了一个Web服务,监听/get和/post地址,分别处理get请求和post请求。如果对上面的代码不理解的朋友可以参考《创建HTTP服务》 和 《Web开发 - 路由》

发送HTTP GET请求

GET请求对于一些敏感信息非常容易泄露。

 @Override
public void start() throws Exception {
// 创建WebClient,用于发送HTTP或者HTTPS请求
WebClient webClient = WebClient.create(vertx);
// 以get方式请求远程地址
webClient.getAbs("http://localhost/get").send(handle -> {
// 处理响应的结果
if (handle.succeeded()) {
// 这里拿到的结果就是一个HTML文本,直接打印出来
System.out.println(handle.result().bodyAsString());
}
});
}

这是最简单的一种请求方式,在上面的代码中,首先创建了WebClient对象,通过WebClient可以方便的发送HTTP请求。有朋友可能会注意到,在Vert.x提供的核心包中有HttpClient,可以通过Vert.x实例获取

HttpClient httpClient = vertx.createHttpClient();

HTTPClient这个接口也可以发送HTTP请求,只是它比较低级,如果在请求中带复杂数据,附带请求头,封装响应结果都需要自己来处理。因此,Vert.x提供了vertx-web-client的支持。

WebClient的API非常简单,发送GET请求,可以使用getAbs。Abs是绝对地址的意思,除了使用绝对地址,还可以使用域名+端口号+请求地址的方式,代码如下:

 webClient.get(80, "localhost", "/get").send(handle -> {
// 处理响应的结果
if (handle.succeeded()) {
// 这里拿到的结果就是一个HTML文本,直接打印出来
System.out.println(handle.result().bodyAsString());
}
});

第一个参数是端口号,第二个参数是域名,第三个参数是请求地址。

发送HTTP请求 请求头

HTTP协议包含三部分,请求行、请求头和请求体。一般来讲,不建议在GET请求的请求体中带数据,但请求头数据是每个请求都有的,比如使用User-Agent指定设备的类型以及操作系统等等。我们在请求远程服务的时候,如何设置请求头呢,代码如下

 webClient.get(80, "localhost", "/get")
.putHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0")
.send(handle -> {
// 处理响应的结果
if (handle.succeeded()) {
// 这里拿到的结果就是一个HTML文本,直接打印出来
System.out.println(handle.result().bodyAsString());
}
});

设置超时时间

HTTP请求是一个耗时操作,受到网络等因素的影响,很多时候我们要限制一个最大的请求时间,超过这个时间就不去处理了,可以通过WebClientOptions设置

 @Override
public void start() throws Exception {
// 创建WebClient,用于发送HTTP或者HTTPS请求
WebClientOptions webClientOptions = new WebClientOptions()
.setConnectTimeout(500); // ms
WebClient webClient = WebClient.create(vertx, webClientOptions);
// 以get方式请求远程地址
webClient.getAbs("http://localhost/get").send(handle -> {
// 处理响应的结果
if (handle.succeeded()) {
// 这里拿到的结果就是一个HTML文本,直接打印出来
System.out.println(handle.result().bodyAsString());
}
});
}

除了设置超时时间以外,还可以设置是否重定向到页面以及HTTPS的证书等等。

发送HTTP GET请求 带数据

很多的情况下在请求服务端的时候都需要带一些必要的数据,GET请求带数据有两种方式,第一种就是在请求的URL后直接拼接参数 ?username=xxx&password=xxx的形式。还有一种方式是通过addQueryParam的方式添加请求参数,如下所示

 @Override
public void start() throws Exception {
// 创建WebClient,用于发送HTTP或者HTTPS请求
WebClient webClient = WebClient.create(vertx);
// 以get方式请求远程地址
webClient
.getAbs("http://localhost/get")
// 通过这种方式发送数据
.addQueryParam("username", "admin")
.addQueryParam("password", "admin123")
.send(handle -> {
// 处理响应的结果
if (handle.succeeded()) {
// 这里拿到的结果就是一个HTML文本,直接打印出来
System.out.println(handle.result().bodyAsString());
}
});
}

上面的代码就是向服务端发送两个参数,一个是username一个是password。这两个参数在网络上都是通过明文进行传输的,因此如果真的是要做登陆,一定不要使用get方式。这里我们并不需要去思考服务端如何接收这两个参数,客户端只要能够保证参数能够发送出去就可以了。

发送POST请求

GET方式在浏览器中使用的还是比较多,但在服务调用中一般比较少,在服务调用中一般会选择使用POST方式,下面看POST方式请求远程服务的案例,代码如下

 @Override
public void start() throws Exception {
// 创建WebClient,用于发送HTTP或者HTTPS请求
WebClient webClient = WebClient.create(vertx);
// 以get方式请求远程地址
webClient.postAbs("http://localhost/post")
.send(handle -> {
// 处理响应的结果
if (handle.succeeded()) {
// 这里拿到的结果就是一个HTML文本,直接打印出来
System.out.println(handle.result().bodyAsString());
}
});
}

POST方式和GET方式请求在API调用上非常类似,上面的代码中,只是调用了postAbs方法而已,底层通信协议是如何封装的开发者完全不用关注,getAbs和postAbs在底层处理方式是完全不同的。

发送POST请求 带数据

当然了,一般进行服务调用的时候也都需要附带一些数据,比如我们要调用发短信服务,那么就至少需要附带手机号和短信内容过去当然还需要一些认证信息,服务提供方发送短信成功之后需要告诉我们已经受理成功,或者仅仅是收到我们的请求。在POST中带数据的方式比较多,数据类型也多样化,主要有以下三种类型

1. form表单

2. json字符串

3. xml字符串

第一种数据类型是前后端交互时经常使用的方式,第二、三种方式是服务调用常用的序列化方式。下面以发送JSON字符串的形式来调用远程服务,代码如下:

 @Override
public void start() throws Exception {
// 创建WebClient,用于发送HTTP或者HTTPS请求
WebClient webClient = WebClient.create(vertx); // 构造请求的数据
JsonObject data = new JsonObject()
.put("username", "admin")
.put("password", "admin123"); // 以get方式请求远程地址
webClient.postAbs("http://localhost/post")
.sendJsonObject(data, handle -> {
// 处理响应的结果
if (handle.succeeded()) {
// 这里拿到的结果就是一个HTML文本,直接打印出来
// handle.result().bodyAsJsonObject() 可以解析Json数据
System.out.println(handle.result().bodyAsString());
}
});
}

在上面的代码中,我们先创建了一个JsonObject对象,和GSON和fastjson中的JsonObject类似,但感觉Vert.x提供的JsonObject更为强大一些,通过JsonObject可以非常方便的构造一个Json字符串。当然除了JsonObject以外,Vert.x还提供了JsonArray可以构造一个json数组。

构造一个json对象以后,在请求远程服务的时候可以通过sendJsonObject方法,将构造好的json对象传入,Vert.x底层就会给我们把json对象格式化为json字符串,发送给服务提供者。服务提供者就会收到如下请求数据:

 {
"username": "admin",
"password": "admin123"
}

服务端收到这些数据也可以使用JsonObject对象将字符串转为json对象,方便的读写数据。当然了,服务端收到我们的数据之后进行处理,最后还需要给客户端响应数据,服务端也可以给客户端响应json字符串,客户端同样可以对json字符串进行处理。

这种案例非常多,可以参考微信支付扫码接口文档

https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1

请求HTTPS服务

使用HTTP协议,不管是get请求还是post请求,数据传输都是明文传输的,因此敏感信息通过HTTP方式都有暴露的危险。现在越来越多的网站都已经升级为HTTPS协议,通过加密的方式进行传输,保证敏感信息的安全。

HTTP请求安全简单来讲有两点,第一个是数据被篡改,第二个是敏感数据被窃取。解决数据篡改的手段是对消息进行签名,解决数据窃取的手段是加密,HTTPS实际上就是为了解决敏感信息被窃取的问题的。

对于HTTPS的原理这里不做过多的介绍,感兴趣的朋友可以在网络上搜索相关文章,在Vert.x中请求HTTPS也非常简单,代码如下:

 @Override
public void start() throws Exception {
// 创建WebClient,用于发送HTTP或者HTTPS请求
WebClient webClient = WebClient.create(vertx);
// 以get方式请求远程地址
webClient.getAbs("https://www.sina.com")
.ssl(true)
.send(handle -> {
// 处理响应的结果
if (handle.succeeded()) {
// 这里拿到的结果就是一个HTML文本,直接打印出来
System.out.println(handle.result().bodyAsString());
}
});
}

上面的代码是我要请求新浪的主页,可以看到,只需要在调用send方法之前,调用ssl方法,并指定为true即可。

Vert.x(vertx)发送 HTTP/HTTPS请求的更多相关文章

  1. 『言善信』Fiddler工具 — 15、使用Fiddler抓取HTTPS请求

    目录 1.Fiddler抓取HTTPS过程 2.拓展:SSL/TLS证书握手原理 3.Fiddler抓取HTTPS原理总结 4.Fiddler抓取HTTPS设置 步骤1:配置证书 步骤2:勾选设置 5 ...

  2. 在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求

    通用辅助类  下面是我编写的一个辅助类,在这个类中采用了HttpWebRequest中发送GET/HTTP/HTTPS请求,因为有的时候需 要获取认证信息(如Cookie),所以返回的是HttpWeb ...

  3. 【转载】JMeter学习(三十六)发送HTTPS请求

    Jmeter一般来说是压力测试的利器,最近想尝试jmeter和BeanShell进行接口测试.由于在云阅读接口测试的过程中需要进行登录操作,而登录请求是HTTPS协议.这就需要对jmeter进行设置. ...

  4. (转) 在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求

    转自:http://blog.csdn.net/zhoufoxcn/article/details/6404236 通用辅助类 下面是我编写的一个辅助类,在这个类中采用了HttpWebRequest中 ...

  5. 【转】在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求

    http://zhoufoxcn.blog.51cto.com/792419/561934 这个需求来自于我最近练手的一个项目,在项目中我需要将一些自己发表的和收藏整理的网文集中到一个地方存放,如果全 ...

  6. Web Server 使用WebClient 发送https请求 The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel

    使用WebClient 发送https请求 使用WebClient发送请求时,并且是以https协议: WebClient webClient = new WebClient(); string re ...

  7. 在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求【转载】

    标签:C# HTTPS HttpWebRequest HTTP HttpWebResponse 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. ...

  8. 使用HttpClient发送HTTPS请求以及配置Tomcat支持SSL

    这里使用的是HttpComponents-Client-4.1.2 package com.jadyer.util; import java.io.File; import java.io.FileI ...

  9. HttpClient 发送 HTTP、HTTPS 请求的简单封装

    import org.apache.commons.io.IOUtils; import org.apache.http.HttpEntity; import org.apache.http.Http ...

随机推荐

  1. SceneView聚焦当前选中项

    编辑器代码如下所示: Selection.activeGameObject = indexer; // 方法一 SceneView.FrameLastActiveSceneView(); // 方法二 ...

  2. MicroK8s及KubeFlow安装文档

    安装简单的k8s大约有三种思路:minikube,microk8s,kubeadm.minikube 虽然是官方出品,但主要还是基于虚拟机做的设计.在 Linux 生产环境下,microk8s 可能是 ...

  3. 01-C#笔记-hello_world

    /* * 主文件是 xxx.cs * 基本的 hello world 程序如下: */ using System; using System.Collections.Generic; using Sy ...

  4. 三块sm865组建RAID0

    介绍 使用三块sm865组件raid0,cpu为6700k,主板为华硕的z170-A 这里使用的是主板自带的raid0,不是win10自带的带区卷 CrystalDiskMark AS SSD Ben ...

  5. ORM常用的13个方法

    介绍一个可以以py脚本方式运行ORM操作的方法: 可在项目内新建个py文件,复制项目内manage.py文件中的以下代码: if __name__ == "__main__": o ...

  6. 搜索法 | 1103 dfs搜索:符合条件的多项式

    其实这题我已经写过两遍了,但都是在看过算法笔记的情况下写的.方法不难,只要能想出来. 找到一个项数为k,每项为p次幂,和为n,并且在有多个结果的情况下要求数字之和最大的一个多项式.如果数字之和相等.还 ...

  7. 【meet in the mid】【qbxt2019csp刷题班day1C】birthday

    Description 给定一个长度为 \(n\) 序列,值域为 \([1, v]\),每次选择一段区间,要求在这个区间上选择一些元素加入到两个集合中,每个元素要么不选要么只能加入一个集合,要求两个集 ...

  8. SQL 变形

    需求:共有协议X份,已签XX份,待签X份 sql: select count(1) 总记录数, sum(case when XY_STATUS='1' then 1 else 0 end)待签, su ...

  9. HTML基础知识---文本编辑练习

    飘柔兰花去油洗发水液露去屑止痒控油                                         阿道夫净屑舒爽清洁头皮去屑洗发水520ml                      ...

  10. [cf113d]Museum

    传送门 Solution 设一个状态为 \((x,y)\) 表示两人在的位置,求出每个状态期望出现的次数 设一个状态为 \(u\) , \(x_u^0=[u==(a,b)]\) 所以一个状态出现的次数 ...