SpringBoot访问外部接口的常见方式

文章目录

  • SpringBoot访问外部接口
    • 模拟服务接口
    • RestTemplate
      • pom.xml
      • RestTemplateConfig
      • ClientTestRestTemplateController.java
      • 结果
    • WebClient
      • pom.xml
      • ClientTestWebClientController.java
      • 结果
    • HttpClient
      • pom.xml
      • ClientTestHttpClientController.java
      • 结果
    • OkHttp
      • pom.xml
      • ClientTestOkHttpController.java
      • 结果

SpringBoot访问外部接口

模拟服务接口

package com.sin.controller;

import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * @createTime 2023/12/20 9:25
 * @createAuthor SIN
 * @use
 */
@RestController
@RequestMapping("/service")
public class ServiceTestController {

    private Map serviceMap = new HashMap();


    @GetMapping("/getData")
    public Map getServiceMap() {
        return serviceMap;
    }

    @PostMapping("/setData")
    public String setServiceMap(@RequestBody Map serviceMap) {
        this.serviceMap = serviceMap;
        return "添加成功";
    }

}

RestTemplate

RestTemplate是Spring提供的一个HTTP客户端,可以用来发送HTTP请求并处理响应。

pom.xml

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-webfluxartifactId>
dependency>

RestTemplateConfig

package com.sin.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequest;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

/**
 * @createTime 2023/12/20 9:32
 * @createAuthor SIN
 * @use
 */
@Configuration
public class RestTemplateConfig {

    // 注册RestTemplate实例为bean
    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory factory){
        return new RestTemplate(factory);
    }

    // 注册ClientHttpRequestFactory实例为bean
    @Bean
    public ClientHttpRequestFactory clientHttpRequestFactory(){
        // 创建SimpleClientHttpRequestFactory实例
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        // 设置读取超时时间为5000毫秒
        factory.setReadTimeout(5000);
        // 设置连接超时时间为5000毫秒
        factory.setConnectTimeout(5000);
        return factory;
    }
}

ClientTestRestTemplateController.java

package com.sin.controller;

import com.sin.config.RestTemplateConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;

/**
 * @createTime 2023/12/20 9:31
 * @createAuthor SIN
 * @use 使用RestTemplate来发送HTTP请求
 */
@RestController
public class ClientTestRestTemplateController {


    @Autowired
    private RestTemplate restTemplate;

    /**
     * 调用url路径添加数据
     * @return 返回发送请求后的响应结果,作为HTTP响应返回给客户端。
     */
    @GetMapping("/addData")
    public String addData(){
        // 指定要发送POST请求的目标url路径
        String url = "http://localhost:8080/service/setData";
        // 添加数据
        Map map = new HashMap();
        map.put("id",1);
        map.put("name","张三");

        // 使用postForObject来发送POST请求(目标url,请求体参数,以字符串形式相应)
        return restTemplate.postForObject(url,map,String.class);
    }
}

结果

未添加数据之前

SpringBoot访问外部接口的常见方式_第1张图片

添加数据

SpringBoot访问外部接口的常见方式_第2张图片

添加数据之后

SpringBoot访问外部接口的常见方式_第3张图片

WebClient

RestTemplate有可能在未来的版本中被弃用,WebClient是Spring 5中新增的一个HTTP客户端,支持异步调用和响应式编程等特性,来代替RestTemplate

pom.xml

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-webfluxartifactId>
dependency>
<dependency>
    <groupId>com.alibabagroupId>
    <artifactId>fastjsonartifactId>
    <version>1.2.62version>
dependency>

ClientTestWebClientController.java

package com.sin.controller;

import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;
import com.alibaba.fastjson.JSON;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;

/**
 * @createTime 2023/12/20 9:54
 * @createAuthor SIN
 * @use
 */
@RestController
public class ClientTestWebClientController {

    @GetMapping("/addData")
    public Object addData(){
        // 指定要发送POST请求的目标url路径
        String url = "http://localhost:8080/service/setData";
        // 添加数据
        Map map = new HashMap();
        map.put("name","sin");
        // 添加数据转换为json数据
        String requestJson =  JSON.toJSONString(map);
        // 异步单值容器
        Mono mono = WebClient
                // 创建webClient实例
                .create()
                // post请求
                .post()
                // 请求的url路径
                .uri(url)
                // 指定请求的为json
                .contentType(MediaType.APPLICATION_JSON)
                // 请求参数
                .bodyValue(requestJson)
                // 获取相应结果
                .retrieve()
                // 将结果转换为String类型
                .bodyToMono(String.class);
        // 获取异步结果
        return mono.block();
    }
}

结果

未添加数据之前

SpringBoot访问外部接口的常见方式_第4张图片

添加数据

SpringBoot访问外部接口的常见方式_第5张图片

添加数据之后

SpringBoot访问外部接口的常见方式_第6张图片

HttpClient

HttpClient是Apache的一个开源HTTP客户端,可以用来发送HTTP请求并处理响应。虽然不是Spring提供的组件,但可以与Spring集成使用。

pom.xml

<dependency>
    <groupId>org.apache.httpcomponentsgroupId>
    <artifactId>httpclientartifactId>
    <version>4.5.13version>
dependency>

ClientTestHttpClientController.java

package com.sin.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
 * @createTime 2023/12/20 11:02
 * @createAuthor SIN
 * @use
 */
@RestController
public class ClientTestHttpClientController {

    @GetMapping("/addData")
    public String addData() throws IOException {
        // 创建HttpClient对象
        HttpClient httpClient = HttpClientBuilder.create().build();

        // 创建HttpPost对象,并设置URL
        HttpPost httpPost = new HttpPost("http://localhost:8080/service/setData");

        // 添加Header信息
        httpPost.addHeader("Content-Type", "application/json");

        // 创建Map数据
        Map<String, Object> data = new HashMap<>();
        data.put("name", "张三");
        data.put("age", 20);

        // 将Map数据转换为JSON格式
        String json = new ObjectMapper().writeValueAsString(data);

        // 创建StringEntity对象,并将JSON数据作为参数传入
        StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);

        // 设置请求体
        httpPost.setEntity(entity);

        // 发送POST请求
        HttpResponse response = httpClient.execute(httpPost);

        // 获取响应实体
        HttpEntity responseEntity = response.getEntity();

        // 打印响应结果
        String result = EntityUtils.toString(responseEntity);
        return result;
    }
}

结果

未添加数据之前

SpringBoot访问外部接口的常见方式_第7张图片

添加数据

SpringBoot访问外部接口的常见方式_第8张图片

添加数据之后

SpringBoot访问外部接口的常见方式_第9张图片

OkHttp

OkHttp是Square公司开发的一个高性能的HTTP客户端,具有连接池、缓存、拦截器等功能。虽然不是Spring提供的组件,但可以与Spring集成使用。

pom.xml

<dependency>
    <groupId>com.squareup.okhttp3groupId>
    <artifactId>okhttpartifactId>
    <version>4.9.1version>
dependency>

ClientTestOkHttpController.java

package com.sin.controller;

import com.fasterxml.jackson.databind.ObjectMapper;
import okhttp3.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @createTime 2023/12/20 11:10
 * @createAuthor SIN
 * @use
 */
@RestController
public class ClientTestOkHttpController {

    @GetMapping("/addData")
    public String addData() throws IOException {
        // 创建OkHttpClient对象
        OkHttpClient client = new OkHttpClient();

        // 创建Map数据
        Map<String, Object> data = new HashMap<>();
        data.put("1", 1);
        data.put("2", 2);

        // 将Map数据转换为JSON格式
        String json = new ObjectMapper().writeValueAsString(data);

        // 设置请求体
        RequestBody body = RequestBody.create(json, MediaType.parse("application/json"));

        // 创建Request对象,并设置URL和请求体
        Request request = new Request.Builder()
                .url("http://localhost:8080/service/setData")
                .post(body)
                .build();

        // 发送请求并获取响应
        Response response = client.newCall(request).execute();

        // 获取响应结果
        String result = response.body().string();

        return result;
    }
}

结果

未添加数据之前

SpringBoot访问外部接口的常见方式_第10张图片

添加数据

SpringBoot访问外部接口的常见方式_第11张图片

添加数据之后

SpringBoot访问外部接口的常见方式_第12张图片

你可能感兴趣的:(spring,boot,后端,java)