关键字:HTTP POST URL-encode(困扰我5天的问题)
2006-05-31 10:41
323 查看
事情的起因得从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
.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
------------------------------------------------------------------------
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
.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
------------------------------------------------------------------------
相关文章推荐
- Android Webview posturl 传参被encode问题
- 解决url中有空格 在encode的时候HttpURLConnection识别不了的问题
- GET、POST请求处理中文问题(用HttpURLConnection模拟发送请求)
- Android HttpUrlConnection 发送Post请求 PHP页面$_POST接收不到问题
- HttpUrlConnection post方法传递中文乱码问题
- httpurlconnection post 和GET 分别传递2个参数给后台,返回JSON 解决乱码问题
- 用HttpURLConnection模拟post请求,不post的问题
- HttpURLConnection---GET请求秒变POST请求问题
- HttpUrlConnection post方法传递中文乱码问题
- Android网络通信技术之基于HttpURLConnection的POST/GET传值问题
- 关于httpclient3 postMethod乱码问题解决方法
- Java客户端HttpClient和HttpURLConnection修改请求头Host问题
- 关于UrlHttpConnection.setRequestProperty()的调用顺序问题的验证
- http post 接收数据 和 乱码问题
- 使用HttpURlConnection 发送POST请求上传文件(带参数)
- android HttpURLConnection.getInputStream()问题
- 有关HttpURLConnection充当代理转发Session丢失的问题
- 处理 httprequest post 编码问题
- HTTP method POST is not supported by this URL
- HttpClient POST的中文编码问题