【问题标题】:Apache HttpClient GET with body带有正文的 Apache HttpClient GET
【发布时间】:2012-09-14 03:23:09
【问题描述】:

我正在尝试发送带有 json 对象的 HTTP GET。有没有办法设置HttpClientHttpGet 的主体?我正在寻找 HttpPost#setEntity 的等价物。

【问题讨论】:

  • Nikita - 我的问题与您发布的问题相似,但是我特别询问如何通过 Apache HttpClient API 来解决。不过谢谢。
  • 官方的答案是不可能的。根据规范,GET 请求不能包含正文。您需要使用 POST 请求。
  • 请注意,在您链接到它的问题中,表明 GET 可能有正文。规范允许这样做。我的问题很简单,这是否可以通过 Apache 的 HttpClient 实现。
  • 是的,你是对的,它没有被规范禁止。但我会说这是不可能的。

标签: java apache-httpclient-4.x


【解决方案1】:

据我所知,您无法使用 Apache 库附带的默认 HttpGet 类来执行此操作。但是,您可以继承 HttpEntityEnclosureRequestBase 实体并将方法设置为 GET。我没有对此进行测试,但我认为以下示例可能是您正在寻找的:

import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;

public class HttpGetWithEntity extends HttpEntityEnclosingRequestBase {
    public final static String METHOD_NAME = "GET";

    @Override
    public String getMethod() {
        return METHOD_NAME;
    }
}

编辑:

然后您可以执行以下操作:

...
HttpGetWithEntity e = new HttpGetWithEntity();
...
e.setEntity(yourEntity);
...
response = httpclient.execute(e);

【讨论】:

  • 似乎有效,这实际上是迄今为止我发现使用任何 java 库的 get 请求发送正文的唯一方法!
  • +1; @ScottSwank 请接受答案,因为它似乎确实有效
【解决方案2】:

使用 torbinsky 的回答,我创建了上述课程。这让我可以对 HttpPost 使用相同的方法。

import java.net.URI;

import org.apache.http.client.methods.HttpPost;

public class HttpGetWithEntity extends HttpPost {

    public final static String METHOD_NAME = "GET";

    public HttpGetWithEntity(URI url) {
        super(url);
    }

    public HttpGetWithEntity(String url) {
        super(url);
    }

    @Override
    public String getMethod() {
        return METHOD_NAME;
    }
}

【讨论】:

  • 我用我需要在我的项目上与之交谈的 Web 服务尝试了上面的代码,但没有成功。我刚刚在服务守护进程日志中收到“内部应用程序错误,正在关闭连接。”。 Jersey 提供了一个带有实体的 HttpGet(称为不同的名称),但遗憾的是 apache 没有。这个特定的 Web 服务确实需要 GET 请求而不是 POST。
【解决方案3】:

我们如何在这个例子中发送请求 uri 就像 HttpGet & HttpPost ???

 public class HttpGetWithEntity extends HttpEntityEnclosingRequestBase
 {
    public final static String METHOD_NAME = "GET";
    @Override
     public String getMethod() {
         return METHOD_NAME;
     } 

        HttpGetWithEntity e = new HttpGetWithEntity(); 
        e.setEntity(yourEntity); 
        response = httpclient.execute(e); 
}

【讨论】:

    【解决方案4】:

    除了torbinsky的回答,可以把这些构造函数加到类中,方便设置uri:

    public HttpGetWithEntity(String uri) throws URISyntaxException{
        this.setURI(new URI(uri));
    }
    
    public HttpGetWithEntity(URI uri){
        this.setURI(uri);
    }
    

    setURI方法继承自HttpEntityEnclosingRequestBase,也可以在构造函数之外使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多