HTTP POST方法调用

来源:互联网 发布:电脑印章的软件 编辑:程序博客网 时间:2024/06/08 17:33
import java.io.IOException;import java.io.UnsupportedEncodingException;import java.util.Map;import java.util.Set;import javax.servlet.http.HttpServletRequest;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.ParseException;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpPost;import org.apache.http.entity.StringEntity;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.message.BasicHeader;import org.apache.http.params.CoreConnectionPNames;import org.apache.http.protocol.HTTP;import org.apache.http.util.EntityUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import com.alibaba.fastjson.JSONObject;/** * <p> * Description: HTTP 协议的客户端工具包   暂不支持https * </p> * * 使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。 * 创建HttpClient对象。 * 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。 * 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。 * 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。 * 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。 * 释放连接。无论执行方法是否成功,都必须释放连接 */public class HttpClientUtil {private static final Logger log = LoggerFactory.getLogger(HttpClientUtil.class);public static final String CONTENT_CHARSET = "utf-8";public static final String CONTENT_TYPE1 = "application/x-www-form-urlencoded";public static final String CONTENT_TYPE2 = "application/json";/** * 使用HTTP POST方法向指定URL提交数据 * * @param url * @param params * @return * @throws ApiCheckedException * @author 80002016 * @throws ErrorException  */public static String post(final String url, final Map<String, String> params) throws ErrorException {String responseStr = null;try {//创建客户端(HttpClient)的实例HttpClient httpclient = new DefaultHttpClient();httpclient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 5000);//设置连接时间5秒HttpPost post = createHttpPost(url, params);// 提交post请求,并返回一个HttpResponse对象HttpResponse httpResponse = httpclient.execute(post);// 解析返回数据responseStr = parseResponse(httpResponse);//无论执行方法是否成功,都必须释放连接httpclient.getConnectionManager().shutdown();} catch (Exception e) {log.error("ACSP-E-BILL处理http post请求发生异常,url:{},params:{},exception:{}", url, params, e);throw new ErrorException("ACSP-E-BILL处理http post请求发生异常"+e.getMessage());}return responseStr;}public static String post2(final String url, final Map<String, Object> params) throws ErrorException  {String responseStr = null;try {//创建客户端(HttpClient)的实例HttpClient httpclient = new DefaultHttpClient();httpclient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 5000);//设置连接时间5秒HttpPost post = createHttpPost2(url, params);// 提交post请求,并返回一个HttpResponse对象HttpResponse httpResponse = httpclient.execute(post);// 解析返回数据responseStr = parseResponse(httpResponse);//无论执行方法是否成功,都必须释放连接httpclient.getConnectionManager().shutdown();} catch (Exception e) {log.error("ACSP-E-BILL处理http post请求发生异常,url:{},params:{},exception:{}", url, params, e);throw new ErrorException("ACSP-E-BILL处理http post请求发生异常"+e.getMessage());}return responseStr;}public static String post(String url,String params) throws ErrorException {String responseStr = null;try{HttpClient httpclient = new DefaultHttpClient();HttpPost httpPost = new HttpPost(url);httpPost.addHeader(new BasicHeader(HTTP.CONTENT_TYPE, Constants.contentType.CONTENT_TYPE2));httpPost.setEntity(new StringEntity(params));HttpResponse response = httpclient.execute(httpPost);int statusCode = response.getStatusLine().getStatusCode();if (statusCode != 200) {throw new ErrorException(String.valueOf(statusCode));}HttpEntity entity = response.getEntity();responseStr = EntityUtils.toString(entity, Constants.contentType.CONTENT_CHARSET);}catch(Exception e){log.error("ACSP-E-BILL处理http post请求发生异常,url:{},params:{},exception:{}", url, params, e);throw new ErrorException("ACSP-E-BILL处理http post请求发生异常"+e.getMessage());}return responseStr;}/** * 创建HttpPost对象请求方法的实例 * * @param url * @param params * @return HttpPost对象 * @throws ApiCheckedException * @throws ErrorException  */private static HttpPost createHttpPost(final String url, final Map<String, String> params) throws ErrorException  {HttpPost httpost = new HttpPost(url);//视业务情况是否需要copyHeaderHttpServletRequest request = SpringUtil.getRequest();if (request != null) {// 从系统内部请求,不经过controllercopyHeader(httpost, request);}Set<String> keySet = params.keySet();/*List<NameValuePair> nvps = new ArrayList<NameValuePair>();for (String key : keySet) {nvps.add(new BasicNameValuePair(key, params.get(key)));}*/JSONObject json = new JSONObject();  for (String key : keySet) {json.put(key, params.get(key));}try {//设置请求参数StringEntity s = new StringEntity(json.toJSONString(), Constants.contentType.CONTENT_CHARSET);    //          s.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));            s.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, Constants.contentType.CONTENT_TYPE2));            httpost.setEntity(s);//            httpost.setEntity(new UrlEncodedFormEntity(nvps, Constants.DEFAULT_CHARSET));} catch (UnsupportedEncodingException e) {log.error("createHttpPost====字符编码格式不支持:",e);throw new ErrorException("字符编码格式不支持"+e.getMessage());}return httpost;}private static HttpPost createHttpPost2(final String url, final Map<String, Object> params) throws ErrorException {HttpPost httpost = new HttpPost(url);//视业务情况是否需要copyHeaderHttpServletRequest request = SpringUtil.getRequest();if (request != null) {// 从系统内部请求,不经过controllercopyHeader(httpost, request);}Set<String> keySet = params.keySet();/*List<NameValuePair> nvps = new ArrayList<NameValuePair>();for (String key : keySet) {nvps.add(new BasicNameValuePair(key, params.get(key)));}*/JSONObject json = new JSONObject();  for (String key : keySet) {json.put(key, params.get(key));}try {//设置请求参数StringEntity s = new StringEntity(json.toJSONString(), Constants.contentType.CONTENT_CHARSET);    //          s.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));            s.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, Constants.contentType.CONTENT_TYPE2));            httpost.setEntity(s);//            httpost.setEntity(new UrlEncodedFormEntity(nvps, Constants.DEFAULT_CHARSET));} catch (UnsupportedEncodingException e) {log.error("createHttpPost2====字符编码格式不支持:",e);throw new ErrorException("字符编码格式不支持"+e.getMessage());}return httpost;}/** * 解析HttpResponse  读取服务器反馈回来的结果 * * @param response * @param charSet * @return response字符串 * @throws ApiCheckedException * @throws ErrorException  */private static String parseResponse(final HttpResponse response) throws ErrorException {if (response == null) {return null;}HttpEntity entity = response.getEntity();String body = null;try {body = EntityUtils.toString(entity, Constants.contentType.CONTENT_CHARSET);} catch (ParseException e) {log.error("parseResponse====解析response出错:",e);throw new ErrorException("解析response出错"+e.getMessage());} catch (IOException e) {log.error("parseResponse====发送http报文时,IO异常:",e);throw new ErrorException("发送http报文时,IO异常"+e.getMessage());}log.info("XX接口 result:" + body);return body;}/** * 复制头信息 * * @param httpost * @param request * @author 80002016 */private static void copyHeader(final HttpPost httpost, final HttpServletRequest request) {httpost.addHeader("tokenId", request.getHeader("tokenId"));httpost.addHeader("region_code", request.getHeader("region_code"));httpost.addHeader("language_code", request.getHeader("language_code"));httpost.addHeader("screen_size", request.getHeader("screen_size"));httpost.addHeader("platform", request.getHeader("platform"));httpost.addHeader("protocol_ver", request.getHeader("protocol_ver"));httpost.addHeader("model", request.getHeader("model"));httpost.addHeader("carrier", request.getHeader("carrier"));httpost.addHeader("client_ver", request.getHeader("client_ver"));httpost.addHeader("cookie", request.getHeader("cookie"));httpost.addHeader("systemVersion", request.getHeader("systemVersion"));//httpost.addHeader("langCode", request.getHeader("langCode"));/*@SuppressWarnings("unchecked")Enumeration<String> headers = request.getHeaderNames(); // 通过枚举类型获取请求文件的头部信息集// 遍历头部信息集while (headers.hasMoreElements()) {// 取出信息名String name = (String) headers.nextElement();// 取出信息值String value = request.getHeader(name);httpost.addHeader(name, value);}*/}}/** * 自定义异常类 * */public class ErrorException  extends RuntimeException {/** *  */private static final long serialVersionUID = 4379876817711661340L;public ErrorException(String msg) {   super(msg); }public ErrorException(String string, Exception e) {super(string, e);}}