J'utilise le cadre client restrict pour appeler un service Web reposant. L'appel est effectué via un post et envoie des données XML sur le serveur. Comment puis-je accomplir cela? P>
Quelle est l'incantation magique des annotations à utiliser pour que cela se produise? P>
5 Réponses :
J'ai emprunté à cet exemple: Construire un service de repos Avec ReSeasey le fragment de code suivant, qui semble faire exactement ce que vous voulez, non?
URL url = new URL("http://localhost:8081/user"); HttpURLConnection connection = (HttpURLConnection)url.openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "application/xml"); connection.setDoOutput(true); connection.setInstanceFollowRedirects(false); StringBuffer sbuffer = new StringBuffer(); sbuffer.append("<user id=\"0\">"); sbuffer.append(" <username>Test User</username>"); sbuffer.append(" <email>test.user@test.com</email>"); sbuffer.append("</user>"); OutputStream os = connection.getOutputStream(); os.write(sbuffer.toString().getBytes()); os.flush(); assertEquals(HttpURLConnection.HTTP_CREATED, connection.getResponseCode()); connection.disconnect();
Je pense que David fait référence au «cadre client» restant. Par conséquent, votre réponse (Riduidel) n'est pas particulièrement ce qu'il cherche. Votre solution utilise httpurlconnection comme client HTTP. L'utilisation du client restant à la place de httpurlconnection ou de défaulttpclient est bénéfique car le client restant est conscient de JAX-RS. Pour utiliser le client restrict, vous construisez des objets org.jboss.resseasy.client.ClientReQuest et accumulez des demandes à l'aide de ses constructeurs et méthodes. Vous trouverez ci-dessous comment mettre en œuvre la question de David à l'aide du cadre client de Reseasey. J'espère que cela aide,
Charlie p> p>
Cela aide effectivement. La solution que j'ai trouvée était encore plus simple. Le cadre vous permet de créer une interface Java définissant les méthodes de repos que vous allez appeler. Vous pouvez placer un @produces ("Application / XML") devant la méthode, puis transmettre des objets avec des annotations JAXB appropriées et que tout fonctionne comme par magie.
Absolument! Cette façon de rendre les appels utilise des proxies de clients restrict. Vous pouvez appeler cela un autre type de «cadre client» pour effectuer des services reposants. Je préfère même cette méthode car elle vous permet de réutiliser l'interface de service du serveur également sur le client et donc d'avoir une API auto-documentée et unifiée plus facile.
Il est aussi facile que suivant
@Test public void testPost() throws Exception { final ClientRequest clientCreateRequest = new ClientRequest("http://localhost:9090/variables"); final MultivaluedMap<String, String> formParameters = clientCreateRequest.getFormParameters(); final String name = "postVariable"; formParameters.putSingle("name", name); formParameters.putSingle("type", "String"); formParameters.putSingle("units", "units"); formParameters.putSingle("description", "description"); formParameters.putSingle("core", "true"); final ClientResponse<String> clientCreateResponse = clientCreateRequest.post(String.class); assertEquals(201, clientCreateResponse.getStatus()); }
J'ai eu des difficultés à comprendre comment faire cela donc je pensais que je le posterais ici. L'utilisation du mécanisme de client de proxy resease est réellement embarrassante facile.
Comme Charles Akalugwu le suggère, cette approche vous permet de créer une seule interface Java que vous pouvez utiliser sur le côté du client et du serveur, et vous donnera lieu à la fois client et serveur. Code secondaire évident et facile à utiliser. P>
Tout d'abord, déclarez une interface Java pour le service. Ceci sera utilisé à la fois sur le côté client et le serveur, et doit contenir toutes les déclarations JAX-RS: P>
InputStream inputStream = new FileInputStream("/tmp/myfile"); uploadService.uploadFile(inputStream);
Essayez cette syntaxe:
Form form = new Form(); form .param(HttpHeaders.AUTHORIZATION, "Bearer " + token) .param("client_id", "Test_Client") .param("grant_type", "password") .param("response_type", "code") .param("scope", "openid") .param("redirect_uri", "some_redirect_url"); Entity<Form> entity = Entity.form(form); ResteasyClient client = new ResteasyClientBuilder().build(); ResteasyWebTarget target = client.target("http://localhost:8080/auth/realms"); Response response = target .request(MediaType.APPLICATION_JSON) .post(entity); System.out.println("HTTP code: " + response.getStatus());
@David Escandell, voudriez-vous s'il vous plaît poster l'exemple entier ici. Je suis capable de poster les données à l'aide de XML mais je n'ai pas capable de sérialiser l'objet correctement. J'espère que votre exemple peut m'aider beaucoup.
J'aime la "incantation magique des annotations" de la question ... C'est l'une des grandes parties de ce nouveau phénomène d'ingénierie!