【问题标题】:Java 8 HttpClient 4.5 HttpGet and HttpPost in one functionJava 8 HttpClient 4.5 HttpGet 和 HttpPost 合二为一
【发布时间】:2017-02-15 16:25:53
【问题描述】:

我正在编写将与 HttpGet 和 HttpPost 一起使用的函数。 是这样的:

private void initialize(HttpRequestBase method)
{
    if(method == new HttpPost())
    {
    String body = "body";
        HttpEntity entity = new ByteArrayEntity(body.getBytes("UTF-8"));
        method.setEntity(entity);
}

问题是 HttpRequestBase 不支持 .setEntity。如何编写支持 HttpGet 和 HttpPost 的函数而不会出现这样的问题?

【问题讨论】:

  • 您知道您的if 条件将永远为真,不是吗?与新对象相比,任何现有对象引用都将返回 false
  • 哦,你是对的。有什么办法吗?
  • if(method instanceof HttpPost)
  • 当然,使用instanceof。然后你也可以投。但这是非常基本的Java。也许你应该review Inheritance
  • 谢谢回复,我试试

标签: java java-8 httpclient apache-httpclient-4.x


【解决方案1】:

解决此问题的方法是使用instanceof 检查类型并使用强制转换。像这样:

private void initialize(HttpRequestBase method)
{
    if(method instanceof HttpPost)
    {
        String body = "body";
        HttpEntity entity = new ByteArrayEntity(body.getBytes("UTF-8"));
        ((HttpPost) method).setEntity(entity);
    }
}

但是,每当您使用演员表时,您都应该考虑可能有更优雅的解决方案。在这种情况下,我认为更优雅的解决方案是使用方法重载并为HttpPost 实例提供特定方法。

private void initialize(HttpPost method)
{
    String body = "body";
    HttpEntity entity = new ByteArrayEntity(body.getBytes("UTF-8"));
    method.setEntity(entity);
}

当然,这意味着您需要为HttpGet(以及您希望支持的HttpRequestBase 的任何其他子类)提供一个单独的方法。 GETPOST 之间共享的任何公共代码都应该被提取到更小的方法中,这些方法可以被initialize() 方法调用。

private void initialize(HttpGet method)
{
    // ...
}

当然,您可能会争辩说这违背了为GETPOST 创建一个处理程序的全部意义。你是对的。但是您应该质疑尝试创建一种方法来处理这两种方法的整个练习。也许最优雅的设计就是将它们分开处理。毕竟,这正是您使用的框架的作者选择做的事情。

【讨论】:

  • 创建两个独立的方法——这是我想避免的,因为这些方法中 90% 的代码都是相同的
  • 将常用功能封装在两个初始化器都调用的较小方法中。
  • @SamuelTeixeira 好主意。完成。
猜你喜欢
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 2014-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多