HttpUrlConnection实现模拟POST表单传输
概述:有的时候我们需要从后台与其他系统交互数据。而其他系统提供的接口,也就是交互方式可能是这样的,提供一个URL,http://IP:port/servlet/Scan,告诉你参数名字是xml,参数内容是一个拼好的xml串。而且这个URL没有界面,用get方式传输,xml串又可能超出1024字节,这时候就需要用到后台POST方式传输参数。
本文简述HttpUrlConnection实现POST表单传输方式,并分析。
业务系统大致的代码:
1.准备工作
用Myeclipse创建一个web project,核心代码
package com.sgcc;
import java.io.IOException;
import java.util.Map;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class Abc extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
Map<String, String[]> map = req.getParameterMap();
Set set = map.keySet();
for (Object key : set) {
System.out.println("键:"+key+"值:"+map.get(key)[0]);
}
resp.sendRedirect("http://localhost:8080/User/");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<servlet>
<servlet-name>user</servlet-name>
<servlet-class>cn.itheima.Abc</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>user</servlet-name>
<url-pattern>/servlet/user</url-pattern>
</servlet-mapping>
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
2.HttpUrlConnection实现POST传输的代码
package com.sgcc.test;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import org.junit.Test;
public class TestUrl {
@Test
public void UrlConn() throws IOException{
URL url = new URL("http://localhost:8080/User/servlet/user");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("POST");// 提交模式
// conn.setConnectTimeout(10000);//连接超时 单位毫秒
// conn.setReadTimeout(2000);//读取超时 单位毫秒
urlConnection.setDoOutput(true);// 是否输入参数
urlConnection.setDoInput(true);
// String xmlData="xml=<?xml version=\"1.0\" encoding=\"UTF-8\" ?><root><BASE_DATA><APP_TYPE>SAP</APP_TYPE><ORG_NUM>00000000</ORG_NUM><OP_ID>0001</OP_ID><OP_USER>张三</OP_USER></BASE_DATA><META_DATAS><META_DATA><APP_CODE>SAPME21N_dingdan</APP_CODE><BUSI_NUM>业务流水号</BUSI_NUM></META_DATA></META_DATAS></root>";
String username="xml=zhang'abc'san&user=abc";
OutputStream outputStream = urlConnection.getOutputStream();
outputStream.write(username.getBytes());
outputStream.flush();
InputStream inputStream = urlConnection.getInputStream();
StringBuffer out = new StringBuffer();
byte[] b = new byte[4096];
for (int n; (n = inputStream.read(b)) != -1;) {
out.append(new String(b, 0, n));
}
System.out.println(out);
}
}
说明:
URL url = new URL("http://localhost:8080/User/servlet/user");
这里的地址,是目标系统的URL地址,我们就是要传参数到这个地址
这个URL里不加参数
String username="xml=zhang'abc'san&user=abc";
OutputStream outputStream = urlConnection.getOutputStream();
outputStream.write(username.getBytes());
这里的username字符串里,包含了两个参数,xml和user
实际在网络中传输的时候,结果是这样的
http://localhost:8080/User/servlet/user?xml=zhang'abc'san&user=abc
注意:1。URL和String username中不用写“?”问号
2.业务系统中遍历所有参数,可以用来观察传输的参数结果。
3.OutPutStream 中的write方法是往目标业务系统中写数据
4.InputSteam中是接收目标业务系统返回的数据。
下面的是TestUrl 的打印结果
下面的是Abc.java 的打印结果,遍历parameters
注释中的String xmlData就是参数名字为xml的xml字符串