【问题标题】: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,...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-11
        • 2021-05-24
        • 2012-07-28
        • 2017-07-04
        • 1970-01-01
        相关资源
        最近更新 更多