Java PostMethod с xml - PullRequest
       11

Java PostMethod с xml

2 голосов
/ 29 апреля 2011

Я пытаюсь отправить данные XML в виде тела в API REST.

У меня есть метод, который создает запрос с именем 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);
    }

и метод 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;
    }

Моя проблема заключается в том, что method.setRequestEntity говорит, что метод не может быть найден.

У меня есть

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

Если я установил метод = PostMethod вместо метода= doREST это работает, но я не хочу делать это во всех других моих методах только для создания запросов.

Есть ли что-то, чего мне не хватает в отношении того, почему method.setRequestEntity не работает так, как онпрямо сейчас?

РЕДАКТИРОВАТЬ: я получил информацию об использовании setRequestEntity от PostMethod setRequestBody (String) устарел - почему?

РЕДАКТИРОВАТЬ 2: Вот что я закончилделать.

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

Ответы [ 2 ]

3 голосов
/ 29 апреля 2011

Вы должны изменить doREST, чтобы принять RequestEntity вместо boolean. Передайте null для GET и значение для POST. Используйте это как проверку, чтобы видеть, требуется ли вам PostMethod или GetMethod. Тогда у вас может быть определенный тип, чтобы вы могли вызывать только PostMethod setRequestEntity().

EDIT:

Вы можете избежать броска следующим образом:

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;
}
1 голос
/ 29 апреля 2011

Вы должны вызывать метод setEntity, а не setRequestEntity.Кроме того, ваше тело должно быть обернуто в StringEntity, а не StringRequestEntity, импортированное из org.apache.http.entity.

...