使用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?
?