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

2voto

Madhu Tomy Points 3

Est-ce que Retrofit a une méthode pour y parvenir ? Si non, comment puis-je le faire ?

OUI

Retrofit est un client REST à sécurité intrinsèque pour Android et Java. Retrofit transforme votre API HTTP en une interface Java.

Pour plus d'informations, consultez le lien suivant

https://howtodoinjava.com/retrofit2/retrofit2-beginner-tutorial

1voto

Jhonatan_Celis Points 1

Dans ce cas, j'ai besoin de télécharger les fichiers de mon API. hébergés dans d'autres serveur.

Dans mon cas, Il n'est pas nécessaire d'utiliser un client HTTP pour télécharger le fichier dans une URL externe. J'ai combiné plusieurs réponses et méthodes utilisées dans le code précédent pour les fichiers qui se trouvaient sur mon serveur local.

Mon code est :

@GetMapping(value = "/download/file/pdf/", produces = MediaType.APPLICATION_PDF_VALUE)
    public ResponseEntity<Resource> downloadFilePdf() throws IOException {
        String url = "http://www.orimi.com/pdf-test.pdf";

        RestTemplate restTemplate = new RestTemplate();
        byte[] byteContent = restTemplate.getForObject(url, String.class).getBytes(StandardCharsets.ISO_8859_1);
        InputStream resourceInputStream = new ByteArrayInputStream(byteContent);

        return ResponseEntity.ok()
                .header("Content-disposition", "attachment; filename=" + "pdf-with-my-API_pdf-test.pdf")
                .contentType(MediaType.parseMediaType("application/pdf;"))
                .contentLength(byteContent.length)
                .body(new InputStreamResource(resourceInputStream));
    }

et il fonctionne avec les urls HTTP et HTTPS !

1voto

4javier Points 149

Puisque la question mentionne explicitement spring-boot, il convient de noter que les versions récentes fournissent déjà une instance préconfigurée d'un constructeur pour WebClient, ce qui vous permet de l'injecter directement dans le constructeur de votre service sans avoir à définir un bean personnalisé.

@Service
public class ClientService {

    private final WebClient webClient;

    public ClientService(WebClient.Builder webClientBuilder) {
        webClient = webClientBuilder
                        .baseUrl("https://your.api.com")
    }

    //Add all the API call methods you need leveraging webClient instance

}

https://docs.spring.io/spring-boot/docs/2.0.x/reference/html/boot-features-webclient.html

0voto

Tomas Bjerre Points 1211

La méthode la plus simple que j'ai trouvée est la suivante :

  • Créer une interface annotée (ou la faire générer à partir d'un outil comme OpenAPI).
  • Donnez cette interface à Client Spring RestTemplate

El Client Spring RestTemplate analysera les annotations de l'interface et vous donnera un client sûr, un proxy-instance. Toute invocation des méthodes sera traduite de manière transparente en appels au repos.

final MyApiInterface myClient = SpringRestTemplateClientBuilder
  .create(MyApiInterface.class)
  .setUrl(this.getMockUrl())
  .setRestTemplate(restTemplate)         // Optional
  .setHeader("header-name", "the value") // Optional
  .setHeaders(HttpHeaders)               // Optional
  .build();

Et un appel au repos est fait en inokant des méthodes, comme :

final ResponseEntity<MyDTO> response = myClient.getMyDto();

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