当前位置: 首页 > 工具软件 > mica > 使用案例 >

HttpClient之mica-http 的使用

高晋
2023-12-01

1 前言

  • mica-http 是 对现在流行的okhttp 的再次封装,通过阅读mica-http,结合自己的日常使用,做一下记录。

2具体使用
2.1 引入依赖

//此model使用springboot版本为2.1.5.RELEASE

       <dependency>
            <groupId>net.dreamlu</groupId>
            <artifactId>mica-http</artifactId>
            <version>1.2.1</version>
        </dependency>

2.2示例代码

  • 方法支持 get、post、patch、put、delete请求的url,
  • 设定全局日志级别 NONE,BASIC,HEADERS,BODY, 默认:NONE
        HttpRequest.setGlobalLog(LogLevel.BODY);//这是全局日志,有局部日志(见下面例子),局部日志优先于全局日志

2.2.1 同步请求

HttpRequest.get("https://www.baidu.com")
    .log(LogLevel.BASIC)             //设定本次的日志级别,优先于全局
    .addHeader("Content-Type", "application/json") // 添加 header
    .addCookie(new Cookie.Builder()  // 添加 cookie
        .name("sid")
        .value("mica_user_001")
        .build()
    )
    .query("q", "mica") //设置 url 上拼接的参数,默认进行 url encode
    .queryEncoded("name", "encodedValue")//非必要,不懂干嘛的
    //.formBuilder()    // 表单构造器,同类 multipartFormBuilder 文件上传表单
    //.add("id", 123123) // 表单参数
    //.build()  //表单结束
    .execute()                      // 发起请求
    .asJsonNode();                  // 结果集转换,注:如果网络异常等会直接抛出异常。
// 同类的方法有 asString、asBytes、asStream
// json 类响应:asJsonNode、asValue、asList、asMap,采用 jackson 处理
// xml、html响应:asDocument,asDomValue、asDomList采用的 jsoup 处理
// file 文件:toFile

  #对结果集的转换还可以这样写
  //onFailed() 网络等异常情况的消费处理
  //onResponse(); 处理响应,有网络异常等直接返回 null
  // onSuccess() http code in [200..300) 处理响应,有网络异常等直接返回 null
  //onSuccessOpt();  返回值为optional类型,不成功返回空
例如:
String html = HttpRequest.post("https://www.baidu.com")
    .execute()
    .onFailed((request, e) -> {// 网络等异常情况的消费处理,可无
        e.printStackTrace();
    })
    .onResponse(ResponseSpec::asString);// 处理响应,有网络异常等直接返回 null

2.2.1.1举例

   WoDeviceAuthorizationDto _woDeviceAuthorizationDto = HttpRequest.put("http://wo-api.uni-ubi.com/v1/" + appId + "/device/batchBind")
                .addHeader("token", commonService.getWoToken())
                .addHeader("Content-Type", "application/json")
                .bodyJson(woDeviceAuthorizationDto)
                .execute()
                .asValue(WoDeviceAuthorizationDto.class);// 返回自定义对象

2.2.2异步请求

  • 异步请求和同步请求编码的时候需要注意的点
    ①必须使用 async() 开启异步
    ②紧跟async()后面一定要有响应方面的处理。
    ③没有return返回值
HttpRequest.delete("https://www.baidu.com")
    .async() // 开启异步
    .onFailed((request, e) -> {    // 异常时的处理
        e.printStackTrace();
    })
    .onResponse(responseSpec -> {  // 消费响应, 注意:响应的流只能读一次
        int httpCode = responseSpec.code();

    })
    .onSuccessful(responseSpec -> { // 消费响应成功 http code in [200..300)
        // 注意:响应结果流只能读一次
        JsonNode jsonNode = responseSpec.asJsonNode();
    })
    .execute(); // 异步最后发起请求

3 相关案例

HttpRequest.setGlobalLog(LogLevel.BODY);

// 同步,异常时 返回 null
String html = HttpRequest.get("www.baidu.com")
    .connectTimeout(Duration.ofSeconds(1000))
    .query("test", "a")
    .query("name", "張三")
    .query("x", 1)
    .query("abd", Base64Util.encode("123&$#%"))
    .queryEncoded("abc", Base64Util.encode("123&$#%"))
    .execute()
    .onFailed(((request, e) -> {
        e.printStackTrace();
    }))
    .onSuccess(ResponseSpec::asString);
System.out.println(html);

// 同步调用,返回 Optional,异常时返回 Optional.empty()
Optional<String> opt = HttpRequest.post(URI.create("https://www.baidu.com"))
    .bodyString("Important stuff")
    .formBuilder()
    .add("a", "b")
    .execute()
    .onSuccessOpt(ResponseSpec::asString);

// 同步,成功时消费(处理) response
HttpRequest.post("https://www.baidu.com/some-form")
    .addHeader("X-Custom-header", "stuff")
    .execute()
    .onSuccessful(responseSpec -> {
        String text = responseSpec.asString();
        System.out.println(text);
    });

// 同步,异常时直接抛出
HttpRequest.get("https://www.baidu.com/some-form")
    .execute()
    .asString();

// async,异步执行结果,失败时打印堆栈
HttpRequest.get("https://www.baidu.com/some-form")
    .async()
    .onSuccessful(System.out::println)
    .onFailed((request, e) -> {
        e.printStackTrace();
    })
    .execute();
  • 完结
 类似资料: