读书人

应用HttpClient发送Post Http请求

发布时间: 2012-10-27 10:42:25 作者: rapoo

使用HttpClient发送Post Http请求

最近需要使用java对Rest接口进行调用,也就是直接使用java直接发送Post, Get, Put, Delete等请求。

印象中可以使用Apache Common下的HttpClient来做,结果HttpClient已经独立成了HttpComponent,编码方式也有所改变。

Google出来的很多文章多数是common-httpclient的方式,在新版本中不怎么适用。经过一番研究自己做了一下封装:

?

?

package cn.com.dayang.auth;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.util.ArrayList;import java.util.List;import java.util.Map;import java.util.Set;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http.ParseException;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.client.methods.HttpUriRequest;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.message.BasicNameValuePair;import org.apache.http.protocol.HTTP;import org.apache.http.util.EntityUtils;import org.apache.log4j.Logger;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 = null;log.info("create httppost:" + url);HttpPost post = postForm(url, params);body = invoke(httpclient, post);httpclient.getConnectionManager().shutdown();return body;}public static String get(String url) {DefaultHttpClient httpclient = new DefaultHttpClient();String body = null;log.info("create httppost:" + url);HttpGet get = new HttpGet(url);body = invoke(httpclient, get);httpclient.getConnectionManager().shutdown();return body;}private static String invoke(DefaultHttpClient httpclient,HttpUriRequest httpost) {HttpResponse response = sendRequest(httpclient, httpost);String body = paseResponse(response);return body;}private static String paseResponse(HttpResponse response) {log.info("get response from http server..");HttpEntity entity = response.getEntity();log.info("response status: " + response.getStatusLine());String charset = EntityUtils.getContentCharSet(entity);log.info(charset);String body = null;try {body = EntityUtils.toString(entity);log.info(body);} catch (ParseException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return body;}private static HttpResponse sendRequest(DefaultHttpClient httpclient,HttpUriRequest httpost) {log.info("execute post...");HttpResponse response = null;try {response = httpclient.execute(httpost);} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return response;}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)));}try {log.info("set utf-8 form entity to httppost");httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));} catch (UnsupportedEncodingException e) {e.printStackTrace();}return httpost;}}

?

?

如何调用:

?

?

Map<String, String> params = new HashMap<String, String>();params.put("name", name);params.put("password", password);String xml = HttpXmlClient.post(loginUrl, params);log.info(xml);

?

?

参考资料:

HttpComponents Client GA主页

官方提供的入门文档

官方提供的Examples(这个最直接)

?

?

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 filexml = doc.to_s #document to xml stringcov=Iconv.new('gbk', 'utf-8')#create encoderencodedXml = cov.iconv(xml)#encoding zh_CNputs encodedXml #display logparams= {}params["msg"]=xml#post http requesturi = URI.parse("http://localhost:8080/monitor/client/message")1.upto 2 do|i|puts 'send time:' + i.to_sres = Net::HTTP.post_form(uri, params)end
?

?

读书人网 >操作系统

热点推荐