【问题标题】:How can I extend HttpURLConnection to support other methods?如何扩展 HttpURLConnection 以支持其他方法?
【发布时间】:2017-03-13 19:56:39
【问题描述】:

我想在 http 之上构建一个协议(如 WebDAV)。因此使用 HttpURLConnection 是有意义的,因为它包含所有基本方法、响应代码等。不幸的是,它阻止了设置其他方法,例如:

HttpURLConnection con = URL.openConnection( "http://abc.def/someServlet" );
con.setRequestMethod( "MyMethod" );

抛出 ProtocolException 无效方法 MyMethod。

所以我扩展了它并覆盖了“setRequestMethod(String)”以接受“MyMethod”。这不起作用,因为 URL 只返回一个 HttpURLConnection。有没有办法使用HttpURLConnection来接受其他方法?

【问题讨论】:

标签: java http url


【解决方案1】:

请不要,我告诉你这是因为我在开始用 java 编程时犯了同样的错误,但没有得到回报。

问自己这个问题,你是否会将子类传递给接受父类的函数/方法/构造函数?

例如,您是否会将 HttpURLConnection 和 MyServiceURLConnection 混合放入一个集合中。

如果不是这样,你最好使用一个全新的类,它使用 HttpURLConnection 来提供低级操作。

【讨论】:

  • 好点。但是,如果不重写 java.net.URL 或至少为整个 JVM 应用程序提供修改后的 http-handler,我怎么能做到这一点呢?
  • 如果您需要帮助,您应该提供一些框架代码。如果您有兴趣创建新协议,请阅读此答案:stackoverflow.com/questions/26363573/…
  • 骨架代码是我的问题。我不想创建新协议。我只需要在 http 请求中添加额外的方法。
【解决方案2】:

您可能希望考虑 RESTful 接口。你还在用http werbs但是你已经升级了,看不到它,可以做任何接口,使用工厂,比如:

public String readFileAsString(String url) {
    String result = null;
    try {
        Client client = Client.create();
        WebResource webResource = client.resource(url);
        ClientResponse response = webResource.type("text/plain").get(ClientResponse.class);
        result= response.getEntity(String.class);
        response.close();
    } catch (Exception e) {
        e.printStackTrace();
        result = "";
    }

    return result;
}

【讨论】:

  • 这有什么帮助?
  • 你去升级,更简单的应用程序编程,可以使用工厂,做任何服务,事实上,没有http的麻烦... Jersey 示例: public String readFileAsString(String url) { String result = null;尝试 { 客户端客户端 = Client.create(); WebResource webResource = client.resource(url); ClientResponse response = webResource.type("text/plain").get(ClientResponse.class);结果= response.getEntity(String.class); response.close(); } 捕捉(异常 e){ e.printStackTrace();结果 = ""; } 返回结果; }
  • 我不明白这如何解决我的问题。我必须执行一些 get 或 post 未涵盖的复杂操作。那么如何在不重写完整 URL 类的情况下使用其他方法扩展 HttpURLConnection 呢?
  • 不知道协议很难说。也许这对你不利。 REST 和 WebSockets 可以满足我的所有协议要求,但它们很可能很简单。我们甚至可以在 Java、C++ 和 JavaScript 的任意组合之间获得整洁的实时性,尽管我是一名应用程序程序员,并不精通较低级别。
  • 我们确实有很多旧的 HttpURLConnection 代码,并且时不时出现一个奇怪的问题。当我们放弃 HttpURLConnection 时,所有这些都消失了,我现在不记得它们是什么了。
【解决方案3】:

url 不返回 HTTPURLConnection ,它返回 URLConnection 因为你没有转换它 所以你不能覆盖 HTTPURlConnection 方法 setRequestMethod()

【讨论】:

  • 因为他没有扩展 HTTPURLConnection 所以他不能覆盖 setRequestMethod(String) ,这个通知是有意义的@UmarZaii
  • 那么公平。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
  • 2011-02-24
  • 2013-07-03
  • 1970-01-01
相关资源
最近更新 更多