Comment générer Java Client proxy pour un service RESTful implémenté avec Spring?

nous utilisons Spring pour implémenter REST controller, par exemple:

@Controller
@RequestMapping("/myservice") 
public class MyController {
    @RequestMapping(value = "foo", method = RequestMethod.GET)
    public @ResponseBody string foo() {...}
}

je peux appeler ce service en utilisant spring RestTemplate, et il fonctionne très bien, mais je préférerais l'invoquer en utilisant un proxy, au lieu d'une invocation sans type en utilisant l'url de la chaîne:

// client code:
MyController proxy = getProxy("baseUrl", MyController.class);
String results = proxy.foo();

ainsi l'entrée à la génération de proxy est l'interface java avec des annotations décrivant les détails du reste. J'ai lu cet article et il semble que tous les types d'appels à distance ont des mandataires, et tout ce dont j'ai besoin pour Le repos est quelque chose comme RestProxyFactoryBean, qui prendrait mon interface java REST et retournerait le type-safe proxy qui utilise RestTemplate comme implémentation.

la solution la plus proche que j'ai trouvée est JBoss RESTEasy.

Mais il semble qu'il utilise différentes ensemble d'annotations, donc je ne suis pas sûr que cela fonctionne avec des annotations j'ai déjà: @Controller,@RequestMapping. Y a-t-il d'autres options ou RESTEasy est le seul? Remarque, je suis nouvelle au printemps donc certaines choses évidentes au printemps sont assez nouvelles pour moi.

je vous Remercie.

Dima

13
demandé sur Sergey Brunov 2013-05-13 01:23:41

4 réponses

Vous pouvez essayer Feindre par Netflix,un client REST Léger basé sur un proxy. Il fonctionne de manière déclarative à travers des annotations, et il est utilisé par Spring Cloud projects pour interagir avec Netflix Eureka.

3
répondu pcan 2016-02-18 17:58:16

une des raisons pour lesquelles le paradigme REST a été inventé est que l'expérience avec d'autres technologies remoting (RMI, CORBA, SOAP) nous montre que souvent, l'approche par procuration crée plus de problèmes qu'elle n'en résout.

théoriquement, un proxy rend le fait qu'un appel de fonction est transparent à distance pour ses utilisateurs, de sorte qu'ils peuvent utiliser la fonction exactement de la même manière que si c'était un appel de fonction local.

dans la pratique cependant cette promesse ne peut pas être remplie, parce que les appels de fonctions distantes ont simplement d'autres propriétés que les appels locaux. Pannes de réseau, congestion, temps morts, problèmes de charge, pour n'en nommer que quelques-uns. Si vous choisissez d'Ignorer toutes ces choses qui peuvent mal tourner avec les appels à distance, votre code ne sera probablement pas très stable.

TL; DR: vous ne devriez probablement pas travailler avec un mandataire, ce n'est plus l'état de l'art. Suffit d'utiliser RestTemplate.

1
répondu Bastian Voigt 2014-11-27 15:06:25

voici un projet qui essaie de générer des proxies d'exécution à partir des annotations du contrôleur (en utilisant RestTemplate en arrière-plan pour gérer les appels proxy): printemps-repos-proxy-client mais très tôt dans la mise en oeuvre.

1
répondu NagyI 2015-11-25 12:25:42

Cela semble le faire: https://swagger.io/swagger-codegen/, et swagger a beaucoup d'autres belles choses pour l'API REST.

1
répondu Dima 2017-10-25 22:05:46