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?
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. –