WebClient与HTTPInterface远程调用对比

远程调用

API/SDK的区别:

1.WebClient

1.1创建与调用

创建WebClient非常简单:

  • webclientcreate0
  • webclient.create(string baseurl)

还可以使用webclient.builder0 配置更多参数项:

  • uribuilderfactory: 自定义uribuilderfactory, 定义baseurl.
  • defaulturivariables:默认uril变量。
  • defaultheader:每个请求默认头
  • defaultcookie:每个请求默认 cookie.
  • defaultrequest:consumer 自定义每个请求
  • filter:过滤client发送的每个请求
  • exchangestrategies:http 消息 reader/writer 自元 er 自定义。
  • clientconnector:http client库设置。

定义Weather服务类,定义weather方法

post请求需要定义body 根据不同的接口定义各自的请求参数以及请求头header

复制代码
public Mono<String> weather(String city){
    //远程调用api
    //创建webclient
    String baseurl = "http://apis.juhe.cn/simpleWeather/query?";
    WebClient client = WebClient.create();
    //定义发请求方式
    Map<String,String>map=new HashMap<>();
    map.put("city",city);
    Mono<String> mono = client.post().uri("http://apis.juhe.cn/simpleWeather/query?key=251518e073ef6c3c9504dd286c3f6a86&city={city}", map)
            .contentType(MediaType.APPLICATION_JSON)//定义响应内容类型
            .header("User-Agent", "ikun")
            .retrieve()
            .bodyToMono(String.class);

    return mono;
}

在Controller类中返回数据

复制代码
//调用外部api获取天气
@GetMapping("weather")
public Mono<String> weather(@RequestParam(value = "city") String city){

    Mono<String> weather = weatherService.weather(city);
    return weather;
}

2.HTTP Interface

2.1导入依赖

复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

2.2定义接口

复制代码
public interface WeatherInterface {

    @GetExchange(url = "/query",accept = "application/json")
    public Mono<String> getweather(@RequestParam("city") String city,
    @RequestParam String key);
}

public Mono<String> weather2(String city){
    //创建客户端
    WebClient client = WebClient.builder().baseUrl("http://apis.juhe.cn/simpleWeather")
            .codecs(clientCodecConfigurer -> {
                clientCodecConfigurer.defaultCodecs().maxInMemorySize(256*1024*1024);
            })
            .build();
    //创建工厂
    HttpServiceProxyFactory factory = HttpServiceProxyFactory.builder(WebClientAdapter.forClient(client)).build();

    //获取代理对象
    WeatherInterface weatherapi = factory.createClient(WeatherInterface.class);
    Mono<String> getweather = weatherapi.getweather(city,"251518e073ef6c3c9504dd286c3f6a86");
    return getweather;

}

从配置文件中取值 ${key}

2.3封装接口配置

复制代码
@Configuration
public class WebApiConfig {
    @Bean
    HttpServiceProxyFactory httpServiceProxyFactory(){
        //创建客户端
        WebClient client = WebClient.builder().baseUrl("http://apis.juhe.cn")
                .defaultHeader("user-agent","ikun") //定义默认请求头
                .codecs(clientCodecConfigurer -> {
                    clientCodecConfigurer.defaultCodecs().maxInMemorySize(256*1024*1024);
                })
                .build();
        //创建工厂
        HttpServiceProxyFactory factory = HttpServiceProxyFactory.builder(WebClientAdapter.forClient(client)).build();
        return factory;
    }
    @Bean
    WeatherInterface weatherInterface(){
        WeatherInterface weatherInterface = httpServiceProxyFactory().createClient(WeatherInterface.class);
        return weatherInterface;
    }

}

weatherservice里可以自动装配WeatherInterface调用

复制代码
@Autowired
private WeatherInterface weatherInterface;

public Mono<String> weather2(String city, @Value("${apikey}")String key){

    Mono<String> getweather = weatherInterface.getweather(city,key);
    return getweather;

}
相关推荐
程序员黑豆6 小时前
Java类型推断完全指南:从var到菱形运算符,掌握使用限制与最佳实践
java·前端·ai编程
GreenTea7 小时前
深度解读 Anthropic 多智能体报告:更强的模型 ≠ 更好的协调
前端·后端·算法
风流 少年7 小时前
Spring AI 2.0:Memory
java·后端·spring
码匠许师傅7 小时前
【C++ 面试真题】聊聊 C++ 的移动语义与右值引用
java·c++·面试
2603_965148117 小时前
如何解析JSON数据?API返回的商品信息处理教程
开发语言·数据库·python·自动化·json·api
万少7 小时前
给 DeepSeek Harness 装个"应用商店":一条命令,595 个插件随你逛
前端·javascript·后端
小席是个热心肠7 小时前
AI相关的自我学习
java·人工智能·学习
Java成神之路-9 小时前
Spring Cloud 微服务契约先行:为什么 Controller 建议要实现 Feign 接口?
spring·spring cloud·微服务
知无不研10 小时前
lambda表达式的使用(3)
开发语言·c++·lambda
数智化管理手记10 小时前
海量数据如何沉淀有效数据资产?数据标准化治理方案如何搭建?
java·大数据·人工智能