HttpClient4 Post XML到一個服務器上
如今網上介紹的HttpClient基本上全是3.x版本的內容,HttpClient4的API變化相對3已經變化很大,對HttpClient4作了簡單的研究後,完成了一個HttpClient4 Post XML功能。
對於POST方式,最早想到的就是表單提交了,POST XML天然想到的就是定義一個變量名,好比叫xmldata,而後將這個參數的值POST出去,在服務端接收的時候,天然也是經過 requset.getParameter("xmldata")方式來接收。
如今我在這裏要作的不是經過上面的方式,而是不指定參數名來Post,實際上就是將一個流寫入請求。
下面是具體的實現方式:
一、參數名方式POST XML數據
import org.apache.http.*;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.client.*;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.*;
/**
* 經過指定參數名的方式POST XML
*
* @author leizhimin 2010-7-8 22:29:28
*/
public
class TestPost {
public
static
void main(String[] args)
throws IOException {
HttpClient httpclient =
new DefaultHttpClient();
HttpPost httppost =
new HttpPost(
"http://localhost:8080/waitsrv/GenXmlServlet");
List<NameValuePair> formparams = new ArrayList<NameValuePair>();
formparams.add(new BasicNameValuePair("xmldate", "<html>你好啊啊</html>"));
formparams.add(new BasicNameValuePair("info", "xxxxxxxxx"));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, "GBK");
// entity.setContentType("text/xml; charset=GBK");
httppost.setEntity(entity);
HttpResponse response = httpclient.execute(httppost);
HttpEntity resEntity = response.getEntity();
InputStreamReader reader = new InputStreamReader(resEntity.getContent(), "ISO-8859-1");
char[] buff = new char[1024];
int length = 0;
while ((length = reader.read(buff)) != -1) {
System.out.println(new String(buff, 0, length));
httpclient.getConnectionManager().shutdown();
}
}
}
二、不指定參數名的方式來POST數據
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.entity.*;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
/**
* 不指定參數名的方式來POST數據
*
* @author leizhimin 2010-7-8 3:22:53
*/
public
class TestPostXml {
public
static
void main(String[] args)
throws IOException {
HttpClient httpclient =
new DefaultHttpClient();
HttpPost httppost =
new HttpPost(
"http://localhost:8080/waitsrv/GenXmlServlet");
StringEntity myEntity = new StringEntity("<html>你好啊啊</html>", "GBK");
httppost.addHeader("Content-Type", "text/xml");
httppost.setEntity(myEntity);
HttpResponse response = httpclient.execute(httppost);
HttpEntity resEntity = response.getEntity();
InputStreamReader reader = new InputStreamReader(resEntity.getContent(), "ISO-8859-1");
char[] buff = new char[1024];
int length = 0;
while ((length = reader.read(buff)) != -1) {
System.out.println(new String(buff, 0, length));
}
httpclient.getConnectionManager().shutdown();
}
}
服務端接收方式:
package com;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
/**
* 接收XLM請求
*
* @author leizhimin 2010-7-8 1:02:42
*/
public
class GenXmlServlet
extends HttpServlet {
protected
void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// String xml = req.getParameter("xmldata");
resp.setContentType(
"text/xml");
resp.setCharacterEncoding(
"GBK");
PrintWriter out = resp.getWriter();
// out.println(xml);
// System.out.println(xml);
System.out.println(
"----------------------");
InputStreamReader reader =
new InputStreamReader(req.getInputStream(),
"GBK");
char[] buff =
new
char[1024];
int length = 0;
while ((length = reader.read(buff)) != -1) {
String x =
new String(buff, 0, length);
System.out.println(x);
out.print(x);
}
}
protected
void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType(
"text/html");
PrintWriter out = resp.getWriter();
out.println(
"<html>");
out.println(
"<head>");
out.println(
"<title>Hello World!</title>");
out.println(
"</head>");
out.println(
"<body>");
out.println(
"<h1>Hello World!!</h1>");
out.println(
"</body>");
out.println(
"</html>");
}
}
web.xml
<?
xml
version
="1.0"
encoding
="UTF-8"
?>
<
web-app
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_2_5.xsd"
version
="2.5"
>
<
servlet
>
<
servlet-name
>GenXmlServlet
</
servlet-name
>
<
servlet-class
>com.GenXmlServlet
</
servlet-class
>
</
servlet
>
<
servlet-mapping
>
<
servlet-name
>GenXmlServlet
</
servlet-name
>
<
url-pattern
>/GenXmlServlet
</
url-pattern
>
</
servlet-mapping
>
</
web-app
>
三、在2的基礎,上改成單線程重用鏈接模式
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.SingleClientConnManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.entity.*;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
/**
* 不指定參數名的方式來POST數據,單線程重用鏈接模式
*
* @author leizhimin 2010-7-8 3:22:53
*/
public
class TestPostXml2 {
public
static
void main(String[] args)
throws IOException {
SingleClientConnManager sccm =
new SingleClientConnManager();
HttpClient httpclient =
new DefaultHttpClient(sccm);
// HttpGet httpget = new HttpGet(urisToGet[i]);
// HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost =
new HttpPost(
"http://localhost:8080/waitsrv/GenXmlServlet");
StringEntity myEntity = new StringEntity("<html>你好啊啊</html>", "GBK");
httppost.addHeader("Content-Type", "text/xml");
httppost.setEntity(myEntity);
HttpResponse response = httpclient.execute(httppost);
HttpEntity resEntity = response.getEntity();
InputStreamReader reader = new InputStreamReader(resEntity.getContent(), "ISO-8859-1");
char[] buff = new char[1024];
int length = 0;
while ((length = reader.read(buff)) != -1) {
System.out.println(new String(buff, 0, length));
}
httpclient.getConnectionManager().shutdown();
}
}