J'essaie de consommer une API REST qui nécessite un corps avec une requête GET. Mais comme un GET n'a généralement pas de corps, je ne trouve pas de moyen de joindre un corps à ma demande. Je construis également l'API REST, mais le professeur ne nous permettra pas de changer la méthode en POST (il nous a donné une liste des points de terminaison que nous devons créer, ni plus, ni moins).
J'essaye de le faire comme ceci:
Response r = target.request().method(method, Entity.text(body));
Où j'ai mis le method
to GET
et le body
to my get body
. Cependant, en utilisant cette approche, j'obtiens une exception:
javax.ws.rs.ProcessingException: RESTEASY004565: A GET request cannot have a body.
Existe-t-il un moyen de faire cela avec JAX-RS? Nous avons appris à utiliser JAX-RS donc je préférerais une solution utilisant ceci, car je ne suis pas sûr que mon professeur nous autoriserait à utiliser n'importe quel autre client REST. J'utilise actuellement RESTEasy, fourni par le serveur WildFly.
(Ce n'est pas un doublon de HTTP GET avec le corps de la requête car je demande comment créer une requête GET avec un corps dans JAX-RS, pas si cela doit être fait.)
Cela dépend de votre implémentation JAX-RS. Cette vérification peut être désactivée dans Jersey 2.25 en utilisant la SUPPRESS_HTTP_COMPLIANCE_VALIDATION
propriété:
ClientConfig config = new ClientConfig();
config.property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true);
JerseyClient client = JerseyClientBuilder.createClient(config);
WebTarget target = client.target(URI.create("https://www.stackoverflow.com"));
Response response = target.request().method("GET", Entity.text("BODY HERE"));
Au lieu d'exception, vous obtiendrez un journal INFO
INFO: Detected non-empty entity on a HTTP GET request. The underlying HTTP transport connector may decide to change the request method to POST.
Cependant, dans RESTEasy 3.5.0.Final, il existe un enregistrement codé en dur à la fois URLConnectionEngine
et ApacheHttpClient4Engine
:
if (request.getEntity() != null)
{
if (request.getMethod().equals("GET")) throw new ProcessingException(Messages.MESSAGES.getRequestCannotHaveBody());
Vous devrez créer votre propre implémentation de ClientHttpEngine
pour ignorer cela. Ensuite, vous devez le fournir lors de la construction du client:
ClientHttpEngine engine = new MyEngine();
ResteasyClient client = new ResteasyClientBuilder().httpEngine(engine).build();
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots