Java 8 HttpClient 4.5 HttpGet 和 HttpPost 在一个函数中

Java 8 HttpClient 4.5 HttpGet and HttpPost in one function

我正在编写将与 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 的函数而不会出现这样的问题?

解决此问题的方法是使用 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 创建一个处理程序的全部意义都落空了。你是对的。但是您应该质疑尝试创建一种方法来处理这两种情况的整个过程。也许最优雅的设计是将它们分开对待。毕竟,这正是您所使用的框架的作者选择要做的事情。