abcde5342376 发表于 2013-2-5 09:05:25

使用java程序发送post请求给servlet

我们需要完成的工作其实很简单,就是将一个文件流以post的方式发送到服务器或者也可以是客户端。
java发送请求是通过HttpURLConnection来实现的:
import java.io.BufferedReader;import java.io.DataOutputStream;import java.io.File;import java.io.FileReader;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLEncoder;public class SendPostRequest {static String sessionId = "";public static void main(String[] args) throws Exception {// TODO Auto-generated method stubURL url = new URL("http://localhost:8080/GetRequest/");HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setDoOutput(true);// Read from the connection. Default is true.connection.setDoInput(true);// Set the post method. Default is GETconnection.setRequestMethod("POST");// Post cannot use caches// Post 请求不能使用缓存connection.setUseCaches(false);// This method takes effects to// every instances of this class.// URLConnection.setFollowRedirects是static函数,作用于所有的URLConnection对象。// connection.setFollowRedirects(true);// This methods only// takes effacts to this// instance.// URLConnection.setInstanceFollowRedirects是成员函数,仅作用于当前函数connection.setInstanceFollowRedirects(false);// Set the content type to urlencoded,// because we will write// some URL-encoded content to the// connection. Settings above must be set before connect!// 配置本次连接的Content-type,配置为application/x-www-form-urlencoded的// 意思是正文是urlencoded编码过的form参数,下面我们可以看到我们对正文内容使用URLEncoder.encode// 进行编码connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");// 连接,从postUrl.openConnection()至此的配置必须要在connect之前完成,// 要注意的是connection.getOutputStream会隐含的进行connect。connection.connect();Long sendTime = System.currentTimeMillis();DataOutputStream out = new DataOutputStream(connection.getOutputStream());// 要传的参数String content = URLEncoder.encode("username", "UTF-8") + "=" + URLEncoder.encode("XXX", "UTF-8");content += "&" + URLEncoder.encode("password", "UTF-8") + "=" + URLEncoder.encode("XXXX", "UTF-8");content += "&" + URLEncoder.encode("sendTime", "UTF-8") + "=" + URLEncoder.encode(sendTime.toString(), "UTF-8");//读海量文件StringBuilder postStrBuf = new StringBuilder();for (int i = 0; i < 1; i++) {File file = new File("E:/toodou_work/yuliang.csv");BufferedReader reader = null;String postStr = null;reader = new BufferedReader(new FileReader(file));while ((postStr = reader.readLine()) != null) {postStrBuf.append(postStr);}}content = content + "&" + URLEncoder.encode("file", "UTF-8") + "=" + URLEncoder.encode(postStrBuf.toString(), "UTF-8");// DataOutputStream.writeBytes将字符串中的16位的unicode字符以8位的字符形式写道流里面out.writeBytes(content);out.flush();out.close(); // flush and close//Get Session IDString key = "";if (connection != null) {for (int i = 1; (key = connection.getHeaderFieldKey(i)) != null; i++) {if (key.equalsIgnoreCase("set-cookie")) {sessionId = connection.getHeaderField(key);sessionId = sessionId.substring(0, sessionId.indexOf(";"));}}}connection.disconnect();}}
接受post请求的一端,为了便于大家理解,就作为服务器吧,上面的代码则作为客户端好了。服务器这边我们需要写一个servlet,这个servlet是服务器启动,就立即启动的,这个是在web.xml文件里配置,我想大家是会的。服务器端的代码如下所示:
import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class GetRequestServlet */public class GetRequestServlet extends HttpServlet {private static final long serialVersionUID = 1L;//private static final Logger log = Logger.getLogger(GetRequestServlet.class);/** * @see HttpServlet#HttpServlet() */public GetRequestServlet() {super();// TODO Auto-generated constructor stub}/** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String file = request.getParameter("file");String sendTimeStr = request.getParameter("sendTime");long sendTime = Long.valueOf(sendTimeStr);response.setContentType("text/html;charset=utf-8");System.out.println(file);System.out.println("当前从发送到接受所用时间为:" + (System.currentTimeMillis() - sendTime));//PrintWriter out = response.getWriter();//out.println("hello world!" + file);}/** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}} 大家运行会发现,如果读取的文件不大,是可以将读取的文件流输送到服务器的,但是一旦文件变大,就会出错。这一方面可能是post后缀的内容大小是被限定的吧,我是这么想的,如果有错误请纠正。
页: [1]
查看完整版本: 使用java程序发送post请求给servlet