在Spring-Boot中从我的服务器调用另一个rest api


70

我想根据用户的特定要求从后端调用另一个Web-api。例如,我想调用Google FCM发送消息API,以便在事件中向特定用户发送消息。

是否改造有什么方法来实现这一目标?如果没有,我该怎么做?


3
您不需要第三方库。春天已经有了RestTemplate
Paul Samsotha '17


2
RestTemplate将在以后的版本中弃用,使用更现代的替代WebClient
jump_monkey

Answers:


119

这个网站有一些使用spring的RestTemplate的漂亮示例。 这是一个如何获取简单对象的代码示例:

private static void getEmployees()
{
    final String uri = "http://localhost:8080/springrestexample/employees.xml";

    RestTemplate restTemplate = new RestTemplate();
    String result = restTemplate.getForObject(uri, String.class);

    System.out.println(result);
}

对象结果= restTemplate.getForObject(uri,Object .class); -更通用
穆罕默德·法赞·乌丁

我曾考虑过@Muhammad Faizan Uddin,但是如果Object由于某种原因无法正确序列化,则iirc现在可能会起作用;而字符串方法始终有效,因为JSON始终可以序列化为字符串。
Torsten N.

11
RestTemplate将在以后的版本中弃用,使用更现代的替代WebClient
jump_monkey

1
下面为WebClient添加了答案
anddero

11

尝试通过调用另一个API / URI而不是String来尝试获取自定义POJO对象详细信息作为输出,请尝试此解决方案。我希望这对于如何使用RestTemplate也将是清楚的,对您有所帮助,

Spring Boot中,首先我们需要在@Configuration带注释的类下为RestTemplate创建Bean 。您甚至可以编写一个单独的类,并使用@Configuration进行注释,如下所示。

@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
       return builder.build();
    }
}

然后,你必须定义RestTemplate@Autowired@Injected服务/控制器,无论您在什么尝试使用RestTemplate下。使用以下代码,

@Autowired
private RestTemplate restTemplate;

现在,将看到如何使用上面创建的RestTemplate从我的应用程序中调用另一个api的部分。为此,我们可以使用多种方法,例如execute()getForEntity()getForObject()等。在这里,我将代码放在execute()的示例中。我什至尝试了另外两个,我遇到了将返回的LinkedHashMap转换为预期的POJO对象的问题。下面的execute()方法解决了我的问题。

ResponseEntity<List<POJO>> responseEntity = restTemplate.exchange(
    URL, 
    HttpMethod.GET, 
    null, 
    new ParameterizedTypeReference<List<POJO>>() {
    });
List<POJO> pojoObjList = responseEntity.getBody();

快乐编码:)


因此,当我尝试使用几乎所有准确的代码时,出现错误“无法从起始对象令牌中反序列化[my pojo类]实例。您知道为什么会这样吗?

请验证您的pojo是否实现了Serializable接口?如果没有实现,请尝试。
Nallamachu

不幸的是,这并不能解决问题,还是谢谢你。

9

Modern Spring 5+答案使用WebClient代替RestTemplate

WebClient将特定的Web服务或资源配置为Bean(可以配置其他属性)。

@Bean
public WebClient localApiClient() {
    return WebClient.create("http://localhost:8080/api/v3");
}

从您的服务中注入并使用bean。

@Service
public class UserService {

    private static final Duration REQUEST_TIMEOUT = Duration.ofSeconds(3);

    private final WebClient localApiClient;

    @Autowired
    public UserService(WebClient localApiClient) {
        this.localApiClient = localApiClient;
    }

    public User getUser(long id) {
        return localApiClient
                .get()
                .uri("/users/" + id)
                .retrieve()
                .bodyToMono(User.class)
                .block(REQUEST_TIMEOUT);
    }

}

4

为REST模板创建Bean,以自动连接REST模板对象。

@SpringBootApplication
public class ChatAppApplication {

    @Bean
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(ChatAppApplication.class, args);
    }

}

通过使用RestTemplate-exchange()方法来使用GET / POST API。以下是在控制器中定义的post api。

@RequestMapping(value = "/postdata",method = RequestMethod.POST)
    public String PostData(){

       return "{\n" +
               "   \"value\":\"4\",\n" +
               "   \"name\":\"David\"\n" +
               "}";
    }

    @RequestMapping(value = "/post")
    public String getPostResponse(){
        HttpHeaders headers=new HttpHeaders();
        headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
        HttpEntity<String> entity=new HttpEntity<String>(headers);
        return restTemplate.exchange("http://localhost:8080/postdata",HttpMethod.POST,entity,String.class).getBody();
    }

请参考本教程[1]

[1] https://www.tutorialspoint.com/spring_boot/spring_boot_rest_template.htm


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.