HTTP Zugriff auf http-Server - Error 400

Andi_CH

Top Contributor
Ich habe einen Server am laufen der mir ein Bild einer Webcam liefert.
Der Zugriff mit dem Browser über den Link
Code:
http://servername:8081/?action=snapshot
geht

Der aus einem klugen Buch abgetippte und modifizerte Code liefert "Error 400"

Java:
URL url = new URL("http://servername:8081/");
URLConnection connection = url.openConnection();
connection.setDoOutput(true);
PrintWriter out = new PrintWriter(connection.getOutputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
out.print("action=snapshot");
out.close();
String line;
while((line=in.readLine()) != null) {
	System.out.println(line);
}

Was mach der Browser anders?
 

Andi_CH

Top Contributor
Das muss so sein, denn:

Java:
URL url = new URL("http://vakserver:8081/?action=snapshot");
URLConnection connection = url.openConnection();
connection.setDoOutput(true);
PrintWriter out = new PrintWriter(connection.getOutputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
out.close();
String line;
while((line=in.readLine()) != null) {
	System.out.println(line);
}

Code:
java.io.IOException: Server returned HTTP response code: 400 for URL: http://vakserver:8081/?action=snapshot
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
	at ch.mbh.vak.client.GetPicture.main(GetPicture.java:23)
 

Andi_CH

Top Contributor
Habe ich zu wenig präzise gefragt? Wie macht man es richtig?

Mein erster Versuch (siehe unten) brachte dasselbe Resultat:
(dieser Code läuft in anderem Zusammenhang)

Java:
/**
 * Sends a message to the given web host and site and receives its respond
 * @param pHost the host name
 * @param pSite The site
 * @param pMessage The message string
 * @param pTimeout the connection timeout (sec)
 * @return the response from the web server
 * @throws Exception if the message could not send to the host
 */
public static Map<String, String> sendHttpPost(String pHost, int pPort, String pSite, String pMessage, int pTimeout, boolean pDebug) throws Exception {
	System.out.println("sendHttpPost() host = " + pHost + ", port = " + pPort + ", site = " + pSite + ", message = " + pMessage);
	Socket socket = null;
	OutputStream out = null;

	byte[] theMessage = null;
	try  {
		theMessage = pMessage.getBytes("UTF-8");
		StringBuffer msgBuffer = new StringBuffer();
		msgBuffer.append("POST");
		msgBuffer.append(" " + pSite + " ");
		msgBuffer.append("HTTP/1.1");
		msgBuffer.append("\r\n");
		msgBuffer.append("Host: ");
		msgBuffer.append(pHost);
		msgBuffer.append("\r\n");
		msgBuffer.append("Content-type: ");
		msgBuffer.append("application/x-www-form-urlencoded");
		msgBuffer.append("\r\n");
		msgBuffer.append("Content-length: ");
		msgBuffer.append(String.valueOf(theMessage.length));
		msgBuffer.append("\r\n");
		msgBuffer.append("\r\n");
		msgBuffer.append(pMessage);

		if (pDebug) {
			System.out.println("==========================================");
			System.out.println("AHttpPost.sendHttpPost() send = " + msgBuffer.toString());
		}
		byte[] message = msgBuffer.toString().getBytes("UTF-8");
		// write datas to the host 'pHost' on pPort
		if (pTimeout == 0) {
			pTimeout = CONNECTION_TIMEOUT;
		}
		socket = new Socket(pHost, pPort);
		socket.setSoTimeout(1000 * pTimeout);              //set socket timeout (ms)
		out = socket.getOutputStream();
		out.write(message);
		out.flush();
		//
		// read answer if any	 
		InputStream inputStream = socket.getInputStream();
		InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
		BufferedReader br = new BufferedReader(inputStreamReader);

		Map<String, String> response = new HashMap<String, String>();
		String line = null;
		boolean ok = false;
		while ((line = br.readLine()) != null) {
			if (pDebug)
				System.out.println("AHttpPost.sendHttpPost() response = " + line);
			if (line.indexOf(RESPONSE_OK_ID) >= 0) {
				ok = true;
				break;
			}
			//split the response into a key/value pair
			String[] keyValue = line.split("=");
			if (keyValue.length == 2) {
				response.put(keyValue[0], keyValue[1]);
			}
		}
		if (ok) {
			return response;
		} else {
			String errMsg = " Internal server error " + pHost;
			//show the last line from the server
			if (line != null) {
				errMsg += "\n" + line;
			}
			throw new Exception(errMsg);
		}
	} catch(UnknownHostException uhex) {
		throw new Exception("Keine Verbindung zu " + uhex.getMessage());
	} catch(ConnectException cex) {
		throw new Exception("Keine Verbindung zu " + cex.getMessage());
	} catch(SocketTimeoutException tex) {
		throw new Exception(tex.getMessage());
	} catch (IOException ioex) {
		throw ioex;
	} catch (Exception ex) {
		throw ex;
	} finally {
		try {
			socket.close();
			out.close();
		} catch (Exception ioex) {}
	}
}

Output:
Code:
sendHttpPost() host = servername, port = 8081, site = /?action=snapshot, message = 
==========================================
AHttpPost.sendHttpPost() send = POST /?action=snapshot HTTP/1.1
Host: servername
Content-type: application/x-www-form-urlencoded
Content-length: 0


AHttpPost.sendHttpPost() response = HTTP/1.0 400 Bad Request
AHttpPost.sendHttpPost() response = Content-type: text/plain
AHttpPost.sendHttpPost() response = Connection: close
AHttpPost.sendHttpPost() response = Server: MJPG-Streamer/0.2
AHttpPost.sendHttpPost() response = Cache-Control: no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0
AHttpPost.sendHttpPost() response = Pragma: no-cache
AHttpPost.sendHttpPost() response = Expires: Mon, 3 Jan 2000 12:34:56 GMT
AHttpPost.sendHttpPost() response = 
AHttpPost.sendHttpPost() response = 400: Not Found!
AHttpPost.sendHttpPost() response = Malformed HTTP request
 
M

maki

Gast
Kannst ja mal mit Firebug nachsehen was der Browser so alles mitschickt, vielleicht ist HttpClient doch besser geeignet als URLConnection.

Warum der HTTP Sever 400 zurückgibt lässt sich so leider nicht sagen, entscheidet ja der Server was er zurückschickt, schreibt er denn ein log?
 

musiKk

Top Contributor
Mach mal in Deinem Minibeispiel kein [c]setDoOutput(true)[/c] (das lange Beispiel habe ich mir jetzt nicht angesehen). Dadurch signalisierst Du, dass noch etwas kommt und die Anfrage wird als POST und nicht als GET durchgeführt.
 

Andi_CH

Top Contributor
Java:
URL url = new URL("http://servername:8081/?action=snapshot");
URLConnection connection = url.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
while((line=in.readLine()) != null) {
	System.out.println(line);
}

Output:
ÿØÿÛ..... (¢€ ¢euË¥ (¢€ (¢€

Das könnte möglicherweise das Bild sein -> wie bastle ich nun daraus ein Bild?

(Das muss aber ein Teures sein, so oft wie €, ¢, £, $ und ¥ drin vorkommen :D )
 

Michael...

Top Contributor
Java:
Das könnte möglicherweise das Bild sein -> wie bastle ich nun daraus ein Bild?[/QUOTE]
Ich nehme an das Bild soll angezeigt werden, ohne es vorher auf die Platte zu schreiben?
Grundsätzlich würde ich die Daten nicht mit einem Reader sondern mit einen InputStream (z.B. DataInputStream) einlesen, da ein Reader für Textstreams gedacht ist und m.W. die Daten direkt interpretiert.
(Zum Testen, ob es ich bei den Daten um ein Bild handelt würde ich diese aber dennoch erst einmal auf die Platte schreiben.)
Die eingelesenen Daten könnte man versuchen in ein byte-Array zu lesen und dieses dann mittels ByteArrayInputstrem und ImageIO.read(...) als Image einzulesen.
Eventuell gibt es auch die Möglichkeit direkt vom InputStream der URLConnection in ein Image einzulesen. Hab sowas aber noch nie gemacht. Ich habe eigentlich immer die Daten in eine Datei auf Platte geschrieben und dann von der Datei geladen.
 

Andi_CH

Top Contributor
Eigentlich genau umgekehrt - es reicht mir völlig wenn es als File vorhanden ist.

Mir ist schon nicht klar warum der InputStream einem InputStreamReader übergeben werden muss und der wiederum einem Buffered Reader ... Ich bin erst auf dem Niveau angelangt auf dem ich finde, dass Java alles unnötig kompliziert macht :bahnhof: ;)

"Könnte man versuchen" - WEISS wer wie es geht? (Nö - es ist keine Hausaufgabe zu der ich die Lösung erschleichen will - ich möchte nur schneller zu einem Ziel kommen, als wenn ich erst alle Fehler selbst machen und 100 Seiten API übersetzen muss) ;-)

Java:
URL url = new URL("http://" + pServerName + ":" + pPort + "/?action=snapshot");
URLConnection connection = url.openConnection();
Map<String, List<String>>  list = connection.getHeaderFields();
System.out.println("=== Headerfields ===");
for (String s : list.keySet()) {
	System.out.println(" " + s + " : " + list.get(s));
}

Code:
=== Headerfields ===
 null : [HTTP/1.0 200 OK]
 Content-type : [image/jpeg]
 Expires : [Mon, 3 Jan 2000 12:34:56 GMT]
 Connection : [close]
 Server : [MJPG-Streamer/0.2]
 Cache-Control : [no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0]
 Pragma : [no-cache]

(Spannend finde ich "null" auf der ersten Zeile - es gibt als einen Key der null ist ???:L )
Sieht aber schon vielversprechend aus ...
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Eigentlich genau umgekehrt - es reicht mir völlig wenn es als File vorhanden ist.
Wenn es sich bei den Daten tatsächlich um ein Bild handelt.Dann könnte man ja den InputStream der URLConnection direkt auslesen in byte-Arrays auslesen und diese per FileOutputStream auf die Platte schreiben.
Java:
InputStream in = connection.getInputStream();
byte[] buffer=new byte[1024];
FileOutputStream fileOut = new FileOutputStream(new File("c:\\bild.jpg"));
int len;
while ((len = in.read(buffer))>0)
      fileOut.write( buffer, 0, len ); 
fileOut.close();
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Suche API für einfachen HTTP-Zugriff. Netzwerkprogrammierung 17
windl Bluetooth und Zugriff auf ein IPhone Netzwerkprogrammierung 0
V Kann man mit Hilfe eines Java-Programms den Zugriff auf bestimmte Internetseiten verhinden? Netzwerkprogrammierung 3
J FTP FTP Zugriff über Proxy Server Netzwerkprogrammierung 1
D Zugriff auf Webinhalte ohne visuelles Öffnen der Website Netzwerkprogrammierung 2
L ssh connection; Zugriff auf 'screen' Prozess Netzwerkprogrammierung 5
J Website-Zugriff beenden Netzwerkprogrammierung 11
O HTTP Zugriff und Aktionen auf einer Webseite ausführen Netzwerkprogrammierung 9
F Desktop.browse() zugriff verweigert Netzwerkprogrammierung 2
vandread Zugriff auf Soziales Netzwerk mittels Java? Netzwerkprogrammierung 4
B FTP Applet mit FTP-Server-Zugriff sicher gestalten Netzwerkprogrammierung 12
D Zugriff auf zentrale DB von verscheidenen Computern Netzwerkprogrammierung 7
T FTP-Zugriff auf Textdatei Netzwerkprogrammierung 13
B Zugriff auf eine Text- und XML-Datei Netzwerkprogrammierung 4
T JavaMail POP Zugriff zeigt nicht alle Emails Netzwerkprogrammierung 2
V Zugriff auf Laufwerk mit Username und Passwort? Netzwerkprogrammierung 7
R CVS- Zugriff Netzwerkprogrammierung 27
Airwolf89 Passwortabfrage bei Zugriff auf Zielrechner Netzwerkprogrammierung 17
ABstraCT Applet multipler port Zugriff möglich ? Netzwerkprogrammierung 5
ABstraCT Telnet port Zugriff problem (public IP) Netzwerkprogrammierung 12
S Zugriff auf Webseite Netzwerkprogrammierung 3
F Webserver Zugriff per Java Netzwerkprogrammierung 3
F Applet Datei Zugriff Netzwerkprogrammierung 13
T XML-RPC kein Zugriff auf Server Interface Netzwerkprogrammierung 3
T RMI - Client Zugriff auf Server funktioniert nicht Netzwerkprogrammierung 5
R Zugriff auf Suchmaschinen. Wie am Sinnvollsten? Netzwerkprogrammierung 2
D Zugriff auf URL über festgelegte Netzwerkresource Netzwerkprogrammierung 6
C Session Problem beim Zugriff auf Webseiten Netzwerkprogrammierung 3
H ServerSocket -> Zugriff nur von localhost Netzwerkprogrammierung 6
J SecurityManager - Server-Zugriff nur von bestimmten Clients? Netzwerkprogrammierung 2
P Praktikumsarbeit: Zugriff Active Directory/Server/Datenbank Netzwerkprogrammierung 15
J Server soll Zugriff auf Java Programm ermöglichen Netzwerkprogrammierung 3
S FTP zugriff - ich versteh es nich Netzwerkprogrammierung 17
D Zugriff auf OPC Server Netzwerkprogrammierung 1
D Zugriff auf Rechner im Lan Netzwerkprogrammierung 2
A Zugriff auf Inet Datenbank? Netzwerkprogrammierung 4
A Zugriff auf einen fremden Monitor im lan Netzwerkprogrammierung 3
F http Post auf einen Grafana Server Netzwerkprogrammierung 3
H Datei mit Anhang via http "hochladen" Netzwerkprogrammierung 16
S HTTP Post?!? - Java Server Netzwerkprogrammierung 7
R Anfängerbeispiel: Suche Java-Anwendung die http-Anfragen in Tomcat liest Netzwerkprogrammierung 8
O HTTP Wer hilft mit meinem UTF-8 http Request ? Netzwerkprogrammierung 1
G localhost im Backend https vs. http Netzwerkprogrammierung 9
J Simple HTTP Framework (basierend auf expressjs) Netzwerkprogrammierung 1
M HTTP Http requests aufzeichnen Netzwerkprogrammierung 2
J HTTP [Java 9] Neuer HTTP Client - Tutorial Netzwerkprogrammierung 3
J HTTP Befehl via HTTP senden ohne Browser öffnen Netzwerkprogrammierung 3
F HTTP HTTP Rest Client mit TLS1.2 und selbst signiertem Zertifikat Netzwerkprogrammierung 2
M http request and response Netzwerkprogrammierung 0
M Verbindungszeit berechnen (TCP, HTTP/1.0, HTTP/1.1) Netzwerkprogrammierung 2
P HTTP Bild von einem Server per http kopieren Netzwerkprogrammierung 1
U HTTP XML vom Server abholen oder http Abfragen, Entscheidung treffen Netzwerkprogrammierung 0
P HTTP Server / Client Netzwerkprogrammierung 1
S HTTP-Requeste von Browser mit Java sniffen? Netzwerkprogrammierung 9
E HTTP java.lang.IllegalArgumentException: protocol = http host = null Netzwerkprogrammierung 1
M Server mit HTTP Netzwerkprogrammierung 9
H Sockets oder HTTP- Methoden? Netzwerkprogrammierung 3
B Socket HTTP-Request führt zu Endlosschleife Netzwerkprogrammierung 5
D HTTP nochne frage zu http requests Netzwerkprogrammierung 6
D HTTP Bräuchte hilfe mit Http Requests Netzwerkprogrammierung 6
K HTTP Eigener Http Response für Datei-Download Netzwerkprogrammierung 4
D Server Client Verbindung - Unexpected End of File - Invalid HTTP Response Netzwerkprogrammierung 4
F HTTP HTTP-Download: Dateien in einem Verzeichnis ermitteln Netzwerkprogrammierung 8
T HTTP Einen HTTP Server erstellen Netzwerkprogrammierung 20
N Problem über http eine Datei zu senden Netzwerkprogrammierung 4
Dit_ HTTP Einfache HTTP-Anfrage Netzwerkprogrammierung 6
nrg FileUpload HTTP POST Netzwerkprogrammierung 5
T Socket Java HTTP-Proxy Netzwerkprogrammierung 3
B HTTP JSESSIONID in Http(s)URLConnection loswerden! Netzwerkprogrammierung 13
E Socket HTTP-Server Netzwerkprogrammierung 6
C HTTP POST Connect Netzwerkprogrammierung 9
D HTTP Java HTTP Kommunikation Netzwerkprogrammierung 9
R HTTP Apache HTTP Client: Request mit angehängter Datei Netzwerkprogrammierung 2
O Http request Netzwerkprogrammierung 7
Tobse HTTP ServerSocket HTTP Netzwerkprogrammierung 4
I HTTP Datei Uploaden mit http und Sprache anpassen Netzwerkprogrammierung 7
I Socket HTTP Nachrichten über Sockets verschicken Netzwerkprogrammierung 2
N Http Client Netzwerkprogrammierung 3
W Asynchroner HTTP Client / non-blocking I/O Netzwerkprogrammierung 2
R HTTP Problem bei Authentifizierung über (Http)UrlConnection Netzwerkprogrammierung 2
L Body eines http Request auslesen Netzwerkprogrammierung 2
T HTTP Encoding von Http-Streams Netzwerkprogrammierung 2
K Ende eines HTTP Response/Request Netzwerkprogrammierung 6
D http request Netzwerkprogrammierung 11
C HTTP Studienarbeit Kommunikation via HTTP mit POST zwischen Server und Client Netzwerkprogrammierung 7
Kr0e Simpler HTTP Stream server Test Netzwerkprogrammierung 3
K HTTP-Anfrage an einen Server wird nicht beantwortet Netzwerkprogrammierung 3
J org.apache.http.auth.NTCredentials Netzwerkprogrammierung 2
W Problem mit HTTP-Dateiübertragung Netzwerkprogrammierung 6
A org.apache.commons http client in Netbeans einbinden Netzwerkprogrammierung 3
G Http Client mit Redirect Enabled Netzwerkprogrammierung 2
M Http POST liefert kryptischen Content Netzwerkprogrammierung 4
G Sockets und HTTP: Ende des Datenempfangs erkennen Netzwerkprogrammierung 3
B Wie HTTP GET/POST Anfrage versenden? Netzwerkprogrammierung 7
R HTTP Server Memory Leak? Netzwerkprogrammierung 6
G HTTP-Request InputStream-Problem Netzwerkprogrammierung 5
K optimale HTTP Downloads Netzwerkprogrammierung 15
G auf http-request antworten. Netzwerkprogrammierung 3
I http sniffer gesucht Netzwerkprogrammierung 10
G Socket + HTTP Header Netzwerkprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben