2

我正在尝试将 XML 数据作为正文发布到 REST api。

我有一个创建名为 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.*;

如果我设置 method = PostMethod 而不是 method = doREST 它可以工作,但我不想在我的所有其他方法中这样做只是为了创建查询。

关于为什么 method.setRequestEntity 不能按照现在的方式工作,我有什么遗漏吗?

编辑:我从PostMethod setRequestBody(String) deprecated 中获得了使用 setRequestEntity 的信息 - 为什么?

编辑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;
    }
4

2 回答 2

3

您应该修改doREST以接受RequestEntity而不是boolean. 传入nullGET 和 POST 值。使用它来检查您是否需要 aPostMethodGetMethod. 然后你可以拥有特定的类型,这样你就可以调用PostMethod唯一的setRequestEntity().

编辑:

你可以避免这样的演员:

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;
}
于 2011-04-29T16:56:10.510 回答
1

您应该调用的方法是setEntity,不是setRequestEntity。此外,你的身体应该被包裹在一个StringEntity,而不是一个StringRequestEntity,从org.apache.http.entity.

于 2011-04-29T16:55:28.713 回答