3 Stimmen

Java Ungültige HTTP-Antwort auf localhost

Ich schreibe ein Paket für ein Schulprojekt, bei dem ein Benutzer eine Server-URL angeben und das XML abrufen kann, das es zurückgibt. Auf der Client-Seite erhalte ich jedoch einen Fehler.

Die Mock-API-Klasse

import java.net.*;
import java.util.ArrayList;
import java.io.*;

public class ParkplatzInstanz {
/*
 * Parkplatz-API-Instanz
 *      Konstruktor
 *          URL - String
 *          Port - int
 */

public static URL serverURL;

public ParkplatzInstanz(URL connurl){
    serverURL = connurl;
}

public String getParkingLotInfo(){
    //Antwort vom API-Server abrufen

    URL APIurl = this.serverURL;
    System.out.println(APIurl);
    try {
        BufferedReader in = new BufferedReader(
                new InputStreamReader(APIurl.openStream()));

        String APIresponse;
        while ((APIresponse = in.readLine()) != null)
            return APIresponse;
        in.close();

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;

}

public ArrayList parseParkplatzInfo(String XML){
    //XML in Arrayliste parsen

    return null;
}
}

Die Hauptklasse

paket parkinglot_api;

import java.net.MalformedURLException;
import java.net.URL;

public class Beispiel {

/**
 * @param args
 */
public static void main(String[] args){
    // TODO Auto-generated method stub
    URL serverURL;
    try {
        serverURL = new URL("http://localhost:8080");

        ParkplatzInstanz API = new ParkplatzInstanz(serverURL);

        String parkplatzXML = API.getParkingLotInfo();

        System.out.println(parkplatzXML);
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}
 }

Der Fehler, den ich erhalte

http://localhost:8080
null
java.io.IOException: Ungültige HTTP-Antwort
bei sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
bei java.net.URL.openStream(Unknown Source)
bei parkinglot_api.ParkplatzInstanz.getParkingLotInfo(ParkplatzInstanz.java:28)
bei parkinglot_api.Beispiel.main(Beispiel.java:20)

Server-Code

https://bitbucket.org/it460/parking-lot-api/src/f7095b71eb11/server

Ich kenne nicht viel von Java, besonders nicht von Netzwerksachen, daher ist oben der Link zum Code, der den Server auf localhost:8080 ausführt und das XML ausgibt. Wusste nicht, wo ich die Header setzen sollte und war ehrlich gesagt einfach froh, dass es das XML ausgab. Der Grund, warum ich dies anpassen muss, ist, weil der Professor möchte, dass ich die Client-Seite verpacke, damit eine andere Gruppe nur die App-Server-URL angeben und die Daten abrufen kann. Das ist, was ich im hier geposteten Code versucht habe.

0 Stimmen

Die URL funktioniert einwandfrei im Browser. Es gibt XML zurück, das ich aus einer anderen Anwendung generiert habe.

0 Stimmen

Versuchen Sie, anstelle von XML eine HTML-Seite zurückzugeben. Möglicherweise hat dies mit dem Antwortheader zu tun, der an Ihren Java-Client zurückgesendet wird.

4voto

Suresh Kumar Punkte 10331

Fügen Sie das Folgende in Ihre Response-Klasse ein:

response += "HTTP/1.1 200 OK\n";
response += "Content-Type: application/xml\n\n";

if (format.equals("xml")) {
      // XML-Dokument abrufen
       String xml = LotFromDB.getParkingLotXML();
       response += xml;
}

Hinweis: Sie sollten vermeiden, Ihren eigenen Webserver zu schreiben. Verwenden Sie stattdessen einen vorhandenen Webserver, der sehr hilfreich sein wird. Die oben genannten Änderungen lösen Ihre aktuellen Probleme, aber Sie werden auf viele weitere Probleme stoßen, wenn Sie auf diesem Weg weitermachen. Ich empfehle Ihnen, jede Servlet-Engine für Ihre Serverimplementierung zu verwenden. Verwenden Sie auch auf dem Client eine ausgereifte HTTP-Client-Bibliothek wie Apache Http Client anstelle der Klasse java.net.URL.

1 Stimmen

Vielen Dank für den Tipp. Ich dachte auch, dass es sinnvoller gewesen wäre, einen echten Webserver und ein vorhandenes REST-Framework zu verwenden, aber der Professor ist ein Werkzeug. Das war der letzte Teil, den ich herausfinden musste, also spielt es jetzt keine Rolle mehr.

1voto

Jan Arciuchiewicz Punkte 791

Es scheint ein Problem mit der Verarbeitung von Headern zu geben. Bitte verwenden Sie den TCP-Monitor (zum Beispiel: http://ws.apache.org/commons/tcpmon von Apache), um das Problem zu finden. Es könnte beispielsweise durch falsche Zeichenkodierung oder eine spezifische Methode der Nachrichten-Multipart-Kodierung (Vermutung) verursacht werden.

0 Stimmen

Ich bin nicht vertraut mit der Java-Netzwerkprogrammierung. Durch einige kleine Tutorials, die mir vom Professor des Kurses gegeben wurden, war ich in der Lage, einen zusammengewürfelten Server zu konstruieren. bitbucket.org/it460/parking-lot-api/src/f7095b71eb11/server In der Response-Klasse habe ich einige Codezeilen, die einige Argumente verarbeiten und XML zurückgeben, aber ich war mir nicht sicher, wo ich die HTTP-Header setzen sollte. Vielleicht könnten Sie mir die richtige Richtung zeigen.

0 Stimmen

Du verwendest das HTTP-Protokoll, also musst du die Antwort entsprechend formatieren. Das bedeutet, dass du mindestens die erforderliche Statuszeile und/oder Header hinzufügen musst. Zum Beispiel: String xml = LotFromDB.getParkingLotXML(); String header = String.format("HTTP/1.1 200 OK\r\nContent-Type: text/xml\r\nContent-Length: %d\r\n\r\n", xml.length()); response = header + xml;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X