curl、Postman、HttpClient

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值