用Delphi的TIdHttp控件发起POST请求和Java的Servlet响应
来源:互联网 发布:虚拟天文馆软件 编辑:程序博客网 时间:2024/06/05 21:12
使用Delphi的TIdHttp控件发起一个POST请求很简单,定义一个TStringList实例,往上面添加参数就行:
procedure TForm1.Button1Click(Sender: TObject);
var
HttpClient: TIdHttp;
ParamList: TStringList;
begin
HttpClient := TIdHttp.Create();
ParamList := TStringList.Create;
ParamList.Add('user=pan');
ShowMessage(HttpClient.Post('http://192.168.0.105:8080/Servlets/Submit', ParamList));
end;
运行代码,使用WireShark抓包工具看到这个POST请求发出来了,Content-Type是application/x-www-form-urlencoded,这种类型的意思是将参数打包成key-value的形式。
然后来看看服务端的Java代码:
public class Submit extends HttpServlet {
...
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().println("Hello Servlet, " + request.getParameter("user") + "!");
}
}
客户端收到Post的响应,就会把“Hello Servlet, pan!”这段文字显示出来了。
补充:
当post的参数值带中文时,会被编码为UTF8格式,例如POST方法的WIRESHARK抓包:
再看200 OK消息的抓包:
此时不能直接使用TIdHTTP.Post方法返回的字符串,而是要对其正确解码,否则读到的是乱码:
procedure TForm1.Button1Click(Sender: TObject);var HttpClient: TIdHttp; ParamList: TStringList; SS: TStringStream;begin SS := TStringStream.Create('', TEncoding.UTF8); HttpClient := TIdHttp.Create(); ParamList := TStringList.Create; ParamList.Add('action=测 试'); ParamList.Add('user=用 户'); HttpClient.Post('http://192.168.0.102:8080/HelloServlet/Submit', ParamList, SS); ShowMessage(SS.DataString);end;解决乱码问题的方法在于我们通过TStringStream将返回的字符流按UTF8解码。
补充2:当POST方法中有两个相同的参数名时,例如:
procedure TForm1.Button1Click(Sender: TObject);var HttpClient: TIdHttp; ParamList: TStringList; SS: TStringStream;begin SS := TStringStream.Create('', TEncoding.UTF8); HttpClient := TIdHttp.Create(); ParamList := TStringList.Create; ParamList.Add('action=测 试'); ParamList.Add('user=用 户1'); ParamList.Add('user=用 户2'); HttpClient.Post('http://192.168.0.100:8080/HelloServlet/Submit', ParamList, SS); ShowMessage(SS.DataString);end;
此时在服务器端如果仍然使用getParameter方法,则只能返回第一个值“用 户1”,需要使用getParameterValues方法:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stub//response.getWriter().println("Hello Servlet, " + request.getParameter("user") + "!");String[] user = request.getParameterValues("user"); response.getWriter().println("Hello Servlet, " + user[0] + " and " + user[1] + "!");}
此时客户端收到:
因此同名参数的两个值都读出来了。
- 用Delphi的TIdHttp控件发起POST请求和Java的Servlet响应
- JAVA发起Http和Https的POST/GET请求
- Delphi xe5 控件TIdhttp的用法post,get解决中文乱码问题
- Servlet的请求和响应
- servlet的请求和响应
- Java发起Post请求的两种方式
- C#发起GET和POST请求的主流方法
- java后台发起上传文件的post请求(http和https)
- 【Java EE】get和post请求|响应的编码过程
- [delphi]利用TidHTTP控件向目标PHP网页POST参数
- js的Ajax的POST请求和servlet的xml响应的交互
- js的Ajax的POST请求和servlet的json响应的交互
- 用HttpURLConnection在服务器端发起HTTP Post请求的例子
- 用HttpURLConnection在服务器端发起HTTP Post请求的例子
- js的Ajax的POST请求和servlet文本响应的交互
- Servlet 的post 请求
- JavaWeb---Servlet的请求和响应
- servlet ----post和get请求的区别
- erlang webtool 远程访问启动方式
- pat 1007 Maximum Subsequence Sum
- 简化 Ajax 和 Java 开发,第 3 部分: 基于 DOM、JavaScript 和 JSP 标记文件构建 UI 特性
- 简化 Ajax 和 Java 开发,第 4 部分: 使用 JSP 标记文件创建 JSF 样式的组件
- Category
- 用Delphi的TIdHttp控件发起POST请求和Java的Servlet响应
- 上移下移等操作的通用存储过程
- libnl-1.1 移植到ARM Linux
- http协议详解
- Allegro椭圆孔攻略
- 详细介绍jsp中action的功能
- How to setup Linux OpenVPN client
- SQL提供的主要数据类型(也称域类型)有:
- access2007数据库连接字符串