关键字: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

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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值