我尝试将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
答案 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 answer和this 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();