1、curl
curl命令可以实现http请求,默认使用GET请求,如下所示:
@WebServlet(urlPatterns = "/test2")
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/html");
PrintWriter pw = resp.getWriter();
pw.write("<h1>hello world</h1>");
pw.flush();
}
}
-v表示显示通信详情:
-h用来设置请求的首部行(请求头),如 curl -h 'Accept-Language: en-US' -h 'Content-Type: application/octet-stream' https://google.com 。
-d用来设置请求体附带的数据,默认使用POST请求:curl -d '{"user_id": "123", "coin":100, "success":1, "msg":"OK!" }' http://192.168.0.1:8001/test 。
-x用来指定请求方法,如curl -x POST https://www.example.com 。
关于curl的其他选项,可以参考:CURL 发送POST请求 - 博客萨斯州 - 博客园 。
Windows命令行下curl的选项值要用双引号而不是单引号?
2、Postman
PostMan是chrome的插件,但也可以在chrome设置中将其创建到桌面快捷方式来直接使用,其提供了界面化的http请求发送设置,可以很方便的设置URL、参数、Headers、Request Body。
Post还有很多其它功能:可以将发送的请求保存和通过collection进行归类,以便后续的测试。可以针对response内容的格式自动美化,,JSON、 XML 或是 HTML 都會整理成我们可以阅读的格式。可以设置变量,将指定的内容保存到变量里,这样就不用重复输入内容。
Postman官网下载地址 https://www.postman.com/downloads/:
- Postman for MAC https://dl.pstmn.io/download/latest/osx
- Postman for windows 64 https://dl.pstmn.io/download/latest/win64
- Postman for windows X86 https://dl.pstmn.io/download/latest/win32
- Postman for linux https://dl.pstmn.io/download/latest/linux64
3、Http请求工具
RestTemplate和WebClient是Spring中的HTTP 请求工具,RestTemplate提供了常见的REST请求方案模版,其会阻塞等待http响应。WebClient是Spring WebFlux框架的核心组件之一,底层实现是Netty非阻塞IO通信框架,这使得其处理单个HTTP请求的响应时长虽然并不比RestTemplate更快,但是它处理并发的能力更强,可以使用较少的线程处理更多的并发。
如下所示,WebClient发送一个请求后会调用IO线程中代码去执行操作,收到响应后,其会把结果设置到Mono对象,可以订阅Mono来获得异步响应——通过lambda 表达式。
下面第一段代码演示了使用WebClient来阻塞等待Http请求的示例,第二段代码演示了非阻塞http请求示例,第三段代码演示了带有多个查询参数http请求的示例,第四段代码演示了一个附带JSON实体数据的http请求(该JSON数据由map转换而来),然后将响应转换为List:
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.reactive.function.client.WebClientResponseException;
public class Foo {
public static void main(String args[])
{
WebClient client = WebClient.create("https://api.example.com");
try{
client.get().uri("/path/1") //GET请求
.retrieve() //触发请求
.bodyToMono(String.class) //将响应体转换为String类型的Mono对象
.doOnSuccess(response -> System.out.println(response)) //处理成功响应
.doOnError(WebClientResponseException.class, error -> {
System.err.println("Error status code: " + error.getRawStatusCode());
System.err.println("Error message: " + error.getResponseBodyAsString());}) //处理错误响应
.block(); //等待请求执行完成
client.get().uri("/path/1")
.retrieve()
.bodyToMono(String.class)
.subscribe(response -> System.out.println(response)); //订阅结果,lambda回调会在WebClient的线程中执行
Thread.sleep(3000);
//下面最终的URI将会是https://api.example.com/search?q=WebClient&page=1&size=20
client.get()
.uri(uriBuilder -> uriBuilder.path("/search")
.queryParam("q", "WebClient")
.queryParam("page", 1)
.queryParam("size", 20)
.build())
.retrieve()
.bodyToMono(String.class)
.subscribe(response -> System.out.println(response));
WebClient webClient = WebClient.create();
Map<String, String> m = new HashMap<>();
m.put("name", "John");
m.put("age", "30");
Mono<List<SomeResponse>> response = webClient.post()
.uri("https://example.com/api/users")
.contentType(MediaType.APPLICATION_JSON) //设置请求头的Content-Type为application/json
.body(BodyInserters.fromValue(m)) //将map转换为JSON后设置到请求体中
.retrieve()
.bodyToFlux(SomeResponse.class) //将响应体转换为一个Flux(这里假设响应的数据是JSON数组格式的)
.collectList(); //将Flux中的元素合并为一个List对象
response.subscribe(
result -> System.out.println(result.toString()),/*成功处理, 会得到一个List类型的result*/
error -> System.err.println("Error: " + error.getMessage()), /*错误处理*/
() -> System.out.println("Request completed.") /*完成处理*/
);
}catch (Exception e){
e.printStackTrace();
}
}
}
如下为在SpringBoot项目中使用WebClient的话需要的相关maven依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
除了使用JavaSE中的HttpURLConnection、Spring中的RestTemplate、WebClient来请求http外,还可以使用第三方的http客户端,如HttpClient和Okhttp 。
HttpClient是一个Http客户端通信库,用来发送和接收 HTTP 报文,它支持多种请求协议,如 GET、POST 等,并允许开发者自由地设置请求头、请求参数、连接池等,HttpClient 还提供了基于线程池的异步请求处理方式。HttpClient现在属于Apache HttpComponents项目的模块。
Okhttp 是由一款轻量级网络请求库,支持普通的 HTTP / 1.1 和 SPDY。