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;
    }
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top