2011-01-24 3 views
1

J'envoie une requête POST à ​​mon serveur AppEngine. Le HttpServletRequest me dit:AppEngine: comment voir le contenu d'une requête POST

POST /connexionDeconnexion HTTP/1.1 
User-Agent: Java/1.6.0_20 
Host: localhost:8888 
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 
Connection: keep-alive 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 25 

J'ai envoyé le monde "HelloHelloHelloHelloHello", ce qui est correct selon le Content-Length. Cependant, je ne sais pas comment le récupérer. Pouvez-vous m'expliquer?

Répondre

4

Comme Jigar a dit que vous pouvez utiliser request.getParameter(). Cela fonctionne si vous soumettez vraiment le formulaire ou spécifiez le paramètre en tant qu'argument d'URL (http: // myhost/mypath? Myparam = myvalue).

Si vous envoyez vos données en tant que corps POST, vous devez les lire dans son corps, c'est-à-dire récupérer le flux d'entrée en appelant request.getInputStream(), puis lire ce flux.

+0

'request.getParameter()' fonctionnera également si vous postez le chemin que j'ai suggéré. –

+0

Et si je voudrais envoyer une image et une chaîne, que dois-je faire? Un objet par paramètre? Deux demandes? – g123k

1

Vous devez indiquer le nom et la valeur du paramètre, puis extraire param de l'objet httpRequest.

request.getParameter("paramName");

Mise à jour

côté client

String param = "value"; 
File textFile = new File("/path/to/file.txt"); 
File binaryFile = new File("/path/to/file.bin"); 
String boundary = Long.toHexString(System.currentTimeMillis()); // Just generate some unique random value. 

URLConnection connection = new URL(url).openConnection(); 
connection.setDoOutput(true); 
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); 
PrintWriter writer = null; 
try { 
    OutputStream output = connection.getOutputStream(); 
    writer = new PrintWriter(new OutputStreamWriter(output, charset), true); // true = autoFlush, important! 

    // Send normal param. 
    writer.println("--" + boundary); 
    writer.println("Content-Disposition: form-data; name=\"param\""); 
    writer.println("Content-Type: text/plain; charset=" + charset); 
    writer.println(); 
    writer.println(param); 

    // Send text file. 
    writer.println("--" + boundary); 
    writer.println("Content-Disposition: form-data; name=\"textFile\"; filename=\"" + textFile.getName() + "\""); 
    writer.println("Content-Type: text/plain; charset=" + charset); 
    writer.println(); 
    BufferedReader reader = null; 
    try { 
     reader = new BufferedReader(new InputStreamReader(new FileInputStream(textFile), charset)); 
     for (String line; (line = reader.readLine()) != null;) { 
      writer.println(line); 
     } 
    } finally { 
     if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {} 
    } 

    // Send binary file. 
    writer.println("--" + boundary); 
    writer.println("Content-Disposition: form-data; name=\"binaryFile\"; filename=\"" + binaryFile.getName() + "\""); 
    writer.println("Content-Type: " + URLConnection.guessContentTypeFromName(binaryFile.getName()); 
    writer.println("Content-Transfer-Encoding: binary"); 
    writer.println(); 
    InputStream input = null; 
    try { 
     input = new FileInputStream(binaryFile); 
     byte[] buffer = new byte[1024]; 
     for (int length = 0; (length = input.read(buffer)) > 0;) { 
      output.write(buffer, 0, length); 
     } 
     output.flush(); // Important! Output cannot be closed. Close of writer will close output as well. 
    } finally { 
     if (input != null) try { input.close(); } catch (IOException logOrIgnore) {} 
    } 
    writer.println(); // Important! Indicates end of binary boundary. 

    // End of multipart/form-data. 
    writer.println("--" + boundary + "--"); 
} finally { 
    if (writer != null) writer.close(); 
} 

Voir aussi

+0

Merci pour votre réponse. Si j'ai envoyé cette chaîne: writer = new OutputStreamWriter (conn.getOutputStream()); \t \t writer.write ("HelloHelloHelloHelloHello"); Quel est le paramètre? Lors de l'utilisation du mode débogage, le champ _parameters est null. Est-ce normal ? – g123k

+0

vérifier mise à jour .............. –

+0

Merci pour votre réponse. Si je souhaite envoyer une photo (une voiture) et une chaîne ("Chevrolet"), dois-je envoyer 2 demandes avec 2 paramètres différents? Je sais que ma question est stupide mais le document sur appengine est très petit – g123k

Questions connexes