2010-08-23 3 views
1

Je travaillais sur HTTP post en utilisant java et j'ai rencontré un comportement de flux bizarre. Voilà ce qui est arrivé:Java HTTP Post - comportement de flux bizarre

Func() { 
    String data = “MyMessage” 
    URL url = new URL("http://edsall:8080"); 
    URLConnection conn = url.openConnection(); 
    conn.setDoOutput(true); 

    OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); 
    BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); 

    wr.write(data); 
    wr.flush();   

    // Get the response 
    String line; 
    while ((line = rd.readLine()) != null) { 
    } 

    wr.close(); 
    rd.close(); 
} 

Request recvd by the server: 
POST/HTTP/1.1 
User-Agent: Java/1.6.0_20 
Host: edsall:8080 
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 
Connection: keep-alive 
Content-type: application/x-www-form-urlencoded 
Content-Length: 0 

Observons que la longueur du contenu est toujours 0. Dans un premier temps, je ne pouvais pas comprendre quel était le problème. Enfin, le ré-arrangement suivant du code a fait l'affaire:

Func() { 
    … 
    OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); 
    wr.write(data); 
    BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
    … 
} 

Je ne suis pas capable de comprendre cela clairement. Comment l'ouverture d'une poignée vers le flux d'entrée affecte-t-elle le flux de sortie?

Répondre

1

L'ouverture du flux d'entrée (ou l'interrogation de l'état) "valide" la requête —, c'est-à-dire que la demande est envoyée au serveur. Je ne suis pas sûr de ce qu'il est advenu des données que vous avez écrites dans le flux de sortie (j'aurais espéré une exception si ce n'est pas réellement envoyé), mais l'en-tête content-length est envoyé (avec un longueur de zéro) lorsque getInputStream() est appelée.

La totalité de la requête doit être envoyée avant d'accéder à une partie de la réponse. C'est le comportement normal URLConnection.

0

Retirez le flush et placez wr.close() à sa place.