没有协议的Java URL

时间:2014-03-30 05:23:20

标签: java url inputstream

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

有没有办法在没有协议的情况下获得请求?

例外:

  

线程中的异常" main" 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

3 个答案:

答案 0 :(得分:2)

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

我点击了网址http://maple.fm/api/2/search?server=1,只是将JSON返回http。我认为您的实际问题是您正在尝试打开InputStream与Web服务器通信。我相信,您可以找到问题的解决方案,即尝试处理JSON http JSON here

我决定深入研究这个因为我很好奇。结合this answerthis answer,我们提供了以下代码,用于打印您网址的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)); } } 输出。当然,你仍然需要一个JSON库来解析它,但这是一个单独的问题。

{{1}}

答案 1 :(得分:2)

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

  

有没有办法在没有协议的情况下[制作]请求?

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

"没有协议的网站"在网络浏览器的URL栏中工作的是浏览器有用,并用" http:"填写缺少的协议。 ...... 假设用户可能意味着。 (加上一大堆其他东西,比如添加" www。",添加" .com",转义空格和其他非法字符,......或尝试搜索而不是搜索正常的HTTP GET请求。)

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


您现在获得的403错误意味着禁止。服务器说"你不允许这样做"。

查看您尝试使用的服务的文档。 (也许你需要通过某种登录程序。也许你想要做的只是允许某些用户或其他东西。)

尝试使用this page上的示例网址...这在我的网络浏览器中对我有用。

答案 2 :(得分:-1)

你需要用try / catch块包围它

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