如何使用HttpClient通过post来http post协议传输xmll

使用HttpClient发送Post Http请求 - lvjian700的博客 - ITeye技术网站
博客分类:
最近需要使用java对Rest接口进行调用,也就是直接使用java直接发送Post, Get, Put, Delete等请求。
印象中可以使用Apache Common下的HttpClient来做,结果HttpClient已经独立成了HttpComponent,编码方式也有所改变。
Google出来的很多文章多数是common-httpclient的方式,在新版本中不怎么适用。经过一番研究自己做了一下封装:
import java.io.IOE
import java.io.UnsupportedEncodingE
import java.util.ArrayL
import java.util.L
import java.util.M
import java.util.S
import org.apache.http.HttpE
import org.apache.http.HttpR
import org.apache.http.NameValueP
import org.apache.http.ParseE
import org.apache.http.client.ClientProtocolE
import org.apache.http.client.entity.UrlEncodedFormE
import org.apache.http.client.methods.HttpG
import org.apache.http.client.methods.HttpP
import org.apache.http.client.methods.HttpUriR
import org.apache.http.impl.client.DefaultHttpC
import org.apache.http.message.BasicNameValueP
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityU
import org.apache.log4j.L
public class HttpXmlClient {
private static Logger log = Logger.getLogger(HttpXmlClient.class);
public static String post(String url, Map&String, String& params) {
DefaultHttpClient httpclient = new DefaultHttpClient();
String body =
("create httppost:" + url);
HttpPost post = postForm(url, params);
body = invoke(httpclient, post);
httpclient.getConnectionManager().shutdown();
public static String get(String url) {
DefaultHttpClient httpclient = new DefaultHttpClient();
String body =
("create httppost:" + url);
HttpGet get = new HttpGet(url);
body = invoke(httpclient, get);
httpclient.getConnectionManager().shutdown();
private static String invoke(DefaultHttpClient httpclient,
HttpUriRequest httpost) {
HttpResponse response = sendRequest(httpclient, httpost);
String body = paseResponse(response);
private static String paseResponse(HttpResponse response) {
("get response from http server..");
HttpEntity entity = response.getEntity();
("response status: " + response.getStatusLine());
String charset = EntityUtils.getContentCharSet(entity);
(charset);
String body =
body = EntityUtils.toString(entity);
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
private static HttpResponse sendRequest(DefaultHttpClient httpclient,
HttpUriRequest httpost) {
("execute post...");
HttpResponse response =
response = httpclient.execute(httpost);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
private static HttpPost postForm(String url, Map&String, String& params){
HttpPost httpost = new HttpPost(url);
List&NameValuePair& nvps = new ArrayList &NameValuePair&();
Set&String& keySet = params.keySet();
for(String key : keySet) {
nvps.add(new BasicNameValuePair(key, params.get(key)));
("set utf-8 form entity to httppost");
httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
Map&String, String& params = new HashMap&String, String&();
params.put("name", name);
params.put("password", password);
String xml = HttpXmlClient.post(loginUrl, params);
Ruby发送请求的方式
还是喜欢Ruby的发http请求的方式,本来想在项目中集成Groovy, 时间关系直接用java实现了
require "net/http"
require "rexml/document"
require "iconv"
puts 'read test xml from file...'
file = File.open('task.xml')
doc = REXML::Document.new file
xml = doc.to_s #document to xml string
cov=Iconv.new('gbk', 'utf-8')#create encoder
encodedXml = cov.iconv(xml)#encoding zh_CN
puts encodedXml #display log
params= {}
params["msg"]=xml
#post http request
uri = URI.parse("http://localhost:8080/monitor/client/message")
1.upto 2 do |i|
puts 'send time:' + i.to_s
res = Net::HTTP.post_form(uri, params)
浏览 192839
witcheryne
浏览: 853952 次
来自: 西安
大神 想问的是 在一般的 登录 和 数据
加密这么两个方面( ...
dgwutao 写道我的rsa public_key和priv ...
我的rsa public_key和priveate_key不是 ...
亲,可不可以把你的把你的两个文件借我用一下。我这边不能用呀。可 ...
请问您这部分代码是只实现了命令解析的功能吗HTTP POST请求报文格式分析与Java实现文件上传 - 推酷
HTTP POST请求报文格式分析与Java实现文件上传
在开发中,我们使用的比较多的HTTP请求方式基本上就是GET、POST。其中GET用于从服务器获取数据,POST主要用于向服务器提交一些表单数据,例如文件上传等。而我们在使用HTTP请求时中遇到的比较麻烦的事情就是构造文件上传的HTTP报文格式,这个格式虽说也比较简单,但也比较容易出错。今天我们就一起来学习HTTP POST的报文格式以及通过Java来模拟文件上传的请求。
首先我们来看一个POST的报文请求,然后我们再来详细的分析它。
POST报文格式
POST /api/feed/ HTTP/1.1
Accept-Encoding: gzip
Content-Length: 225873
Content-Type: multipart/form- boundary=OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp
Connection: Keep-Alive
--OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp
Content-Disposition: form- name=&lng&
Content-Type: text/ charset=UTF-8
Content-Transfer-Encoding: 8bit
116.361545
--OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp
Content-Disposition: form- name=&lat&
Content-Type: text/ charset=UTF-8
Content-Transfer-Encoding: 8bit
--OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp
Content-Disposition: form- name=&images&; filename=&/storage/emulated/0/Camera/jdimage/1xh0e3yyfmpr2e35tdowbavrx.jpg&
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
这里是图片的二进制数据
--OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp--
这里我们提交的是经度、纬度和一张图片(图片数据比较长,而且比较杂乱,这里省略掉了)。
请求头分析
我们先看 报文格式中的第一行:
POST /api/feed/ HTTP/1.1 这一行就说明了这个请求的请求方式,即为POST方式,要请求的子路径为/api/feed/,例如我们的服务器地址为,然后我们的这个请求的完整路径就是
/api/feed/,最后说明了HTTP协议的版本号为1.1。
Accept-Encoding: gzip
Content-Length: 225873
Content-Type: multipart/form- boundary=OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp
Connection: Keep-Alive 这几个header的意思分别为服务器返回的数据需要使用gzip压缩、请求的内容长度为225873、内容的类型为&multipart/form-data&、请求参数分隔符(boundary)为OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp、请求的根域名为、HTTP连接方式为持久连接( Keep-Alive)。
其中这里需要注意的一点是分隔符,即boundary。
boundary用于作为请求参数之间的界限标识,例如参数1和参数2之间需要有一个明确的界限,这样服务器才能正确的解析到参数1和参数2。但是分隔符并不仅仅是boundary,而是下面这样的格式:-- + boundary。例如这里的boundary为 OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp,那么参数分隔符则为:
--OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp
不管boundary本身有没有这个&--&,这个&--&都是不能省略的。
我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP协议为无连接的协议);当使用Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后续请求时,Keep-Alive功能避免了建立或者重新建立连接。
如上图中,左边的是关闭Keep-Alive的情况,每次请求都需要建立连接,然后关闭连接;右边的则是Keep-Alive,在第一次建立请求之后保持连接,然后后续的就不需要每次都建立、关闭连接了,
启用Keep-Alive模式肯定更高效,性能更高,因为避免了建立/释放连接的开销 。
http 1.0中默认是关闭的,需要在http头加入&Connection: Keep-Alive&,才能启用Keep-Alive;http 1.1中默认启用Keep-Alive,如果加入&Connection: close &,才关闭。目前大部分浏览器都是用http1.1协议,也就是说默认都会发起Keep-Alive的连接请求了,所以是否能完成一个完整的Keep- Alive连接就看服务器设置情况。
请求实体分析
请求实体其实就是HTTP POST请求的参数列表,每个参数以请求分隔符开始,即-- + boundary。例如下面这个参数。
--OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp
Content-Disposition: form- name=&lng&
Content-Type: text/ charset=UTF-8
Content-Transfer-Encoding: 8bit
116.361545 上面第一行为--OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp,也就是--加上boundary内容,
最后加上一个换行 (这个换行不能省略),换行的字符串表示为&\r\n& 。第二行为Content-Disposition和参数名,这里的参数名为lng,即经度。
Content-Disposition就是当用户想把请求所得的内容存为一个文件的时候提供一个默认的文件名,这里我们不过多关注。第三行为
Content-Type,即 WEB 服务器告诉浏览器自己响应的对象的类型
,还有指定字符编码为UTF-8。
第四行是 描述的是消息请求(request)和响应(response)所附带的实体对象(entity)的传输形式,
简单文本数据我们设置为8bit,文件参数我们设置为binary就行
。然后添加两个换行之后才是参数的具体内容。例如这里的参数内容为116.361545。
注意这里的每行之间都是使用“\r\n”来换行的,最后一行和参数内容之间是两个换行。文件参数也是一样的格式,只是文件参数的内容是字节流。
这里要注意一下,普通文本参数和文件参数有如下两个地方的不同,因为其内容本身的格式是不一样的。
普通参数:
Content-Type: text/ charset=UTF-8
Content-Transfer-Encoding: 8bit
文件参数:
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
参数实体的最后一行是: --加上boundary加上--,最后换行,这里的 格式即为: --OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp--。
模拟文件上传请求
public static void uploadFile(String fileName) {
final String newLine = &\r\n&;
final String boundaryPrefix = &--&;
// 定义数据分隔线
String BOUNDARY = &========7d4a6d158c9&;
// 服务器的域名
URL url = new URL(&&);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 设置为POST情
conn.setRequestMethod(&POST&);
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
// 设置请求头参数
conn.setRequestProperty(&connection&, &Keep-Alive&);
conn.setRequestProperty(&Charsert&, &UTF-8&);
conn.setRequestProperty(&Content-Type&, &multipart/form- boundary=& + BOUNDARY);
OutputStream out = new DataOutputStream(conn.getOutputStream());
// 上传文件
File file = new File(fileName);
StringBuilder sb = new StringBuilder();
sb.append(boundaryPrefix);
sb.append(BOUNDARY);
sb.append(newLine);
// 文件参数,photo参数名可以随意修改
sb.append(&Content-Disposition: form-name=\&photo\&;filename=\&& + fileName
+ &\&& + newLine);
sb.append(&Content-Type:application/octet-stream&);
// 参数头设置完以后需要两个换行,然后才是参数内容
sb.append(newLine);
sb.append(newLine);
// 将参数头的数据写入到输出流中
out.write(sb.toString().getBytes());
// 数据输入流,用于读取文件数据
DataInputStream in = new DataInputStream(new FileInputStream(
byte[] bufferOut = new byte[1024];
int bytes = 0;
// 每次读1KB数据,并且将文件数据写入到输出流中
while ((bytes = in.read(bufferOut)) != -1) {
out.write(bufferOut, 0, bytes);
// 最后添加换行
out.write(newLine.getBytes());
in.close();
// 定义最后数据分隔线,即--加上BOUNDARY再加上--。
byte[] end_data = (newLine + boundaryPrefix + BOUNDARY + boundaryPrefix + newLine)
.getBytes();
// 写上结尾标识
out.write(end_data);
out.flush();
out.close();
// 定义BufferedReader输入流来读取URL的响应
// BufferedReader reader = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
// String line =
// while ((line = reader.readLine()) != null) {
System.out.println(line);
} catch (Exception e) {
System.out.println(&发送POST请求出现异常!& + e);
e.printStackTrace();
使用Apache Httpmime上传文件
* @param fileName 图片路径
public static void uploadFileWithHttpMime(String fileName) {
// 定义请求url
String uri = &&;
// 实例化http客户端
HttpClient httpClient = new DefaultHttpClient();
// 实例化post提交方式
HttpPost post = new HttpPost(uri);
// 添加json参数
// 实例化参数对象
MultipartEntity params = new MultipartEntity();
// 图片文本参数
params.addPart(&textParams&, new StringBody(
&{'user_name':'我的用户名','channel_name':'却道明','channel_address':'(123.4,30.6)'}&,
Charset.forName(&UTF-8&)));
// 设置上传文件
File file = new File(fileName);
// 文件参数内容
FileBody fileBody = new FileBody(file);
// 添加文件参数
params.addPart(&photo&, fileBody);
params.addPart(&photoName&, new StringBody(file.getName()));
// 将参数加入post请求体中
post.setEntity(params);
// 执行post请求并得到返回对象 [ 到这一步我们的请求就开始了 ]
HttpResponse resp = httpClient.execute(post);
// 解析返回请求结果
HttpEntity entity = resp.getEntity();
InputStream is = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuffer buffer = new StringBuffer();
while ((temp = reader.readLine()) != null) {
buffer.append(temp);
System.out.println(buffer);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
下载httpClient的压缩包即可,httpmime.jar包含在其中。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致POST方式提交XML调用接口 - 博客频道 - CSDN.NET
许小乖……是总攻
努力让今天的自己配得上昨天的梦想……
分类:●基础知识
& & & & & & &&当调用的接口越来越多的时候,我也深深的知道自己所见到的世面是越来越窄,之前一直没有用过xml来传输接口参数,总之,该学习的还是要学习,无论是xml还是json还是什么的,都是双方约定好的一种传输协议,只有在双方都约定好并且做好一定的数据安全的时候才有可能达成交易,这样,调用就开始了。
& & & & & & &&当我拿到接口文档的时候,是这样描述的,post方式提交,然后有一个地址,一个提交案例,并且没有说清楚是怎样的传输。现在拿到接口的一瞬间就是想能不能用postman先来试一试,看能不能调通,调通之后再写代码,进行测试。扯远了,还是说说post方式提交xml吧……
public static void main(String[] args) throws Exception {
//直接字符串拼接
StringBuffer sb = new StringBuffer();
sb.append(&&?xml version=”1.0” encoding=”utf-8” ?&\n& +
&&AdvPay&\n& +
&\t&PubInfo&\n& +
&\t\t&Version&1&/Version&\n& +
&\t\t&EnterpriseBossId &1234&/EnterpriseBossId&\n& +
&\t&VerifyCode&234234fsdf124121fs&/VerifyCode&\n& +
&\t&/PubInfo&\n& +
&\t&BusiData&\n& +
&\t\t&CreateTime& 7&/CreateTime&\n& +
&\t\t&ChargePhoneNum&&/ChargePhoneNum&\n& +
&\t\t&UserID&200&/UserID&\n& +
&\t\t&ChargeNum&1&/ChargeNum&\n& +
&\t&/BusiData&\n& +
&&/AdvPay&\n&);//xml数据存储
String data = sb.toString();
System.out.println(data);
String url = &http://183.230.97.113/cq-web/open/ChargeFlow&;
HttpClient httpclient = new HttpClient();
PostMethod post = new PostMethod(url);
String info =
RequestEntity entity = new StringRequestEntity(data, &text/plain&,
post.setRequestEntity(entity);
httpclient.executeMethod(post);
int code = post.getStatusCode();
if (code == HttpStatus.SC_OK)
info = new String(post.getResponseBodyAsString());
//接口返回的信息
} catch (Exception ex) {
ex.printStackTrace();
} finally {
post.releaseConnection();
System.out.println(info);
& & & & & & &&其实,现在大多数的方式都是HTTP协议,然后提交形式各有千秋罢了。以xml形式来传输数据,把要传输的xml拼接成String的类型,通过httpclient来提交。其实当接口调通的那一刻,你才明白,提供接口的一方才是王道,他用什么你就要迁就他,不过沟通真的太重要……还有一个古老的接口等着我…唉…
排名:第1976名
(36)(0)(7)(10)(24)(1)(7)(11)(3)(4)(6)(3)(2)(12)(14)(6)(14)(2)(4)(3)(4)(4)(30)(2)(16)(4)(0)(25)(5)(3)(8)(4)(3)(1)(21)(1)(7)(5)(3)(2)(7)(6)关于httpclient传送和接收数据的问题!!!!急~急~急~ - ITeye问答
& 现要求,客户端向服务端以httpclient的post方式发送“XML格式的字符串”,服务器接收字符串数据,解析之后返回“XML格式的字符串”给客户端。
&
String url="http://localhost:8080/smartHN/regist/regist.action?method=userReg";
HttpClient hc = new HttpClient();
PostMethod post = new PostMethod(url);
post.setRequestBody ("&xml&&name&long&/name&&age&24&/age&&address&wuhan&/address&&/xml&");
int state = hc.executeMethod(post);
if(state!=HttpStatus.SC_OK){
System.out.println("远程访问失败!");
System.out.println(post.getResponseBodyAsString());//反馈结果
} catch (HttpException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
这是模拟客户端发送请求,代码可能存在问题~~
请教服务端action怎么接收这个XML字符串,希望详细一点~~~~~感谢!问题补充post.addParameter(new NameValuePair("xml","******"));
服务端通过request.getParameter("xml");是可以接收的。
我想知道还可以通过别的方式传递吗?
1、比如放在一个content里面或body里面,是怎么实现?
2、服务端接收数据之后进行处理之后返回客户端一个XML字符串,又是怎么实现?&&
采纳的答案
已解决问题
未解决问题}

我要回帖

更多关于 httpclient post 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信