Avatar billede kornfreak Nybegynder
29. januar 2002 - 07:43 Der er 15 kommentarer og
1 løsning

Extract header og post!

Jeg har 2 spørgsmål.

Det ene er at jeg skal bruge en function der henter values fra querystring functioner allä Request.QueryString("navn") i asp, jeg får headeren via :
Input  = new BufferedReader(new InputStreamReader(MySocket.getInputStream()));

Functionen skal virke i stil med

public void ExtraxtHeader(Input.readLine(), "Varibel jeg vil finde")
{
  find variablen i headeren og returnere valuen efter =
}


Det var det ene, det andet er hvordan henter jeg variabler fra POST ? ..jeg har læst noget om at post DATA bliver sendt med i headeren efter en ny linie. Men jeg kan ikke få den til at vise de data'er jeg sender.
Avatar billede disky Nybegynder
29. januar 2002 - 11:27 #1
ligegyldigt om data er sendt via en querystring eller via en post så skal du gøre følgende

String data=request.getParameter("NavnPaVariabel");

Hvis variablen ikke findes er data==null, det skal du så undersøge inden du begynder at bruge den, da du ellers for en exception.

Der er slet ingen grund til at lave det med inputstream du har gang i.

Håber det var svar nok på begge spørgsmål.
Eller bare spørg igen.
Avatar billede kornfreak Nybegynder
29. januar 2002 - 15:17 #2
Disky >> Du snakker om servletter nu ik ? ..det er en en applet :)
Avatar billede kornfreak Nybegynder
29. januar 2002 - 22:17 #3
Hm, really need this answear!
Avatar billede elster Nybegynder
31. januar 2002 - 10:47 #4
Det er rigtigt at data sendt via POST er placeret efter headerne og én blank linie. Sender du f.eks. nedenstående formular til din server:
------------------------------------
<FORM METHOD=POST ACTION="/link">
<INPUT TYPE="text" NAME="ord">
</FORM>
------------------------------------
Vil noget lignende nedenstående blive modtaget af din server:
------------------------------------
POST /link HTTP/1.0
User-Agent: Browser & version
Content-Length: 11
AndenHeader: xxx

ord=fodbold
------------------------------------

Grunden til at du ikke kan få den til at vise det der sendes, er sikkert at du prøver at læse disse POST data indtil EOF opstår. Så virker det nemlig ikke. Browseren sender nemlig ikke en EOF byte efter POST data. Når du skal læse POST data må du KUN læse det antal bytes klienten har angivet i "Content-Length" headeren (i dette tilfælde 11). "Content-Length" headeren angiver hvor mange bytes det overførte formular data fylder. Prøver du f.eks. her at læse den tolvte byte, vil du blot blive hængende i dette kald.
Avatar billede kornfreak Nybegynder
01. februar 2002 - 05:07 #5
elster >> Kan du komme med nogen eksempler på hvordan jeg laver det ?
Avatar billede disky Nybegynder
03. februar 2002 - 20:38 #6
Det har ikke noget specifikt med servlets at gøre.

Men hvorfor vil du læse det på den mere eller mindre besværlige måde ?

hvis du skal have overført parameter til en Applet kan du gøre det på en helt anden måde, ved at parse de applets parameterer findes.

DU kan ikke få en applet til at parse en form, da en applet er client side, og formen bliver sendt til serveren
Avatar billede kornfreak Nybegynder
03. februar 2002 - 23:04 #7
Min applet er serversite ? ... jeg er kommet lidt videre med dette:

          boolean test = true;
            String str;
            int last;
            InputStreamReader isr = new InputStreamReader(MySocket.getInputStream());
            Reader in = new BufferedReader(isr);

            StringBuffer buf = new StringBuffer();
            int ch;
            while(test)
            {
                ch = in.read();
                last = ch;
                System.out.println(ch + " - "  + (char)ch);
            }
            in.close();
        str = buf.toString();
            System.out.println(str);

Den printer post data ud, men den kører så også en uendelig løkke.
Avatar billede kornfreak Nybegynder
03. februar 2002 - 23:06 #8
Der skal lige siges at min applet er en socketserver der står og lytter på en port så jeg skal kunne behandle requests via browseren både get og post!
Avatar billede elster Nybegynder
09. februar 2002 - 12:47 #9
kornfreak >>
Du kan benytte nedenstående klasse (HttpRequest). I constructoren tager den en BufferedReader, og udtrækker derefter automatisk alle informationer om forespørgslen fra browseren. Og den virker endda både med POST og GET metoden:

-------------------------------------------------------------------

import java.io.*;
import java.net.*;
import java.util.*;

public class HttpRequest
{
    private BufferedReader  in ;
    private    Hashtable      info;
    private    Properties        query;
   
    public HttpRequest(BufferedReader in) {
        info = new Hashtable();
        query = new Properties();
        this.in = in;
        start();       
    }
   
    public void start(){
        getURLInfo(); // read the request from the client
        extractQuery(); // Extract the query string if possible
    }
   
    /***    Routine to process the input from the Connection .Save all lines to Property list INFO
    ****    if POST detected , save all data from client in "Query_String" Parameter ***/
    private void  getURLInfo() {
            try{
                while (saveToProperties(in.readLine()) != null) {}
            }catch(IOException e) {}
            if(containsFieldKey("POST")) {
                savePostData(); 
            }
            else {
                // Examine for query string in
                String queryPart = getQueryStringPart();
                if (queryPart != null)
                    info.put("QUERY_STRING",queryPart);               
            }
    }
   
    /***    save all input lines from the browser for possible use in the INFO Properties table ***/
   
    private String saveToProperties (String line) {
        System.out.println(line);
            if (line.length() ==0) return (String)null;
            String s = null;
            StringTokenizer tok = new StringTokenizer(line,":");
            if ( tok.hasMoreTokens()) s = tok.nextToken();
            if ( tok.hasMoreTokens()){
                String q = tok.nextToken("\n").trim();
                if (q.startsWith(":"))
                    q = q.substring(1).trim();
                info.put(s,q);
            }
            else {
                tok = new StringTokenizer(line," ");
                s = tok.nextToken();
                info.put(s,tok.nextToken("\n").trim());
            }
            return "OK";
    }
   
    /*** save the data from a POST command to the "Query_String" parameter in the INFO properties list ***/
    private void savePostData(){
            String s = null;
            if ( containsFieldKey("Content-length") )
                s = (String)getField("Content-length");
            else
                s = (String)getField("Content-Length");
            int count = new Integer(s.trim()).intValue();
            if(count ==0) return; //nada
            byte[] ch = new byte[count];
            for ( int i = 0; i<count;i++)
                try{
                    ch[i] = (byte)in.read();
                }catch(IOException e){}
            info.put("QUERY_STRING",new String(ch));           
    }
   
    /**
    * Returns the part of the URL that makes up the query string,
    * or null if not found
    */
    private String getQueryStringPart() {
        StringTokenizer tok = new StringTokenizer(getField("GET"));
        String requestedFile = tok.nextToken(); // get the URL       
        // Strip away possible query string
        tok = new StringTokenizer(requestedFile,"?");
        tok.nextToken();
        if (tok.hasMoreTokens())
            return tok.nextToken();
        return null;
    }
   
    /**    extract the Query_String form the Info Properties. break them up into
    ***    <key><value> pairs and store to Query Property list **/
    private void extractQuery(){
        if (!info.containsKey("QUERY_STRING")) {
        return;
        }
            int pos = 0;
            String name = null;
            StringBuffer parse;
            StringBuffer buff = new StringBuffer();
            parse = new StringBuffer((String)info.get("QUERY_STRING"));   
            while (pos < parse.length()) {
            switch ( parse.charAt(pos) ) {
                case '=' :
                    name = buff.toString();
                    buff.setLength(0);
                    break;
                case '+' :
                    buff.append(" ");
                    break;
                case '%' :
                    String s = (String)info.get("QUERY_STRING");
                    s = s.substring(pos+1,pos+3);
                    Integer I = new Integer("0");
                    int i = I.parseInt(s,16);
                    buff.append((char)i);
                    pos +=2;
                    break;
                case '\n':
                case '&' :
                    query.put(name, buff.toString());
                    buff.setLength(0);
                    break;
                default :
                    buff.append((char)parse.charAt(pos));
            }
            pos++;
        }
        query.put( name, buff.toString() );
    }
   
    public  boolean containsFieldKey(String key) {
        if (info.containsKey((String)key))
            return true;
        return false;
    }
   
    /*** the following three methods are usered to extract info from INFO about this connection ***/
    public  String getField(String field) {
        if (info.containsKey((String)field))
        return(String)info.get(field);
        else
        return "Invalid";
    }   
   
    /**
    * Returns the request method
    */
    public String getRequestMethod() {
        String method = "GET";
            if(containsFieldKey("POST"))
                method = "POST";
        return method;
    }
   
    /**
    * Returns the requested URL
    */
    public  String getRequestedURL() {
        String method = getRequestMethod();
        StringTokenizer tok = new StringTokenizer(getField(method));
        String requestedFile = tok.nextToken(); // get the URL       
        // Strip away possible query string
        tok = new StringTokenizer(requestedFile,"?");
        return tok.nextToken();
    }
   
    /**
    * Returns the query string field with this name.
    */
    public String getQueryField(String s) {
        if (containsQueryFieldKey(s))
        return (String)query.getProperty(s);
        return (String)null;
    }
   
    /**
    * Returns whether there exists a query string field with this name.
    */   
    public  boolean containsQueryFieldKey(String key) {
        if (query.containsKey((String)key))
            return true;
        return false;
    }
}


-------------------------------------------------------------------
Avatar billede elster Nybegynder
09. februar 2002 - 12:57 #10
Kode eksempel:
----------------------------------------------------------

// Acceptér en klient
Socket clientSocket = serverSocket.accept();
// Opret BufferedReader objekt
BufferedReader input  = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
// Læs request fra browser (POST eller GET)
HttpRequest request = new HttpRequest(input);

// Hent den forespørgsels metoden ("POST" eller "GET")
String requestMethod = request.getRequestMethod();
// Hent den forespurgte URL
String requestedURL = request.getRequestedURL();
// Hent beskrivelse af klientens browser
String browser = request.getField("User-Agent");
// Hent værdi af formular-felt (sendt med GET eller POST)
String ord = request.getQueryField("ord");

----------------------------------------------------------

Du skal selvfølgelig også lige lave et HTML dokument til at afsende forespørgslen til din server. Prøv f.eks. med nedenstående formular (forudsat at din server lytter på port 8080):

<FORM METHOD=GET ACTION="http://127.0.0.1:8080/mappe/test">
<INPUT TYPE="text" NAME="ord">
<INPUT TYPE="submit">
</FORM>
Avatar billede kornfreak Nybegynder
13. februar 2002 - 21:33 #11
Lige det jeg manglede :)
Avatar billede elster Nybegynder
18. februar 2002 - 13:01 #12
koRnfreak >>
Fik du det ikke til at virke? Eller giver det bare ikke point :)
Avatar billede macdut Nybegynder
18. februar 2002 - 13:23 #13
Jeg har da acceptetet?!!? ...hvad hulen sker der her....
Avatar billede kornfreak Nybegynder
18. februar 2002 - 13:23 #14
Nu forstår jeg bedre...det var min kærestes konto der var logget ind LOL..sorry :)
Avatar billede elster Nybegynder
18. februar 2002 - 16:23 #15
OK, mange tak.
Avatar billede macdut Nybegynder
19. februar 2002 - 17:24 #16
HaHa...*Gg* KÆRESTE kl. 13,23?? Næææh nej...der var d slut!!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester