Twitch API mit HttpURLConnection läuft nicht?
Moin an alle,
ich würde gerne auf die Twitch API zugreifen und abfragen ob ein bestimmter Kanal grade Streamt.
Hier der Code:
String Streamer = "Test";
URL url;
HttpURLConnection connection = null;
try{
//create connection
url = new URL(("https://api.twitch.tv/kraken/channels/" + Streamer));
connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("GET");
connection.setRequestProperty("Client-ID",
Secrets.twitch_clientid);
connection.setUseCaches(false);
connection.setDoInput(true);
connection.setDoOutput(true);
//Send request
DataOutputStream wr = new DataOutputStream(
connection.getOutputStream());
//Get response
InputStream is = connection.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
String line;
StringBuffer response = new StringBuffer();
while((line = rd.readLine()) != null){
response.append(line);
response.append('\r');
}
rd.close();
System.out.println(response.toString());
} catch (Exception e){
e.printStackTrace();
System.out.println("NULL");
} finally {
if (connection != null) {
connection.disconnect();
}
}
Was ich als Output bekomme:
java.io.FileNotFoundException: https://api.twitch.tv/kraken/channels/Test
at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1923)
at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1523)
at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:224)
at me.duncte123.ge.commands.cmdTest.handle(cmdTest.java:47)
at me.duncte123.ge.CommandManager.handleCommand(CommandManager.java:59)
at me.duncte123.ge.Listener.onGuildMessageReceived(Listener.java:60)
at net.dv8tion.jda.core.hooks.ListenerAdapter.onEvent(ListenerAdapter.java:381)
at net.dv8tion.jda.core.hooks.InterfacedEventManager.handle(InterfacedEventManager.java:84)
at net.dv8tion.jda.core.handle.MessageCreateHandler.handleInternally(MessageCreateHandler.java:95)
at net.dv8tion.jda.core.handle.SocketHandler.handle(SocketHandler.java:37)
at net.dv8tion.jda.core.requests.WebSocketClient.onDispatch(WebSocketClient.java:868)
at
Hat jemand dasselbe Problem auch mal gehabt? Mache ich etwas falsch?
Gruß
Dennis
2 Antworten
![](https://images.gutefrage.net/media/default/user/14_nmmslarge.png?v=1551279448000)
- HTTPUrlConnection ist ein wirklich altes, umständliches API für HTTP. Zu seiner Zeit war es sensationell (damals hatte keine andere Sprache solche Dinge eingebaut), heute ist es eigentlich nur mehr für alten Code sinnvoll. Ich würde dringend den modernen HTTPClient empfehlen, da schrumpft viel Code weg: https://docs.oracle.com/en/java/javase/11/docs/api/java.net.http/java/net/http/HttpClient.html
- Alternativ kannst du auch andere Clients verwenden, falls du kein modernes Java hast und speziellere Anforderungen wie Filter. Die Auswahl ist groß, heute ist OkHttp recht beliebt, der Apache HTTP Client ist wahrscheinlich der meistbenutzte. Wenn man sowieso gegen REST-APIs arbeitet, ist ein JAX-RS-Client praktisch, etwa der von Jersey. https://www.baeldung.com/jersey-jax-rs-client
- Solltest du unbedingt HTTPUrlConnection verwenden wollen, kannst du ein begrenztes Tracing über Logs bekommen, damit du siehst was eigentlich passiert: https://stackoverflow.com/a/12296003
![](https://images.gutefrage.net/media/default/user/14_nmmslarge.png?v=1551279448000)
Weil's so einfach ist, schnell ausprobiert:
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.twitch.tv/kraken/channels/Test"))
.header("Client-ID", "nzljca10enva1syj8o2vyojmp636vu")
.header("Accept", "application/vnd.twitchtv.v5+json") // sonst gibt's ein 410, siehe API-Doku!
.build();
HttpResponse<String> response =
client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
Das gibt dir zumindest im Detail aus, was du mit dem API falsch machst, derzeit meckert Twitch dass die Channel ID im falschen Format ist.
![](https://images.gutefrage.net/media/default/user/9_nmmslarge.png?v=1551279448000)
Mangels Client-ID kann ichs nicht testen. Wenn ich's im Browser versuche, kommt Fehler 400. Gebe ich eine zufällige Client-ID an (4711) kommt der Fehler "Invalid client id specified". Soweit erwartbar. Ob der Fehler in Java nach FileNotFoundException gemappt wird, weiß ich nicht. Schau mal, ob die Exception eine InnerException hat, die mehr verrät - oder wie das in Java heißt...... Hier steht was dazu.
![](https://images.gutefrage.net/media/default/user/6_nmmslarge.png?v=1438863662000)
habe jetzt e.getCause(); gemacht da kommt nix als Output... hier die Client-ID: nzljca10enva1syj8o2vyojmp636vu
(Kann sie später ja wieder ändern :) )