2009-05-06 4 views
1

J'utilise un serveur Tomcat avec des hôtes virtuels et j'ai besoin de POSTER des données à une servlet sur ce serveur à partir d'une autre servlet sur un autre serveur. Parce que le serveur que je poste pour utiliser des hôtes virtuels se référant simplement à cet hôte par son adresse IP causera un problème (il ne saura pas à quel hôte virtuel j'essaye de parler).Comment faire un post HTTP 1.1 en Java avec la classe Socket?

Voici le code que j'ai pour exécuter un POST HTTP 1.0 à "sub.example.com", mais dans cet exemple "example.com" ne sait que router la requête vers le bon sous-domaine s'il est configuré comme le défaut. Cela est dû à l'exigence qu'un Socket soit passé une InetAddress et pas le nom d'hôte.

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(); 

Des idées?

Répondre

6

Vous pouvez envisager d'utiliser Apache HttpClient plutôt que d'effectuer des communications de socket raw.

+0

Pour cette tâche, il semble que cela fonctionne. Cependant, j'essaie aussi de dire au serveur distant de démarrer une action qui peut prendre quelques minutes. Dans ce cas, j'ai besoin de la rétroaction immédiate que la commande a été envoyée et traitée, mais je m'en fous de sa sortie (une fois que je sais que le serveur a reçu la commande) qu'elle ressemble à la classe Apache HttpClient. –

4

Vous pourriez envisager de vous simplifier la vie en utilisant l'un des clients HTTP de niveau supérieur disponibles en Java, par exemple HttpURLConnection. Vous devrez toujours gérer la construction du corps de la requête multipart/form-encoded, mais cela enlèvera une grande partie des tracas de la construction d'une requête bien formée et rapproche votre code du vrai domaine.