9
votes

Lecture des données de poste du formulaire HTML envoyé à ServerSocket

J'essaie d'écrire une application Server la plus simple possible dans Java, affichant le formulaire HTML avec une entrée Texarea, qui, après avoir soumis, me donne la possibilité d'analyser XML saisi dans ce Texarea. Pour l'instant, je construisai un serveur basé sur des serversocket simple comme celui-là:

gets = POST / HTTP/1.1


2 commentaires

Salut qqryq. J'ai le même code. Avez-vous compris comment lire le corps de la poste? J'ai essayé de courir seconde pendant le cycle en tant que Cygri, mais des méthodes intrigues d'entrée.Read ou bufferedreader.Readline bloque mon fil. Comment lisez-vous le corps de poste?


Oh, j'ai réalisé! J'ai besoin de lire "Longueur de contenu:" en-tête et faites-le faire du cycle à cette longueur.


5 Réponses :


3
votes

Les données postales ne sont pas dans la première ligne. Imprimez toutes les lignes et vous verrez. C'est en fait immédiatement après une ligne vide.


1 commentaires

Ok, mais comment puis-je tout imprimer si j'ai 'alors que (! string.equals ("")) {' déclaration? Ignorer la première ligne vide et arrêter sur un autre?



6
votes

Une demande de post HTTP typique ressemble à ceci:

POST / HTTP/1.1
Host: www.example.com
Accept: text/html,*/*;q=0.5
User-Agent: BrowserName/1.0
Referer: http://www.example.com/
Content-type: application/x-www-form-urlencoded; charset=utf-8

foo=1&bar=2


2 commentaires

Ok, mais comment arriver à cette donnée quand mon moment s'arrête sur la première ligne vide?


Réécrivez votre boucle tandis que cela ne s'arrête pas sur la première ligne. Avez-vous besoin d'aide avec cela?



9
votes

Ceci est ma mise en œuvre pour lire le corps de poste: xxx pré>

Je le fais pour Android et PublierProgres code> dans mon cas signifie: p>

protected void onProgressUpdate(String... values) {
        super.onProgressUpdate(values);
        instance.logTextView.append(values[0]);
    }


1 commentaires

Fondamentalement, la première lecture devrait choisir toutes les lignes d'en-tête. Une fois l'en-tête de longueur de contenu doit être utilisé pour connaître le montant initial, combien de caractères doivent être lus, puis simplement aller de l'avant sur le traitement ultérieur.



21
votes

Comme il y a une ligne vierge après les en-têtes, voici mon moyen relativement simple d'obtenir les données de la charge postale, après avoir lu les informations d'en-tête à l'aide de la méthode readline () code> méthode de bufferedreader.

//socket is an instance of Socket
InputStream is = socket.getInputStream();
InputStreamReader isReader = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isReader);

//code to read and print headers
String headerLine = null;
    while((headerLine = br.readLine()).length() != 0){
        System.out.println(headerLine);
    }

//code to read the post payload data
StringBuilder payload = new StringBuilder();
        while(br.ready()){
            payload.append((char) br.read());
            }
System.out.println("Payload data is: "+payload.toString())


2 commentaires

Merci beaucoup ... c'est ce que je cherche. . . .


Cela a bien fonctionné. Mais il retourne non seulement des données mais une description complète de la demande postale. Y a-t-il un moyen d'obtenir uniquement des données. ou nous devons faire la ficelle de manière conventionnelle?



3
votes

de Ce -

Nous devons d'abord Lisez les en-têtes, puis lisez à nouveau à partir de la même buffereDreader à l'aide de la longueur du contenu réel fourni dans la section d'en-tête: - p>

BufferedReader in = new BufferedReader(new InputStreamReader(is));
String line;
line = in.readLine();
while ((line = in.readLine()) != null && (line.length() != 0)) {
    System.out.println("HTTP-HEADER: " + line);
    if (line.indexOf("Content-Length:") > -1) {
    postDataI = new Integer(
        line.substring(
            line.indexOf("Content-Length:") + 16,
            line.length())).intValue();
    }
}
String postData = "";
// read the post data
if (postDataI > 0) {
    char[] charArray = new char[postDataI];
    in.read(charArray, 0, postDataI);
    postData = new String(charArray);
}


0 commentaires