Domanda

Sto cercando di dati post XML come un corpo ad un'API REST.

Ho un metodo che crea la richiesta di chiamata 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);
    }

e il metodo 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;
    }

Il mio problema è il method.setRequestEntity sta dicendo che il metodo non è stato trovato.

ho

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.methods.*;

Se i metodo set = PostMethod invece di method = Dorest funziona, ma io non voglio avere a che fare in tutti i miei altri metodi solo per creare query.

C'è qualcosa che mi manca sul motivo per cui il method.setRequestEntity non funziona il modo in cui è adesso?

EDIT: Ho ottenuto il mio informazioni per l'utilizzo di setRequestEntity da PostMethod setRequestBody (String) deprecato - perché

EDIT 2: Ecco quello che ho finito per fare.

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;
    }
È stato utile?

Soluzione

Si dovrebbero modificare doREST ad accettare la RequestEntity invece di un boolean. Passare in null per un GET e un valore per POST. Utilizzare che come il controllo per vedere se avete bisogno di un PostMethod o un GetMethod. Allora si può avere il tipo specifico in modo da poter chiamare il PostMethod solo setRequestEntity().

EDIT:

È possibile evitare il cast in questo modo:

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;
}

Altri suggerimenti

Il metodo si dovrebbe essere chiamato è setEntity , non setRequestEntity. Inoltre, il tuo corpo deve essere avvolto in un StringEntity , non un StringRequestEntity, importato da org.apache.http.entity.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top