Java Postmetod con XML
-
27-10-2019 - |
Pregunta
Estoy tratando de publicar datos XML como cuerpo para una API REST.
Tengo un método que crea la solicitud llamada Dorest.
String url = null;
HttpMethod method;
LOG.info("QUERY: " + query);
if (StringUtil.isEmpty(query)) {
url = BuildRequestURL("/issues.ashx/issues/mywork");
method = doREST(url, false);
} else {
url = BuildRequestURL("/issues.ashx/issues/filters");
//method = doREST(url, true);
method = doREST(url, true);
String xml = "<IssuesFilterEN>" +
"<IssueID>" + query + "</IssueID>" +
"</IssuesFilterEN>";
RequestEntity entity = new StringRequestEntity(xml,"text/xml; charset=iso-8859-1", null);
method.setRequestEntity(entity);
}
y el método dorest
private HttpMethod doREST(String request, boolean post) throws Exception {
String uri = request;
HttpMethod method = post ? new PostMethod(uri) : new GetMethod(uri);
configureHttpMethod(method);
HttpClient client = getHttpClient();
client.getParams().setParameter(HttpClientParams.SO_TIMEOUT, timeoutLength);
client.executeMethod(method);
return method;
}
Mi problema es el método. LaRequestentidad es decir que el método no se puede encontrar.
tengo
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.methods.*;
Si configuro método = postmetod en lugar de método = dorest funciona, pero no quiero tener que hacerlo en todos mis otros métodos solo para crear consultas.
¿Hay algo que me falta sobre por qué el método.setRequestity no funciona como es ahora?
Editar: obtuve mi información para usar setRequestentity de Postmethod setRequestBody (cadena) Deprecido - ¿Por qué?
Editar 2: Esto es lo que terminé haciendo.
private HttpMethod doREST(String request, RequestEntity entity) throws Exception {
String uri = request;
HttpMethod method;
if ( entity != null ){
method = new PostMethod(uri);
((PostMethod) method).setRequestEntity(entity);
} else {
method = new GetMethod(uri);
}
configureHttpMethod(method);
HttpClient client = getHttpClient();
client.getParams().setParameter(HttpClientParams.SO_TIMEOUT, timeoutLength);
client.executeMethod(method);
return method;
}
Solución
Deberías modificar doREST
para aceptar el RequestEntity
en lugar de un boolean
. Aconteció en null
para obtener y un valor para la publicación. Úselo como cheque para ver si necesita un PostMethod
o GetMethod
. Entonces puede tener el tipo específico para que pueda llamar al PostMethod
solamente setRequestEntity()
.
EDITAR:
Puedes evitar el elenco así:
private HttpMethod doREST(String request, RequestEntity entity) throws Exception {
String uri = request;
HttpMethod method;
if ( entity != null ){
PostMethod postMethod = new PostMethod(uri);
postMethod.setRequestEntity(entity);
method = postMethod;
} else {
method = new GetMethod(uri);
}
configureHttpMethod(method);
HttpClient client = getHttpClient();
client.getParams().setParameter(HttpClientParams.SO_TIMEOUT, timeoutLength);
client.executeMethod(method);
return method;
}
Otros consejos
El método al que debería llamar es setEntity
, no setRequestEntity
. Además, su cuerpo debe estar envuelto en un StringEntity
, No un StringRequestEntity
, importado de org.apache.http.entity
.