dodo

New Silk Road

关键字:HTTP POST URL-encode(困扰我5天的问题)

事情的起因得从Content-Type: application/x-www-form-urlencoded(用于发送name-value对)说起:)

Servlet can't get HttpServletRequest's Parameter ?

http://www.j2meforums.com/forum/index.php?topic=11249.msg55068#msg55068

I use Http POST method to connect to servlet, but the servlet can't get HttpServletRequest's Parameter.The req.getParameter("name") method always return NULL.The code is below.

Midlet:


package dodo;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;

import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;


public class POSTTest extends MIDlet {
   
        protected void startApp() throws MIDletStateChangeException {
        String message ="name="+URLEncoder.encode("dodo");
        System.out.println("encode String is "+message);
       
        try {
            HttpConnection con = (HttpConnection)Connector.open("http://127.0.0.1:8080/jsmartsales/ReverseServlet");
           
            //指定POST
            con.setRequestMethod(HttpConnection.POST);
            con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            con.setRequestProperty("Content-Language", "en-US" );
            con.setRequestProperty("Content-Length",Integer.toString(message.getBytes().length));
            DataOutputStream dos = con.openDataOutputStream();
            dos.write(message.getBytes());
            dos.flush();
            dos.close();
           
            DataInputStream in = con.openDataInputStream();
            int input;
            while((input = in.read())!=-1){
                System.out.print((char)input);
            }
            in.close();
            con.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    protected void pauseApp() {
    }
    protected void destroyApp(boolean arg0) throws MIDletStateChangeException   {
    }
}

Servlet

Code:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.net.URLDecoder;


public class ReverseServlet extends HttpServlet {

  protected void doPost(HttpServletRequest req, HttpServletResponse res)
  throws ServletException, IOException {
     
    res.setContentType("text/plain");
    PrintWriter out = res.getWriter();
    String s = req.getParameter("name");
   
    System.out.println("The name is"+s);
   
    out.println("success!");
  }
}

 

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

--------------------------------------------------
I use HTTPLook(sniffer software) to see what was send out, The Http Package is below:

---------start----------
POST /jsmartsales/ReverseServlet HTTP/1.1
IF-Modified-Since: 20 Jan 2001 16:19:14 GMT
Content-Type: application/x-www-form-urlencoded
User-Agent: Profile/MIDP-1.0 Configuration/CLDC-1.0
Content-Language: en-US
name:
User-Agent: UNTRUSTED/1.0
Host: 202.100.22.226:8080
Transfer-Encoding: chunked

9
name=dodo
0
--------------end----------------

I don't know the '9' and '0' come from?

 

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

Code:
Transfer-Encoding: chunked


Quote
I don't know the '9' and '0' come from?

They are part of the chunked mode!
But anyway remove the flush() calls in your code
and invoke getResponseCode() so you get rid of

Code:
name:



/ Lion

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

Thank you lion Wink.The question has puzzled me for five days.the result is just

Quote
remove the flush()

.
And why is it?

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

Quote
the result is just

Does this mean that your Servlet now can understand your urlencoded data?

How does the the HTTPlook output looks like now?

My intention was to try to get your code to NOT use chunked encoding since I expected that you use an old (pre 2.4) version of Servlet that doesn't handle HTTP/1.1 (and hence not understand chunked encoding)

/ Lion

PS
I couldn't resist to check what Servlet you are running...
Is seems to be Apache Tomcat 5.5 that corresponds tp Servlet 2.4 so now I don't
know... Please show the HTTPlook output...

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

Yes, Now the servlet can receive parameter.The HTTPLook output is below
-------------start------------
POST /jsmartsales/ReverseServlet HTTP/1.1
IF-Modified-Since: 20 Jan 2001 16:19:14 GMT
Content-Type: application/x-www-form-urlencoded
User-Agent: Profile/MIDP-1.0 Configuration/CLDC-1.0
Content-Language: en-US
Content-Length: 9
User-Agent: UNTRUSTED/1.0
Host: 202.100.22.226:8080

name=dodo
--------------end------------

--------------start-----------
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/plain;charset=ISO-8859-1
Content-Length: 10
Date: Mon, 05 Jun 2006 05:57:12 GMT

success!
--------------end--------------


and I use Tomcat 5.5.17

Thank u , Lion

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

Thank you for reporting the result.

I can see that,

1) The name: header disappered
2) The Content-length header appered
3) No more chunking...

/ Lion

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


阅读更多
个人分类: jSmartSales
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

关键字:HTTP POST URL-encode(困扰我5天的问题)

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭