2009-05-06 2 views
1

Ich bin ein Tomcat-Server mit einigen virtuellen Hosts und ich muss einige Daten an ein Servlet auf diesem Server von einem anderen Servlet auf einem anderen Server POST. Da der Server, an den ich mich anmelde, virtuelle Hosts verwendet, die sich nur auf diesen Host beziehen, wird dies ein Problem verursachen (es wird nicht wissen, mit welchem ​​virtuellen Host ich sprechen möchte).Wie mache ich einen HTTP 1.1-Post in Java mit der Socket-Klasse?

Hier ist der Code, den ich habe, um einen HTTP 1.0 POST zu "sub.example.com" auszuführen, aber in diesem Beispiel weiß "example.com" nur, die Anfrage an die richtige Subdomäne zu routen, wenn sie als konfiguriert ist der Standard. Dies liegt an der Anforderung, dass einem Socket eine InetAddress und nicht der Hostname übergeben werden muss.

String host = "sub.example.com"; 
int port = 80; 
String path = "/Servlet"; 
StringBuilder data = new StringBuilder(); 
data.append(URLEncoder.encode("NameA", "UTF-8")).append('=').append(URLEncoder.encode("ValueA", "UTF-8")); 
data.append('&').append(URLEncoder.encode("NameB", "UTF-8")).append('=').append(URLEncoder.encode("NameB", "UTF-8")); 

InetAddress addr = InetAddress.getByName(host); 
Socket socket = new Socket(addr, port); 
BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8")); 

wr.write("POST "+path+" HTTP/1.0\r\n"); 
wr.write("Content-Length: "+data.length()+"\r\n"); 
wr.write("Content-Type: application/x-www-form-urlencoded\r\n"); 
wr.write("\r\n"); 
// Send data 
wr.write(data.toString()); 
wr.flush(); 
wr.close(); 

Irgendwelche Ideen?

Antwort

6

Sie möchten mit Apache HttpClient anstatt Durchführung Raw-Socket-Kommunikation zu berücksichtigen.

+0

Für diese Aufgabe sieht es so aus. Was ich jedoch auch versuche, ist, dem Remote-Server mitzuteilen, dass er eine Aktion starten soll, deren Ausführung einige Minuten in Anspruch nimmt. In diesem Fall brauche ich die unmittelbare Rückmeldung, dass der Befehl gesendet und verarbeitet wurde, aber ich kümmere mich nicht um seine Ausgabe (sobald ich weiß, dass der Server den Befehl erhalten hat), die wie die Apache-HttpClient-Klasse kapselt. –

4

Sie sollten erwägen Leben machen ein wenig auf sich leichter von einem der höheren Ebene HTTP-Clients in Java, wie HttpURLConnection verwenden. Sie müssen immer noch mit der Erstellung des Request Body arbeiten, aber es abstrahiert viel von dem Aufwand, eine wohlgeformte Anfrage zu erstellen, und bringt Ihren Code näher an die wahre Domain heran.

Verwandte Themen