123 votes

Appeler une autre api de repos de mon serveur dans Spring-Boot

Je veux appeler un autre web-api depuis mon backend sur une requête spécifique de l'utilisateur. Par exemple, je veux appeler Google FCM L'API d'envoi de messages permet d'envoyer un message à un utilisateur spécifique lors d'un événement.

Fait Rétrofit avez-vous une méthode pour y parvenir ? Si non, comment puis-je le faire ?

4 votes

Vous n'avez pas besoin d'une bibliothèque tierce. Spring dispose déjà de la RestTemplate

0 votes

Questions étiquetées [[resttemplate](https://stackoverflow.com/questions/tagged/resttemplate) ]

6 votes

RestTemplate sera déprécié dans une future version, utilisez l'alternative plus moderne WebClient

176voto

Torsten N. Points 576

Ce site Web contient quelques exemples intéressants pour l'utilisation de RestTemplate de Spring. Voici un exemple de code qui montre comment cela peut fonctionner pour obtenir un objet simple :

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);
}

1 votes

Objet résultat = restTemplate.getForObject(uri, Object .class) ; - pour être plus générique

0 votes

@Muhammad Faizan Uddin J'y ai pensé, mais il me semble que cela pourrait ne plus fonctionner si l'objet ne peut pas être sérialisé correctement pour une raison quelconque ; alors que l'approche par chaîne de caractères fonctionne toujours parce que JSON peut toujours être sérialisé en une chaîne de caractères.

21 votes

RestTemplate sera déprécié dans une future version, utilisez l'alternative plus moderne WebClient

63voto

anddero Points 531

Réponse moderne de Spring 5+ utilisant WebClient au lieu de RestTemplate .

Configurer WebClient pour un service web ou une ressource spécifique en tant que bean (des propriétés supplémentaires peuvent être configurées).

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

Injectez et utilisez le haricot de votre ou vos services.

@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);
    }

}

16voto

Nallamachu Points 607

Au lieu de String, vous essayez de obtenir les détails d'un objet POJO personnalisé en sortie en appelant une autre API/URI essayez la solution suivante. J'espère qu'elle sera claire et utile pour l'utiliser. RestTemplate également,

Sur Spring Boot nous devons d'abord créer un Bean pour RestTemplate en vertu de la @Configuration classe annotée. Vous pouvez même écrire une classe séparée et l'annoter avec @Configuration comme ci-dessous.

@Configuration
public class RestTemplateConfig {

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

Ensuite, vous devez définir RestTemplate con @Autowired o @Injecté sous votre service/contrôleur, où que vous essayiez d'utiliser RestTemplate. Utilisez le code ci-dessous,

@Autowired
private RestTemplate restTemplate;

Maintenant, nous allons voir comment appeler un autre api depuis mon application en utilisant le RestTemplate créé ci-dessus. Pour cela, nous pouvons utiliser plusieurs méthodes comme exécuter() , getForEntity() , getForObject() et ainsi de suite. Ici je place le code avec l'exemple de execute(). J'ai même essayé les deux autres, mais j'ai été confronté à un problème de conversion du LinkedHashMap retourné en objet POJO attendu. La méthode execute() ci-dessous a résolu mon problème.

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

Bon codage :)

0 votes

Ainsi, lorsque j'essaie d'utiliser presque exactement votre code, j'obtiens l'erreur "Cannot deserialise instance of [my pojo class] out of start object token". Savez-vous pourquoi ?

0 votes

Vérifiez que votre pojo implémente ou non l'interface Serializable. Sinon, implémentez-la et essayez.

0 votes

Malheureusement, cela n'a pas résolu le problème, mais je vous remercie quand même.

6voto

Senthuran Points 673

Créer un Bean pour Rest Template afin d'auto-câbler l'objet Rest Template.

@SpringBootApplication
public class ChatAppApplication {

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

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

}

Consommez l'API GET/POST en utilisant la méthode RestTemplate - exchange(). L'exemple ci-dessous concerne l'API post qui est définie dans le contrôleur.

@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();
    }

Consultez ce tutoriel[1]

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

5voto

Fred Points 284

Comme cela a été mentionné dans les différentes réponses ici, WebClient est maintenant la voie recommandée. Vous pouvez commencer par configurer un constructeur WebClient :

@Bean
public WebClient.Builder getWebClientBuilder(){
    return WebClient.builder();
}

Injectez ensuite le bean et vous pourrez consommer une API comme suit :

@Autowired
private WebClient.Builder webClientBuilder;

Product product = webClientBuilder.build()
            .get()
            .uri("http://localhost:8080/api/products")
            .retrieve()
            .bodyToMono(Product.class)
            .block();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X