`
何先生
  • 浏览: 26410 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

HttpTools 网络请求工具集合

阅读更多
package com.cnki.client.utils;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
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 javax.net.ssl.SSLHandshakeException;

import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpEntityEnclosingRequest;
import org.apache.http.HttpHost;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.NoHttpResponseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.CookieStore;
import org.apache.http.client.HttpRequestRetryHandler;
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.client.params.HttpClientParams;
import org.apache.http.conn.params.ConnRouteParams;
import org.apache.http.impl.client.DefaultHttpClient;
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.protocol.ExecutionContext;
import org.apache.http.protocol.HTTP;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;

import android.app.Activity;
import android.content.Context;
import android.os.Handler;
import android.webkit.DownloadListener;

public class HttpTools {
	public static final int METHOD_GET = 1;
	public static final int METHOD_POST = 2;
	
	/** 执行downfile后,得到下载文件的大小 */
	private long contentLength;
	/** 返回连接失败信息 **/
	private String strResult = "服务器无法连接,请检查网络";

	/** http 请求头参数 **/
	private HttpParams httpParams;
	/** httpClient 对象 **/
	private DefaultHttpClient httpClient;

	/** 得到上下文 **/
	private Context context;
	private Activity activity = null;
	
	/**更新界面UI**/
	Handler mHandler;

	/** HTTP帮助类的构造方法 */
	public HttpTools(Context context) {
		this.context = context;
		
		getHttpClient();
	}
	
	public HttpTools() {}
	

	/**
	 * 得到 apache http HttpClient对象 一般情况下,我们获取httpclient对象就一句话,httpClient = new
	 * DefaultHttpClient();
	 * 但是这个DefaultHttpClient()方法中没传参数,少了许多参数限制,所以就下面这个方法,通过设置 HTTP参数来约束请求
	 * **/
	public DefaultHttpClient getHttpClient() {
		/** 创建 HttpParams 以用来设置 HTTP 参数 **/
		httpParams = new BasicHttpParams();

		/** 设置连接超时和 Socket 超时,以及 Socket 缓存大小 **/

		HttpConnectionParams.setConnectionTimeout(httpParams, 20 * 1000);

		HttpConnectionParams.setSoTimeout(httpParams, 20 * 1000);

		HttpConnectionParams.setSocketBufferSize(httpParams, 8192);
		// 以新的方式重新访问,这里就是通过参数设置来访问
		/** 这里就是HTTP访问重定向的问题了,true的意思就是让访问重定向,get和post重定向设置相同 */
		HttpClientParams.setRedirecting(httpParams, true);

		/**
		 * 创建一个 HttpClient 实例 //增加自动选择网络,自适应cmwap、CMNET、wifi或3G
		 */
		MyHttpCookies li = new MyHttpCookies(context);
		// 可以理解为网络代理商
		String proxyStr = li.getHttpProxyStr();
		if (proxyStr != null && proxyStr.trim().length() > 0) {
			HttpHost proxy = new HttpHost(proxyStr, 80);
			httpClient.getParams().setParameter(ConnRouteParams.DEFAULT_PROXY,
					proxy);
		}
		/** 注意 HttpClient httpClient = new HttpClient(); 是Commons HttpClient **/
		httpClient = new DefaultHttpClient(httpParams);
		// 设置请求异常时需要做出的处理 .为了开启自定义异常恢复机制,应该提供一个HttpRequestRetryHandler接口的实现。
		httpClient.setHttpRequestRetryHandler(requestRetryHandler);

		return httpClient;

	}

	/**
	 * 异常自动恢复处理, 使用HttpRequestRetryHandler接口实现请求的异常恢复
	 */
	private static HttpRequestRetryHandler requestRetryHandler = new HttpRequestRetryHandler() {
		// 自定义的恢复策略
		public boolean retryRequest(IOException exception, int executionCount,
				HttpContext context) {
			// 设置恢复策略,在发生异常时候将自动重试N次
			if (executionCount >= 3) {
				// 如果超过最大重试次数,那么就不要继续了
				return false;
			}
			if (exception instanceof NoHttpResponseException) {
				// 如果服务器丢掉了连接,那么就重试
				return true;
			}
			if (exception instanceof SSLHandshakeException) {
				// 不要重试SSL握手异常
				return false;
			}
			HttpRequest request = (HttpRequest) context
					.getAttribute(ExecutionContext.HTTP_REQUEST);
			boolean idempotent = (request instanceof HttpEntityEnclosingRequest);
			if (!idempotent) {
				// 如果请求被认为是幂等的,那么就重试
				return true;
			}
			return false;
		}
	};

	/**
	 * 
	 * 总的来说DoGet是不安全的,会把用户的信息暴露在URL中,但是在手机中酷似看不到,如果有人进行网络抓包的话,会抓到。
	 * 提供GET形式的访问网络请求 doGet 参数示例:
	 * 
	 * @param url
	 *            请求地址
	 * @return 返回 String jsonResult;
	 * 
	 */
	public String doGet(String url) {
		/** 创建HttpGet对象 **/
		HttpGet httpRequest = new HttpGet(url);
		httpRequest.setHeaders(this.getHeader());
		try {
			/** 保持会话Session **/
			/** 设置Cookie **/
			MyHttpCookies li = new MyHttpCookies(context);
			CookieStore cs = li.getuCookie();
			/** 第一次请求App保存的Cookie为空,所以什么也不做,只有当APP的Cookie不为空的时。把请请求的Cooke放进去 **/
			if (cs != null) {
				httpClient.setCookieStore(li.getuCookie());
			}

			/** 保持会话Session end **/

			/* 发送请求并等待响应 */
			HttpResponse httpResponse = httpClient.execute(httpRequest);
			/* 若状态码为200 ok */
			if (httpResponse.getStatusLine().getStatusCode() == 200) {
				/* 读返回数据 */
				strResult = EntityUtils.toString(httpResponse.getEntity());

				/** 执行成功之后得到 **/
				/** 成功之后把返回成功的Cookis保存APP中 **/
				// 请求成功之后,每次都设置Cookis。保证每次请求都是最新的Cookis
				li.setuCookie(httpClient.getCookieStore());

			} else {
				strResult = "Error Response: "
						+ httpResponse.getStatusLine().toString();
			}
		} catch (ClientProtocolException e) {
			strResult = nullToString(e.getMessage());
			e.printStackTrace();
		} catch (IOException e) {
			strResult = nullToString(e.getMessage());
			e.printStackTrace();
		} catch (Exception e) {
			strResult = nullToString(e.getMessage());
			e.printStackTrace();
		} finally {
			httpRequest.abort();
			this.shutDownClient();
		}
		return strResult;
	}

	/**
	 * 提供GET形式的访问网络请求 doGet 参数示例: Map params=new HashMap();
	 * params.put("usename","helijun"); params.put("password","123456");
	 * httpClient.doGet(url,params);
	 * 
	 * @param url
	 *            请求地址
	 * @param params
	 *            请求参数
	 * @return 返回 String jsonResult;
	 * 
	 * **/
	public String doGet(String url, Map params) {
		/** 建立HTTPGet对象 **/
		String paramStr = "";
		if (params == null)
			params = new HashMap();
		/** 迭代请求参数集合 **/
		Iterator iter = params.entrySet().iterator();
		while (iter.hasNext()) {
			Map.Entry entry = (Map.Entry) iter.next();
			Object key = entry.getKey();
			String val = nullToString(entry.getValue());
			paramStr += paramStr = "&" + key + "=" + URLEncoder.encode(val);
		}
		if (!paramStr.equals("")) {
			paramStr = paramStr.replaceFirst("&", "?");
			url += paramStr;
		}
		return doGet(url);
	}
	
	/**
	 * 提供GET形式的访问网络请求 doGet 参数示例: Map params=new HashMap();
	 * params.put("usename","gongshuanglin"); params.put("password","123456");
	 * httpClient.doGet(url,params);
	 * 
	 * @param url
	 *            请求地址
	 * @param params
	 *            请求参数
	 * @return 返回 String jsonResult;
	 * 
	 */
	public String doGet(String url, List<NameValuePair> params) {
		/** 建立HTTPGet对象 **/
		String paramStr = "";
		if (params == null)
			params = new ArrayList<NameValuePair>();
		/** 迭代请求参数集合 **/

		for (NameValuePair obj : params) {
			paramStr += paramStr = "&" + obj.getName() + "="
					+ URLEncoder.encode(obj.getValue());
		}
		if (!paramStr.equals("")) {
			paramStr = paramStr.replaceFirst("&", "?");
			url += paramStr;
		}
		return doGet(url);
	}

	/**
	 * 提供Post形式的访问网络请求 Post 参数示例: doPost 参数示例 List<NameValuePair> paramlist =
	 * new ArrayList<NameValuePair>(); paramlist(new BasicNameValuePair("email",
	 * "xxx@123.com")); paramlist(new BasicNameValuePair("address", "123abc"));
	 * httpClient.doPost(url,paramlist);
	 * 
	 * @param url
	 *            请求地址
	 * @param params
	 *            请求参数
	 * @return 返回 String jsonResult;
	 * **/

	public String doPost(String url, List<NameValuePair> params) {
		/* 建立HTTPPost对象 */

		HttpPost httpRequest = new HttpPost(url);
		// 设置请求Header信息、
		httpRequest.setHeaders(this.getHeader());
		try {

			/** 添加请求参数到请求对象 */
			httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));

			/** 保持会话Session **/
			/** 设置Cookie **/
			MyHttpCookies li = new MyHttpCookies(context);
			CookieStore cs = li.getuCookie();
			/** 第一次请求App保存的Cookie为空,所以什么也不做,只有当APP的Cookie不为空的时。把请请求的Cooke放进去 **/
			if (cs != null) {
				httpClient.setCookieStore(li.getuCookie());
			}

			/** 保持会话Session end **/

			/** 发送请求并等待响应 */

			HttpResponse httpResponse = httpClient.execute(httpRequest);

			/** 若状态码为200 ok */
			if (httpResponse.getStatusLine().getStatusCode() == 200) {
				/* 读返回数据 */
				strResult = EntityUtils.toString(httpResponse.getEntity());

				/** 执行成功之后得到 **/
				/** 成功之后把返回成功的Cookis保存APP中 **/
				// 请求成功之后,每次都设置Cookis。保证每次请求都是最新的Cookis
				li.setuCookie(httpClient.getCookieStore());

				/** 设置Cookie end **/
			} else {
				strResult = "Error Response: "
						+ httpResponse.getStatusLine().toString();
			}
		} catch (ClientProtocolException e) {
			strResult = "";
			// strResult = e.getMessage().toString();
			e.printStackTrace();
		} catch (IOException e) {
			strResult = "";
			// strResult = e.getMessage().toString();
			e.printStackTrace();
		} catch (Exception e) {
			strResult = "";
			// strResult = e.getMessage().toString();
			e.printStackTrace();
		} finally {
			httpRequest.abort();
			this.shutDownClient();
		}
		return strResult;
	}

	/**
	 * 通过指定的接口获取网络实体文件,并得到实体文件的大小
	 * 一般情况下当向某个接口请求实体数据时,需要客户端提供一些信息,比如用户名啦,文件名称啦之类的,并且还需要提供请求方法类型.
	 * @param url
	 * @return
	 */
	public HttpEntity DownLoadFile(String url,ArrayList<NameValuePair> params, int method) {
		/** 创建HttpGet对象 **/
		HttpUriRequest httpRequest = null;
		switch (method) {
		case METHOD_GET:
			String paramStr = "";
			if (params == null)
				params = new ArrayList<NameValuePair>();
			/** 迭代请求参数集合 **/

			for (NameValuePair obj : params) {
				paramStr += paramStr = "&" + obj.getName() + "="
						+ URLEncoder.encode(obj.getValue());
			}
			if (!paramStr.equals("")) {
				paramStr = paramStr.replaceFirst("&", "?");
				url += paramStr;
			}
			httpRequest = new HttpGet(url);
			httpRequest.setHeaders(this.getHeader());
			break;

		case METHOD_POST:
			httpRequest = new HttpPost(url);
			httpRequest.setHeaders(this.getHeader());
			if (params != null && !params.isEmpty()) {
				//设置请求实体
				try {
					UrlEncodedFormEntity requestentity = new UrlEncodedFormEntity(
							params);
					((HttpPost)httpRequest).setEntity(requestentity);
				} catch (UnsupportedEncodingException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			break;
		}
		
		try {
			/** 保持会话Session **/
			/** 设置Cookie **/
			MyHttpCookies li = new MyHttpCookies(context);
			CookieStore cs = li.getuCookie();
			/** 第一次请求App保存的Cookie为空,所以什么也不做,只有当APP的Cookie不为空的时。把请请求的Cooke放进去 **/
			if (cs != null) {
				httpClient.setCookieStore(li.getuCookie());
			}
			/** 保持会话Session end **/
			/* 发送请求并等待响应 */
			HttpResponse httpResponse = httpClient.execute(httpRequest);
			/* 若状态码为200 ok */
			if (httpResponse.getStatusLine().getStatusCode() == 200) {
				/** 执行成功之后得到 **/
				/** 成功之后把返回成功的Cookis保存APP中 **/
				// 请求成功之后,每次都设置Cookis。保证每次请求都是最新的Cookis
				li.setuCookie(httpClient.getCookieStore());
				this.contentLength = httpResponse.getEntity()
						.getContentLength();
				/* 读返回数据 */
				return httpResponse.getEntity();
			} else {
				strResult = "Error Response: "
						+ httpResponse.getStatusLine().toString();
			}
		} catch (ClientProtocolException e) {
			strResult = e.getMessage().toString();
			e.printStackTrace();
		} catch (IOException e) {
			strResult = e.getMessage().toString();
			e.printStackTrace();
		} catch (Exception e) {
			strResult = e.getMessage().toString();
			e.printStackTrace();
		} finally {
			// httpRequest.abort();
			// this.shutDownClient();
		}
		this.contentLength = 0;
		return null;
	}
	/**
	 * 将下载得到的entity转化为输入流
	 * @param url
	 * @param params
	 * @param method
	 * @return
	 * @throws Exception
	 */
	public  InputStream getStream(String url,ArrayList<NameValuePair> params,int method) throws Exception{
		InputStream in = null;
		HttpEntity _entity  = DownLoadFile(url, params, method);
		if(_entity != null){
			in = _entity.getContent();
		}
		return in;
	}
	
	/**
	 * 通过实体对象获取输入流
	 * @param entity
	 * @return
	 * @throws IllegalStateException
	 * @throws IOException
	 */
	public static InputStream getStream(HttpEntity entity) throws IllegalStateException, IOException{
		if(entity != null){
			return entity.getContent();
		}
		return null;
	}
	
	/**
	 * 将下载得到的entity转化为字节数组,适合于图片的获取
	 * @param url
	 * @param params
	 * @param method
	 * @return
	 * @throws Exception
	 */
	public  byte[] getByte(String url,ArrayList<NameValuePair> params,int method) throws Exception{
		byte[] _bytes = null;
		HttpEntity _entity = DownLoadFile(url, params, method);
		if(_entity != null){
			return _bytes = EntityUtils.toByteArray(_entity);
		}
		return _bytes;			
	}
	/**
	 * 将下载得到的entity转化为String类型,适合于获取服务器的JSON字符串或者返回值
	 * @param url
	 * @param params
	 * @param method
	 * @return
	 * @throws Exception
	 */
	public  String toString(String url,ArrayList<NameValuePair> params,int method) throws Exception{
		HttpEntity _entity = DownLoadFile(url, params, method);
		if(_entity != null){
			return EntityUtils.toString(_entity, "utf-8");
		}
		return null;
	}
	
	public long getContentLength() {
		return contentLength;
	}
	
	/**
	 * 这个方式是利用HttpURLConnection进行数据请求的,但是这种方式比较原始,可扩展性没有HttPClient方便
	 * 在一般的网络请求数据源中这种方法也常用
	 * @param urlPath
	 * @return
	 */
	public String getStringByURLConnection(String urlPath) {
		String json = null;
		try {
			
			URL url = new URL(urlPath);
			// 利用HttpURLConnection对象,我们可以从网络中获取网页数据.
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			 // 单位是毫秒,设置超时时间为5秒
			conn.setConnectTimeout(5*1000);
			// HttpURLConnection是通过HTTP协议请求path路径的,所以需要设置请求方式,可以不设置,因为默认为GET
			conn.setRequestMethod("GET");
			if(conn.getResponseCode() == 200) {
				InputStream is = conn.getInputStream();
				byte[] data = readStream(is); //将输入流转化为字符数组
				json = new String(data);//把字符数组转化为字符串
			}				
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
		return json;
	}
	
	/**
	 * 将输入流转化为字符数组
	 * @param is
	 * @return
	 * @throws Exception
	 */
	public  byte[] readStream(InputStream is)  {
		ByteArrayOutputStream bout = null;
		try {
			bout = new ByteArrayOutputStream();
			byte[] buffer = new byte[1024];
			int len = 0;
			while((len = is.read(buffer)) != -1){
				bout.write(buffer, 0, len);
			}
			
			is.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return bout.toByteArray();
	}
	

	/** 得到设备信息、系统版本、驱动类型 **/
	private Header[] getHeader() {
		/** 请求头信息 end **/
		MyHttpCookies li = new MyHttpCookies(context);
		return li.getHttpHeader();
	}

	/**
	 * 假如obj对象 是null返回""
	 * 
	 * @param obj
	 * @return
	 */
	public static String nullToString(Object obj) {
		if (obj == null) {
			return "";
		}
		return obj.toString();
	}

	/** 销毁HTTPCLient **/
	public void shutDownClient() {
		httpClient.getConnectionManager().shutdown();
	}
}
分享到:
评论

相关推荐

    httpTools工具

    而HTTPTools工具正是这样一个强大的辅助工具,它允许用户模拟发送HTTP请求,对网络服务进行测试和调试,极大地提升了开发和运维的效率。本文将深入探讨HTTPTools工具的核心功能、使用方法以及其在实际工作中的应用。...

    HttpTools1.4.zip

    - **自动重试**:在遇到网络不稳定或服务器短暂故障时,工具可以自动重试请求,确保数据的完整获取。 3. **性能测试** - **多线程**:HttpTools1.4支持同时发起多个请求,模拟并发访问,可以进行简单的性能测试,...

    HttpTools,极简 Http 调试工具

    HttpTools的设计理念是“极简”,这意味着它将复杂的网络请求和响应过程进行了精简化,使得开发者可以快速地理解和操作HTTP请求。通过这款工具,你可以轻松发送GET、POST等各种HTTP方法的请求,同时,查看并分析...

    HttpTools1.4

    HttpTools1.4,进行前端模拟请求的工具 使用方便简洁。

    Python-httptools是nodejsHTTP解析器的Python绑定

    Python-httptools将其移植到Python,旨在为Python环境提供一个轻量级、高性能的HTTP请求解析器,以满足Python开发者在构建网络服务时的需求。 2. **核心功能** - **HTTP请求解析**:httptools能快速准确地解析HTTP...

    HttpTools2.4下载

    HttpTools2.4是一款专为Java开发者设计的HTTP请求处理工具包,它简化了与HTTP服务器之间的通信,使得开发者能够方便地发送GET、POST等HTTP请求,并获取响应数据。这个工具包包含了必要的JAR文件和其他支撑程序,可以...

    httptools:快速HTTP解析器

    蜜蜂httptools包含两个类httptools.HttpRequestParser , httptools.HttpResponseParser (通过实现)和一个用于解析URL httptools.parse_url的函数(目前通过 )。 有关示例,请参见单元测试。 class ...

    HTTPtools.rar

    "HTTPtools"很可能包含了易于使用的命令行工具或者图形界面应用,这些工具通常具备以下特点: 1. **请求构造**:允许用户自定义请求方法、URL、头部和主体,以测试不同场景。 2. **响应查看**:显示服务器返回的完整...

    httptool:HTTP客户端请求工具

    **HttpTool:HTTP客户端请求工具详解** HttpTool是一款强大的HTTP客户端请求工具,它提供了两种不同的第三方HTTP客户端API供用户选择,分别是Jodd-Http和OkHttp3。这两款库都是Java开发人员在处理HTTP请求时常用的...

    Android-单文件Http工具类支持GETPOST断点续传多线程断点续传

    工具类会封装URL构造,发起网络请求,并处理返回的数据。 2. **POST请求**: POST请求则更复杂,它允许发送大量的数据到服务器,比如用户填写的表单数据。在HttpTools中,POST请求会将数据封装在请求体中,然后...

    Python库 | httptools-0.3.0-cp310-cp310-macosx_10_9_x86_64.whl

    资源分类:Python库 所属语言:Python 资源全名:httptools-0.3.0-cp310-cp310-macosx_10_9_x86_64.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    个人总结HTTP请求

    - **HttpTools**:封装了HTTP请求的工具包,提供了一种简单的方式来发起GET和POST请求,处理响应。 - **BitmapTools**:专用于图片处理,可能包含对Bitmap的创建、解码、压缩等功能。 - **ImageLoaderTools**:...

    HttpTools.java

    发送Json数据,绝对有效

    Python库 | httptools-0.3.0-cp38-cp38-macosx_10_9_x86_64.whl

    资源分类:Python库 所属语言:Python 资源全名:httptools-0.3.0-cp38-cp38-macosx_10_9_x86_64.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    Python库 | httptools-0.2.0-cp38-cp38-macosx_10_14_x86_64.whl

    资源分类:Python库 所属语言:Python 资源全名:httptools-0.2.0-cp38-cp38-macosx_10_14_x86_64.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    Uvicorn是一个超快速的ASGI服务器使用uvloop和httptools实现

    2. **httptools**:这个库是HTTP协议解析器,为Uvicorn提供了高效且准确的HTTP请求和响应处理。它能快速解析HTTP头部和正文,使得Uvicorn在处理HTTP请求时更加得心应手。 **四、Uvicorn的特性** 1. **高性能**:...

    httptools:httptools使用脚本功能帮助您捕获,重复和实时拦截HTTP请求。 它建立在mitmproxy之上

    httptools捕捉| 拦截重复httptools帮助您捕捉,重复与脚本功能实时拦截HTTP请求,是建立在之上 。 用 在印度安装 pip install http-tools开发 $ git clone https://github.com/MobSF/httptools.git$ cd httptools$ ...

    curltools_demo

    `curltools_demo`是一个基于开源库`curl`的工具...对于任何需要在不同平台上进行网络通信的开发者而言,这是一个非常实用的工具。`curtest`文件则帮助我们理解并测试这些功能,确保它们能在实际应用中正确无误地工作。

    httptools:在不破坏原始API的情况下,通过使用Web框架中的功能增强基本的nethttp包

    软件包httptools是Go的net / http的简单帮助程序类型的集合。 有关详细信息和示例,请参阅。 人为的例子 r := httptools . NewRegexpSwitch ( map [ string ]http. Handler { "/people/(.+)" : httptools. L { ...

Global site tag (gtag.js) - Google Analytics