我正在尝试打开一个到服务 API 指定的特定 URL 的输入流。但是,它没有一套协议(protocol)(不是 http 或 https),如果没有协议(protocol),我会收到以下错误。
有没有办法在没有协议(protocol)的情况下获取请求?
异常:
Exception in thread "main" java.net.MalformedURLException: no protocol.
代码:
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();
现在我收到以下错误:
异常:
Exception in thread "main" java.io.IOException: Server returned HTTP response code: 403 for URL: http://maple.fm/api/2/search?server=1
最佳答案
没有协议(protocol)的 URL 不是有效的 URL。它实际上是一个相对 URI,如果您有绝对 URI(或等效的)来提供解析它的上下文,则只能使用相对 URI。
Is there any way to [make] a request without a protocol?
基本上......不。协议(protocol)告诉客户端库如何执行请求。如果没有协议(protocol),图书馆将不知道该怎么做。
“没有协议(protocol)的 url”在网络浏览器的 URL 栏中起作用的原因是浏览器很有帮助,并用“http:”填充缺少的协议(protocol)...假设这就是什么用户可能意味着。 (加上一大堆其他的东西,比如添加“www.”,添加“.com”,转义空格和其他非法字符,......或者尝试搜索而不是正常的 HTTP GET 请求。)
现在,在将 URL 字符串传递给 URL 类之前,您可以尝试在代码中执行相同的操作。但在我看来,如果您正在编写与服务通信的代码,正确的解决方案就是修复 URL。将正确的协议(protocol)放在前面...
403您现在收到的错误意味着禁止。服务器说“您不允许这样做”。
检查您尝试使用的服务的文档。 (也许您需要执行某种登录程序。也许您尝试执行的操作仅允许某些用户或其他用户执行。)
尝试 this page 上的示例 URL ...这恰好可以通过我的网络浏览器对我起作用。
关于没有协议(protocol)的 Java URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22740582/