【问题标题】:Java: Multiple HTTP Requests from Same HTTPClient?Java:来自同一个 HTTPClient 的多个 HTTP 请求?
【发布时间】:2015-01-31 08:23:33
【问题描述】:
目前,在我的代码中,我有一个类 SocketOperator,它在由静态 http 客户端支持的单例模式上运行。这意味着每当我在多个地方同时调用 SocketOperator.getInstance().makeGetRequest() 时,请求可能会混淆(例如:A 调用方法,B 调用方法,B 得到 A 的结果)。
我的解决方案是什么?具体来说,如何修改 HTTPClient 以便当我从不同来源发出多个请求时,每个来源都能得到适当的响应?
【问题讨论】:
标签:
java
android
apache
request
httpclient
【解决方案1】:
您似乎不正确地使用了单例模式,或者试图将其应用于非线程安全的 API。
您将无法为不同的客户端使用相同的流对象,除非您使用回调方法或自己管理线程。您应该只使用 Singleton 来保存整个程序共有的数据,确保程序中任何时候都只存在一个类的实例。
简单化:使用 Singleton 存储通用数据并为每个客户端使用不同的流实例。
我做了一个简单(但实用)的示例,演示了如何正确使用单例模式来解决连接问题。 Singleton 仅用于保持整个系统共用的缓存信息。在本例中为 URL,但您可以添加安全性和其他优化。
public class SocketOperator {
private final static SocketOperator SOCKET_OPERATOR = new SocketOperator();
private String url;
private SocketOperator() {
// Caches URL, authentication, etc... Usually loaded from database or properties file.
url = "http://www.thomas-bayer.com/sqlrest/CUSTOMER/";
}
public static SocketOperator getInstance() {
return SOCKET_OPERATOR;
}
public String makeGetRequest() throws Exception {
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
return response.toString();
}
}
【解决方案2】:
我猜您遇到了麻烦,因为您对两者都使用了相同的侦听器,或者您无法记住请求是来自 A 还是 B。
因此,当您触发请求时,您可能希望提供一个被通知的回调,并使用包含有关请求的一些元信息(如 URL、状态代码、...
除此之外,您应该开始考虑使用HttpURLConnection 而不是默认的HttpClient。原因是从 Gingerbread 开始,前一种解决方案将获得更新,而且它肯定更加灵活。
如果您不想自己花时间做所有事情,还有其他替代方案,例如 Square、Volley 的 Retrofit,...