【问题标题】:Java URL Without Protocol没有协议的 Java URL
【发布时间】:2014-05-09 13:16:16
【问题描述】:

我正在尝试打开一个 InputStream 到服务的 API 给出的某个 URL。但是,它没有设置协议(它不是 http 或 https)并且没有协议,我收到以下错误。

有没有什么方法可以在没有协议的情况下获取请求?

例外:

线程“主”java.net.MalformedURLException 中的异常:无协议。

代码:

    String url = "maple.fm/api/2/search?server=1";
    InputStream is = new URL(url).openStream();

更新:我现在将代码更新为:

代码:

    String url = "http://maple.fm/api/2/search?server=1";
    InputStream is = new URL(url).openStream();

现在我收到以下错误:

例外:

线程“main”java.io.IOException 中的异常:服务器返回 HTTP 响应代码:403 用于 URL:http://maple.fm/api/2/search?server=1

【问题讨论】:

    标签: java url inputstream


    【解决方案1】:

    当你说it does not have a set protocol 时,我有点怀疑这意味着什么。如果它可以使用多种协议,我希望 API 文档中提到一些确定协议应该是什么的方法。

    我点击了 URL http://maple.fm/api/2/search?server=1,它只是返回 JSON 而不是 http。我认为你的实际问题是你试图打开一个InputStream 来与一个网络服务器交谈。我相信您的问题的解决方案,即尝试处理JSON 而不是http,可以找到here

    我决定深入研究这个,因为我很好奇。结合this answerthis answer,我们有以下代码,它将从您的URL 打印出JSON 输出。当然,你仍然需要一个 JSON 库来解析它,但这是一个单独的问题。

    import java.net.*;
    import java.io.*;
    
    public class Main{ 
     public static String getHTML(String urlToRead) {
          URL url;
          HttpURLConnection conn;
          BufferedReader rd;
          String line;
          String result = "";
          try {
             url = new URL(urlToRead);
             conn = (HttpURLConnection) url.openConnection();
             conn.setRequestMethod("GET");
             conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11");
             rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
             while ((line = rd.readLine()) != null) {
                result += line;
             }
             rd.close();
          } catch (IOException e) {
             e.printStackTrace();
          } catch (Exception e) {
             e.printStackTrace();
          }
          return result;
       }
    public static void main(String[] args) {
        String url = "http://maple.fm/api/2/search?server=1";
        System.out.println(getHTML(url));
    }
    }
    

    【讨论】:

    • javadoc(在这里找到:link)非常模糊。我尝试了不同的协议,但都没有奏效。
    • 它是某种原始套接字协议吗?如果您正在创建InputStream,那么也许您实际上只是想创建一个套接字并直接通过TCP 与它交谈?
    • 有没有办法找出它是什么类型的协议?还有我将如何通过 TCP 打开 InputStream?
    • 当我从浏览器点击你的 URL 时,我得到了输出:{"fm_items":[],"seconds_ago":null}。那是期望的输出吗?如果是这样,我觉得它就像http
    • 对不起,我在 URL 中使用了错误的参数,正确的链接在这里 maple.fm/api/2/search?server=1。
    【解决方案2】:

    你需要用 try/catch 块包围它

    try {
        String url = "maple.fm/api/2/search?world=1";
        InputStream is = new URL(url).openStream();
    catch(MalformedURLException e) {
        e.printStackTrace();
    

    【讨论】:

    • 我已经在方法中抛出了异常,所以这不应该是这里的问题。
    【解决方案3】:

    没有协议的 URL 不是有效的 URL。它实际上是一个相对 URI,只有当你有一个绝对 URI(或等效的)来提供解析它的上下文时,你才能使用相对 URI。

    有没有什么方法可以在没有协议的情况下 [发出] 请求?

    基本上......不。协议告诉客户端库如何执行请求。如果没有协议,图书馆将不知道该怎么做。

    “没有协议的 url”在 Web 浏览器的 URL 栏中起作用的原因是浏览器很有帮助,并用“http:”填充缺少的协议 ... 假设这是什么用户可能意味着。 (加上一大堆其他东西,比如添加“www.”、添加“.com”、转义空格和其他非法字符……或者尝试搜索而不是普通的 HTTP GET 请求。)

    现在您可以在将 URL 字符串传递给 URL 类之前尝试在代码中执行相同的操作。但是 IMO,如果您正在编写代码以与服务通信,那么正确的解决方案就是修复 URL。把正确的协议放在前面...


    你现在得到的403 错误意味着禁止。服务器说“你不能这样做”。

    查看您尝试使用的服务的文档。 (也许您需要通过某种登录程序。也许您正在尝试做的事情只允许某些用户使用,或者其他什么。)

    尝试this page 上的示例 URL ... 顺便说一句,它可以在我的网络浏览器中使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 2016-01-15
      • 2012-08-13
      • 1970-01-01
      • 2019-06-12
      • 1970-01-01
      相关资源
      最近更新 更多