FileNotFoundException для URL, который работает в браузере
Я пытаюсь использовать API из https://us.mc-api.net/ для проекта, и я сделал это в качестве теста.
public static void main(String[] args) < try < URL url = new URL("http://us.mc-api.net/v3/uuid/193nonaxishsl/csv/"); BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); String line; while ((line = in.readLine()) != null) < System.out.println(line); >in.close(); > catch (MalformedURLException e) < e.printStackTrace(); >catch (IOException e) < e.printStackTrace(); System.out.println("I/O Error"); >> >
И это дает мне ошибку IOException, но когда я открываю ту же страницу в своем веб-браузере, я получаю
это то, что я хочу получить из кода. Я новичок и не знаю, почему это происходит или почему. РЕДАКТИРОВАТЬ: StackTrace
java.io.FileNotFoundException: http://us.mc-api.net/v3/uuid/193nonaxishsl/csv/ at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) at java.net.URL.openStream(Unknown Source) at com.theman1928.Test.Main.main(Main.java:13)
3 ответа
URL возвращает код состояния 404, и поэтому входной поток (легкая догадка здесь) не создается и, следовательно, является нулевым. Сортируйте код состояния, и вы должны быть в порядке.
Запустил это с этим CSV, и это хорошо: другие CSV
Если код ошибки важен для вас, вы можете использовать HttpURLConnection:
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); System.out.println("code:"+conn.getResponseCode());
Таким образом, вы можете обработать код ответа, прежде чем приступить к быстрой проверке if-then-else.
Я попробовал это с библиотеками Apache HTTP. Кажется, что конечная точка API возвращает код состояния 404, следовательно, ваша ошибка. Код, который я использовал ниже.
public static void main(String[] args) throws URISyntaxException, ClientProtocolException, IOException < HttpClient httpclient = HttpClients.createDefault(); URIBuilder builder = new URIBuilder("http://us.mc-api.net/v3/uuid/193nonaxishsl/csv/"); URI uri = builder.build(); HttpGet request = new HttpGet(uri); HttpResponse response = httpclient.execute(request); System.out.println(response.getStatusLine().getStatusCode()); // 404 >
Выключение http://us.mc-api.net/v3/uuid/193nonaxishsl/csv/ с www.example.com или что-либо еще возвращает код состояния 200, что дополнительно подтверждает ошибку конечной точки API. Вы можете посмотреть библиотеку [Apache HTTP Components] здесь.
Это связано с тем, как работают проводные протоколы по сравнению с классами java.net и реальным браузером. Браузер будет намного сложнее, чем простой API java.net, который вы используете.
Если вы хотите получить эквивалентное значение ответа в Java, вам нужно использовать более богатый HTTP API.
Этот код даст вам тот же ответ, что и браузер; Тем не менее, вам нужно скачать Apache HttpComponents jars
import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import javax.net.ssl.HttpsURLConnection; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.impl.client.HttpClients; public class TestDriver < public static void main(String[] args) < try < String url = "http://us.mc-api.net/v3/uuid/193nonaxishsl/csv"; HttpGet httpGet = new HttpGet(url); getResponseFromHTTPReq(httpGet, url); >catch (Throwable e) < e.printStackTrace(); >> private static String getResponseFromHTTPReq(HttpUriRequest httpReq, String url) < HttpClient httpclient = HttpClients.createDefault(); // Execute and get the response. HttpResponse response = null; HttpEntity entity = null; try < response = httpclient.execute(httpReq); entity = response.getEntity(); >catch (IOException ioe) < throw new RuntimeException(ioe); >if (entity == null) < String errMsg = "No response entity back from " + url; throw new RuntimeException(errMsg); >String returnRes = null; InputStream is = null; BufferedReader buf = null; try < is = entity.getContent(); buf = new BufferedReader(new InputStreamReader(is, "UTF-8")); System.out.println("Response Code : " + response.getStatusLine().getStatusCode()); StringBuilder sb = new StringBuilder(); String s = null; while (true) < s = buf.readLine(); if (s == null || s.length() == 0) < break; >sb.append(s); > returnRes = sb.toString(); System.out.println("Response: [" + returnRes + "]"); > catch (UnsupportedOperationException | IOException e) < throw new RuntimeException(e); >finally < if (buf != null) < try < buf.close(); >catch (IOException e) < >> if (is != null) < try < is.close(); >catch (IOException e) < >> > return returnRes; > >
Код ответа: 404
Ответ: [ложь, Неизвестно-Имя пользователя]