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

时间:2017-02-15 16:25:53

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

我正在编写将与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的函数没有这样的问题?

1 个答案:

答案 0 :(得分:2)

解决此问题的方法是使用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创建一个处理程序的全部意义。你会是对的。但是你应该质疑尝试创建一个处理两者的方法的整个练习。也许最优雅的设计是分开处理它们。毕竟,这正是您使用的框架的作者选择做的。