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
的任何其他子类)提供一个单独的方法。 GET
和 POST
之间共享的任何公共代码都应提取到更小的方法中,这些方法由 initialize()
方法调用。
private void initialize(HttpGet method)
{
// ...
}
当然,您可能会争辩说,尝试为 GET
和 POST
创建一个处理程序的全部意义都落空了。你是对的。但是您应该质疑尝试创建一种方法来处理这两种情况的整个过程。也许最优雅的设计是将它们分开对待。毕竟,这正是您所使用的框架的作者选择要做的事情。
我正在编写将与 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
的任何其他子类)提供一个单独的方法。 GET
和 POST
之间共享的任何公共代码都应提取到更小的方法中,这些方法由 initialize()
方法调用。
private void initialize(HttpGet method)
{
// ...
}
当然,您可能会争辩说,尝试为 GET
和 POST
创建一个处理程序的全部意义都落空了。你是对的。但是您应该质疑尝试创建一种方法来处理这两种情况的整个过程。也许最优雅的设计是将它们分开对待。毕竟,这正是您所使用的框架的作者选择要做的事情。