HttpClient服务端的请求

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
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.params.HttpClientParams;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.conn.params.ConnManagerParams;
import org.apache.http.conn.params.ConnPerRouteBean;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;

/**
 * 优化httpclient,解决线程安全,重复连接池等性能问题。
 * 
 * */
public class HttpUtils {
	private final static boolean DEBUG = false;

	public final static String CHARSET = "UTF-8";

	/**
	 * 这定义了通过网络与服务器建立连接的超时时间。 Httpclient包中通过一个异步线程去创建与服务器的socket连接
	 * ,这就是该socket连接的超时时间(毫秒)
	 */
	public final static int DEFAULT_SOCKET_TIMEOUT = 2000;
	/** 这定义了Socket读数据的超时时间,即从服务器获取响应数据需要等待的时间(毫秒) */
	public final static int WAIT_GETDATA_TIME = 4000;
	/** 配置每台主机最多连接数 */
	public final static int DEFAULT_HOST_CONNECTIONS = 50;
	/** 和连接池中的最多连接总数 */
	public final static int DEFAULT_MAX_CONNECTIONS = 50;
	/** Socket 缓存大小 */
	public final static int DEFAULT_SOCKET_BUFFER_SIZE = 8192;

	/** 这定义了从ConnectionManager管理的连接池中取出连接的超时时间(毫秒) */
	public final static int GET_CONNECT_TIME = 1000;
	private static HttpClient httpClient = null;

	private static synchronized HttpClient getHttpClient() {
		if (httpClient == null) {
			final HttpParams httpParams = new BasicHttpParams();

			ConnManagerParams.setTimeout(httpParams, GET_CONNECT_TIME);
			HttpConnectionParams.setConnectionTimeout(httpParams, DEFAULT_SOCKET_TIMEOUT);
			HttpConnectionParams.setSoTimeout(httpParams, WAIT_GETDATA_TIME);
			ConnManagerParams.setMaxConnectionsPerRoute(httpParams, new ConnPerRouteBean(DEFAULT_HOST_CONNECTIONS));
			ConnManagerParams.setMaxTotalConnections(httpParams, DEFAULT_MAX_CONNECTIONS);

			/** 以先发送部分请求(如:只发送请求头)进行试探,如果服务器愿意接收,则继续发送请求体 */
			HttpProtocolParams.setUseExpectContinue(httpParams, true);
			/**
			 * 即在有传输数据需求时,会首先检查连接池中是否有可供重用的连接,如果有,则会重用连接。
			 * 同时,为了确保该“被重用”的连接确实有效,会在重用之前对其进行有效性检查
			 */
			HttpConnectionParams.setStaleCheckingEnabled(httpParams, false);

			HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1);
			HttpProtocolParams.setContentCharset(httpParams, HTTP.UTF_8);

			HttpClientParams.setRedirecting(httpParams, false);

			// 设置代理
			String userAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2) Gecko/20100115 Firefox/3.6";
			HttpProtocolParams.setUserAgent(httpParams, userAgent);

			// disable Nagle algorithm
			HttpConnectionParams.setTcpNoDelay(httpParams, true);

			HttpConnectionParams.setSocketBufferSize(httpParams, DEFAULT_SOCKET_BUFFER_SIZE);

			// 配置 http and https
			SchemeRegistry schemeRegistry = new SchemeRegistry();
			schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
			schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));

			ClientConnectionManager manager = new ThreadSafeClientConnManager(httpParams, schemeRegistry);
			httpClient = new DefaultHttpClient(manager, httpParams);
		}

		return httpClient;
	}

	public static InputStream doHttpClientPost(String url, HashMap<String, String> params) {
		if (DEBUG) {
			System.out.println("doPost url is " + url);
		}

		HttpClient httpClient = getHttpClient();

		HttpPost httpRequest = new HttpPost(url);

		List<BasicNameValuePair> httpParams = new ArrayList<BasicNameValuePair>();
		Iterator<Entry<String, String>> iter = params.entrySet().iterator();
		while (iter.hasNext()) {
			Map.Entry<String, String> entry = iter.next();
			String key = entry.getKey();
			String val = entry.getValue();
			httpParams.add(new BasicNameValuePair(key, val));
		}

		InputStream inputStream = null;
		String erroMsg = null;

		try {
			httpRequest.setEntity(new UrlEncodedFormEntity(httpParams, HTTP.UTF_8));
		} catch (UnsupportedEncodingException e) {

		}
		HttpResponse httpResponse = null;
		try {
			httpResponse = httpClient.execute(httpRequest);
		} catch (ClientProtocolException e) {
			erroMsg = e.getMessage().toString();
			e.printStackTrace();
		} catch (IOException e) {
			erroMsg = e.getMessage().toString();
			e.printStackTrace();
		}

		int statusCode = httpResponse.getStatusLine().getStatusCode();
		if (statusCode == 200) {
			try {
				inputStream = httpResponse.getEntity().getContent();
			} catch (IllegalStateException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		} else {
			erroMsg = "Error Response: " + httpResponse.getStatusLine().toString();
		}

		if (erroMsg != null) {
			System.out.println("doPost error, error message is " + erroMsg);
		}

		return inputStream;
	}

	public static InputStream doHttpsClientPost(String url, String params) {
		if (DEBUG) {
			System.out.println("doPost url is " + url);
		}

		HttpClient httpClient = getHttpClient();

		HttpPost httpRequest = new HttpPost(url);

		InputStream inputStream = null;
		String erroMsg = null;

		try {
			HttpEntity entity = new StringEntity(params,"utf-8");

			httpRequest.setEntity(entity);
		} catch (UnsupportedEncodingException e) {

		}
		HttpResponse httpResponse = null;
		try {
			httpResponse = httpClient.execute(httpRequest);
		} catch (ClientProtocolException e) {
			erroMsg = e.getMessage().toString();
			e.printStackTrace();
		} catch (IOException e) {
			erroMsg = e.getMessage().toString();
			e.printStackTrace();
		}

		int statusCode = httpResponse.getStatusLine().getStatusCode();
		if (statusCode == 200) {
			try {
				inputStream = httpResponse.getEntity().getContent();
			} catch (IllegalStateException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		} else {
			erroMsg = "Error Response: " + httpResponse.getStatusLine().toString();
		}

		if (erroMsg != null) {
			System.out.println("doPost error, error message is " + erroMsg);
		}

		return inputStream;
	}

	public static InputStream doHttpClientGet(String url, HashMap<String, String> params) {
		HttpClient httpClient = getHttpClient();

		if (DEBUG) {
			System.out.println("doGet the url before encode is " + url);
		}

		if (params != null) {
			String paramStr = "";
			try {
				Iterator<Entry<String, String>> iter = params.entrySet().iterator();
				while (iter.hasNext()) {
					Map.Entry<String, String> entry = iter.next();
					String key = entry.getKey();
					key = URLEncoder.encode(key, "UTF-8");
					String val = entry.getValue();
					val = URLEncoder.encode(val, "UTF-8");
					paramStr += paramStr = "&" + key + "=" + val;
				}
			} catch (UnsupportedEncodingException e1) {
				e1.printStackTrace();
			}

			if (!paramStr.equals("")) {
				paramStr = paramStr.replaceFirst("&", "?");
				url += paramStr;
			}
		}

		if (DEBUG) {
			System.out.println("doGet the url after encode is " + url);
		}

		HttpGet httpRequest = null;
		try {
			httpRequest = new HttpGet(url);
		} catch (IllegalArgumentException e) {
			System.out.println("uri argument error");
			return null;
		}

		InputStream inputStream = null;

		HttpResponse httpResponse = null;
		try {
			httpResponse = httpClient.execute(httpRequest);

		} catch (IllegalStateException e) {
			e.printStackTrace();
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (SocketTimeoutException e) {
			e.printStackTrace();
		} catch (ConnectTimeoutException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}

		if (httpResponse == null) {
			System.out.println("no response from server");
			return null;
		}

		if (httpResponse.getStatusLine().getStatusCode() == 200) {
			HttpEntity httpEntity = httpResponse.getEntity();
			try {
				inputStream = httpEntity.getContent();
			} catch (IllegalStateException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} else {
			System.out.println("Error Response: " + httpResponse.getStatusLine().toString());
		}
		return inputStream;
	}

	// 未经优化的原声方法
	public static String doHttpURLConnection(String myurl) throws IOException {
		InputStream is = null;
		// Only display the first 1000 characters of the retrieved
		// web page content.
		int len = 1000;

		try {
			URL url = new URL(myurl);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setReadTimeout(10000 /* milliseconds */);
			conn.setConnectTimeout(15000 /* milliseconds */);
			conn.setRequestMethod("GET");
			conn.setDoInput(true);
			// Starts the query
			conn.connect();
			int response = conn.getResponseCode();
			if (DEBUG) {
				System.out.println("The response is: " + response);
			}
			is = conn.getInputStream();

			// Convert the InputStream into a string
			String contentAsString = readIt(is, len);
			return contentAsString;

			// Makes sure that the InputStream is closed after the app is
			// finished using it.
		} finally {
			if (is != null) {
				is.close();
			}
		}
	}

	// Reads an InputStream and converts it to a String.
	public static String readIt(InputStream stream, int len) throws IOException, UnsupportedEncodingException {
		if (stream == null)
			return null;
		Reader reader = null;
		reader = new InputStreamReader(stream, "UTF-8");
		char[] buffer = new char[len];
		reader.read(buffer);
		return new String(buffer);
	}

}

HttpClient服务端的请求

时间: 2024-10-08 11:43:12

HttpClient服务端的请求的相关文章

C#服务端Http请求之HttpRequest

与客户端Http请求类HttpWebRequest相对的服务端Http请求类是HttpRequest.HttpApplication.HttpContext.Page.UserControl类的Request属性都是HttpRequest类的实例.HttpRequest类使得Asp.Net能够读取客户端(如浏览器或使用了HttpWebRequest类的客户端程序)在Web请求期间发送的Http值.常见的Http值是客户端以Get方式传来的Url参数.Post方式提交过来的表单项和文件:不常见的H

Hessian客户端向服务端发送请求头

Hessian客户端向服务端发送数据 场景:项目日志Token处理,即用户发送一个请求时生成一个日志Token,该Token从各个服务之间传递,并使用该Token记录日志,直至请求结束.可以根据该Token定位所有日志. 问题:由于目前项目使用Hessian协议,所有Token必须使用Hessian传递.查阅相关资料,发现可以请求头传递数据. 解决方法:定义与线程相关的请求头上下文,在客户端发送请求之前,增加请求头.服务端获取请求时,从请求中解决请求头,并放入请求头上下文中,供服务端使用. 实现

HttpClient服务端发送http请求

本来以为对跨域问题的处理已经比较熟练了.可以通过jsonp.document.domain+iframe.window.name.window.postMessage.服务器上设置代理页面来解决.但还是遇到了难题dva封装的request: 1.robe-ajax用它来调其他网站的api,会报跨域问题怎么设置也没用. 2.fetch可以通过设置mode:no-cors来解决跨域,但到checkStatus时会报错,network能看到response. 3.jq ajax设置dataType:j

jQuery通过Ajax向PHP服务端发送请求并返回JSON数据

ON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写,同时也易于机器解析和生成.JSON在前后台交互的过程中发挥着相当出色的作用.请接着往下看教程. XHTML  <ul id="userlist">    <li><a href="#" rel="1">张三</a></li>    <li><a href=&quo

zookeeper源码分析之一服务端处理请求流程

上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析各自一下消息处理过程: 前文可以看到在 1.在单机情况下NettyServerCnxnFactory中启动ZookeeperServer来处理消息: public synchronized void startup() { if (sessionTracker == null) { createSe

android客户端利用sokcet通信和向Java服务端发请求,Java服务端把文件发给android客户端

Java服务端 package com.yqq.socketTest; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream;

Visual Studio 2015 Bowser Link的功能不停的向服务端发送请求

Visual Studio 2015新建的mvc项目 默认在每个视图上生成一些JavaScript脚本 这些脚本不断向发送异步请求. 去除这这些自动生成的脚本方法: 方法一: 修改vs的配置: 方法二:修改项目的Web.config配置文件 <appSettings> <add key="vs:EnableBrowserLink" value="false"/> </appSettings>

httpClient服务端编写

以前用过HttpClient,给你说几个关键的地方吧: 1. 首先,发送的时候 HttpClient client = new HttpClient(); PostMethod method = new PostMethod(URL);//具体method里面还可以设置一下编码,header之类的 //1. 第一种方式,基于Content-Type=‘multipart/form-data’形式的表单 Part[] parts = ...;//FilePart和StringPart都可以放进去

ajax对服务端发送请求

//兼容处理获取ajax对象 var req = ''; if (window.XMLHttpRequest)    req = new XMLHttpRequest(); else    req = new ActiveXObject("Msxml2.XMLHTTP"); //建立连接 req.open('get', 'demo.php'); //发送请求 req.send(); 原文地址:https://www.cnblogs.com/wangshengl9263/p/902952