HttpClient4.3 第二次封装

简介:

httpclient.java

package com.httpclint.util;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.apache.http.HttpException;
import org.apache.http.entity.mime.content.ByteArrayBody;
import org.apache.http.entity.mime.content.FileBody;

/**
 * HTTP工具类,封装HttpClient4.3.x来对外提供简化的HTTP请求
 * @author   yangjian1004
 * @Date     Aug 5, 2014     
 */
public class HttpClient {

	private HttpProxy proxy;

	/**
	 * 设置代理访问网络
	 * @param proxy
	 */
	public void setProxy(HttpProxy proxy) {
		this.proxy = proxy;
	}

	/**
	 * 是否启用SSL模式
	 * @param enabled
	 */
	public void enableSSL(boolean enabled) {
		HttpClientWrapper.enabledSSL(enabled);
	}

	/**
	 * 使用Get方式 根据URL地址,获取ResponseStatus对象
	 * 
	 * @param url
	 *            完整的URL地址
	 * @return ResponseStatus 如果发生异常则返回null,否则返回ResponseStatus对象
	 * @throws IOException 
	 * @throws HttpException 
	 */
	public ResponseStatus get(String url) throws HttpException, IOException {
		HttpClientWrapper hw = new HttpClientWrapper(proxy);
		return hw.sendRequest(url);
	}

	/**
	 * 使用Get方式 根据URL地址,获取ResponseStatus对象
	 * 
	 * @param url
	 *            完整的URL地址
	 * @param urlEncoding
	 *            编码,可以为null
	 * @return ResponseStatus 如果发生异常则返回null,否则返回ResponseStatus对象
	 */
	public ResponseStatus get(String url, String urlEncoding) {
		HttpClientWrapper hw = new HttpClientWrapper(proxy);
		ResponseStatus response = null;
		try {
			response = hw.sendRequest(url, urlEncoding);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return response;
	}

	/**
	 * 将参数拼装在url中,进行post请求。
	 * 
	 * @param url
	 * @return
	 */
	public ResponseStatus post(String url) {
		HttpClientWrapper hw = new HttpClientWrapper(proxy);
		ResponseStatus ret = null;
		try {
			setParams(url, hw);
			ret = hw.postNV(url);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return ret;
	}

	private void setParams(String url, HttpClientWrapper hw) {
		String[] paramStr = url.split("[?]"2);
		if (paramStr == null || paramStr.length != 2) {
			return;
		}
		String[] paramArray = paramStr[1].split("[&]");
		if (paramArray == null) {
			return;
		}
		for (String param : paramArray) {
			if (param == null || "".equals(param.trim())) {
				continue;
			}
			String[] keyValue = param.split("[=]"2);
			if (keyValue == null || keyValue.length != 2) {
				continue;
			}
			hw.addNV(keyValue[0], keyValue[1]);
		}
	}

	/**
	 * 上传文件(包括图片)
	 * 
	 * @param url
	 *            请求URL
	 * @param paramsMap
	 *            参数和值
	 * @return
	 */
	public ResponseStatus post(String url, Map<StringObject> paramsMap) {
		HttpClientWrapper hw = new HttpClientWrapper(proxy);
		ResponseStatus ret = null;
		try {
			setParams(url, hw);
			Iterator<String> iterator = paramsMap.keySet().iterator();
			while (iterator.hasNext()) {
				String key = iterator.next();
				Object value = paramsMap.get(key);
				if (value instanceof File) {
					FileBody fileBody = new FileBody((File) value);
					hw.getContentBodies().add(fileBody);
				} else if (value instanceof byte[]) {
					byte[] byteVlue = (byte[]) value;
					ByteArrayBody byteArrayBody = new ByteArrayBody(byteVlue, key);
					hw.getContentBodies().add(byteArrayBody);
				} else {
					if (value != null && !"".equals(value)) {
						hw.addNV(keyString.valueOf(value));
					} else {
						hw.addNV(key"");
					}
				}
			}
			ret = hw.postEntity(url);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return ret;
	}

	/**
	 * 使用post方式,发布对象转成的json给Rest服务。
	 * 
	 * @param url
	 * @param jsonBody
	 * @return
	 */
	public ResponseStatus post(String url, String jsonBody) {
		return post(url, jsonBody, "application/json");
	}

	/**
	 * 使用post方式,发布对象转成的xml给Rest服务
	 * 
	 * @param url
	 *            URL地址
	 * @param xmlBody
	 *            xml文本字符串
	 * @return ResponseStatus 如果发生异常则返回空,否则返回ResponseStatus对象
	 */
	public ResponseStatus postXml(String url, String xmlBody) {
		return post(url, xmlBody, "application/xml");
	}

	private ResponseStatus post(String url, String body, String contentType) {
		HttpClientWrapper hw = new HttpClientWrapper(proxy);
		ResponseStatus ret = null;
		try {
			hw.addNV("body", body);
			ret = hw.postNV(url, contentType);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return ret;
	}

	public static void main(String[] args) throws HttpException, IOException {
		testGet();
		//testUploadFile();
	}

	//test
	public static void testGet() throws HttpException, IOException {
		String url = "http://www.baidu.com/";
		HttpClient c = new HttpClient();
		ResponseStatus r = c.get(url);
		System.out.println(r.getContent());
	}

	//test
	public static void testUploadFile() {
		try {
			HttpClient c = new HttpClient();
			String url = "http://localhost:8280/jfly/action/admin/user/upload.do";
			Map<StringObject> paramsMap = new HashMap<StringObject>();
			paramsMap.put("userName""jj");
			paramsMap.put("password""jj");
			paramsMap.put("filePath"new File("C:\\Users\\yangjian1004\\Pictures\\default (1).jpeg"));
			ResponseStatus ret = c.post(url, paramsMap);
			System.out.println(ret.getContent());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

package com.httpclint.util;

import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.CodingErrorAction;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.apache.http.Consts;
import org.apache.http.Header;
import org.apache.http.HeaderElement;
import org.apache.http.HttpEntity;
import org.apache.http.HttpException;
import org.apache.http.HttpHeaders;
import org.apache.http.HttpHost;
import org.apache.http.NameValuePair;
import org.apache.http.StatusLine;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.config.ConnectionConfig;
import org.apache.http.config.MessageConstraints;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.config.SocketConfig;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.ContentBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.CharsetUtils;
import org.apache.http.util.EntityUtils;

/**
 * 封装HttpClient
 * <p>
 * @author   yangjian1004
 * @Date     Aug 5, 2014     
 */
public class HttpClientWrapper {

	private enum HttpMethod {
		GET, POST
	}

	private static CloseableHttpClient client;
	private List<ContentBody> contentBodies;
	private List<NameValuePair> nameValuePostBodies;
	private static PoolingHttpClientConnectionManager connManager = null;
	
	
	public static void enabledSSL(boolean enabled) {
		if (enabled) {
			try {
				SSLContext sslContext = SSLContexts.custom().useTLS().build();
				sslContext.init(nullnew TrustManager[] { new X509TrustManager() {

					public void checkClientTrusted(java.security.cert.X509Certificate[] arg0, String arg1)
							throws CertificateException {
					}

					public void checkServerTrusted(java.security.cert.X509Certificate[] arg0, String arg1)
							throws CertificateException {
					}

					public X509Certificate[] getAcceptedIssuers() {
						return null;
					}
				} }, null);
				Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder
						.<ConnectionSocketFactory> create().register("http", PlainConnectionSocketFactory.INSTANCE)
						.register("https"new SSLConnectionSocketFactory(sslContext)).build();
				connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
				SocketConfig socketConfig = SocketConfig.custom().setTcpNoDelay(true).build();
				connManager.setDefaultSocketConfig(socketConfig);
				MessageConstraints messageConstraints = MessageConstraints.custom().setMaxHeaderCount(200)
						.setMaxLineLength(2000).build();
				
				ConnectionConfig connectionConfig = ConnectionConfig.custom()
						.setMalformedInputAction(CodingErrorAction.IGNORE)
						.setUnmappableInputAction(CodingErrorAction.IGNORE).setCharset(Consts.UTF_8)
						.setMessageConstraints(messageConstraints).build();
				connManager.setDefaultConnectionConfig(connectionConfig);
				connManager.setMaxTotal(200);
				connManager.setDefaultMaxPerRoute(20);
			} catch (KeyManagementException e) {

			} catch (NoSuchAlgorithmException e) {

			}
		}
	}

	public HttpClientWrapper(HttpProxy proxy) {
		super();
		//client                 = HttpClientBuilder.create().build();//不使用连接池
		client = this.getCloseableHttpClient(proxy);
		this.contentBodies = new ArrayList<ContentBody>();
		this.nameValuePostBodies = new LinkedList<NameValuePair>();
	}

	private CloseableHttpClient getCloseableHttpClient(HttpProxy proxy) {
		if (null != proxy) {
			HttpHost proxyHost = new HttpHost(proxy.getHost(), proxy.getPort());
			CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
			if (null != proxy.getUser() && null != proxy.getPassword()) {
				credentialsProvider.setCredentials(new AuthScope(proxy.getHost(), proxy.getPort()),
						new UsernamePasswordCredentials(proxy.getUser(), proxy.getPassword()));
			}
			return HttpClients.custom().setProxy(proxyHost).setDefaultCredentialsProvider(credentialsProvider).build();
		} else {
			return HttpClients.custom().setConnectionManager(connManager).build();
		}
	}

	/**
	 * Get方式访问URL
	 * 
	 * @param url
	 * @return
	 * @throws HttpException
	 * @throws IOException
	 */
	public ResponseStatus sendRequest(String url) throws HttpException, IOException {
		return this.sendRequest(url, "UTF-8", HttpMethod.GET, null);
	}

	/**
	 * Get方式访问URL
	 * 
	 * @param url
	 * @param urlEncoding
	 * @return
	 * @throws HttpException
	 * @throws IOException
	 */
	public ResponseStatus sendRequest(String url, String urlEncoding) throws HttpException, IOException {
		return this.sendRequest(url, urlEncoding, HttpMethod.GET, null);
	}

	/**
	 * POST方式发送名值对请求URL
	 * 
	 * @param url
	 * @return
	 * @throws HttpException
	 * @throws IOException
	 */
	public ResponseStatus postNV(String url) throws HttpException, IOException {
		return this.sendRequest(url, "UTF-8", HttpMethod.POST, null);
	}

	public ResponseStatus postNV(String url, String contentType) throws HttpException, IOException {
		return sendRequest(url, "UTF-8", HttpMethod.POST, contentType);
	}

	/**
	 * 根据url编码,请求方式,请求URL
	 * 
	 * @param urlstr
	 * @param urlEncoding
	 * @param bodyType
	 * @return
	 * @throws HttpException
	 * @throws IOException
	 */
	public ResponseStatus sendRequest(String urlstr, String urlEncoding, HttpMethod bodyType, String contentType)
			throws HttpException, IOException {

		if (urlstr == null)
			return null;

		String url = urlstr;
		if (urlEncoding != null)
			url = HttpClientWrapper.encodeURL(url.trim(), urlEncoding);
		
		HttpEntity entity = null;
		HttpRequestBase request = null;
		CloseableHttpResponse response = null;
		try {
			if (HttpMethod.GET == bodyType) {
				request = new HttpGet(url);
			} else if (HttpMethod.POST == bodyType) {
				this.parseUrl(url);
				HttpPost httpPost = new HttpPost(toUrl());
				List<NameValuePair> nvBodyList = this.getNVBodies();
				httpPost.setEntity(new UrlEncodedFormEntity(nvBodyList, urlEncoding));
				request = httpPost;
			}

			if (contentType != null) {
				request.addHeader(HttpHeaders.CONTENT_TYPE, contentType);
			}
			
			//setTimeOut(request, timeout);
			request.addHeader(HttpHeaders.USER_AGENT,
					"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)");

			response = client.execute(request);
			entity = response.getEntity(); // 获取响应实体
			StatusLine statusLine = response.getStatusLine();
			ResponseStatus ret = new ResponseStatus();
			ret.setStatusCode(statusLine.getStatusCode());
			ret.setEncoding(urlEncoding);
			getResponseStatus(entity, ret);
			return ret;
		} finally {
			close(entity, request, response);
		}
	}
	
	private void getResponseStatus(HttpEntity entity, ResponseStatus ret) throws IOException {
		Header enHeader = entity.getContentEncoding();
		if (enHeader != null) {
			String charset = enHeader.getValue().toLowerCase();
			ret.setEncoding(charset);
		}
		String contenttype = this.getResponseStatusType(entity);
		ret.setContentType(contenttype);
		ret.setContentTypeString(this.getResponseStatusTypeString(entity));
		ret.setContentBytes(EntityUtils.toByteArray(entity));
	}

	public ResponseStatus postEntity(String url) throws HttpException, IOException {
		return this.postEntity(url, "UTF-8");
	}

	/**
	 * POST方式发送名值对请求URL,上传文件(包括图片)
	 * 
	 * @param url
	 * @return
	 * @throws HttpException
	 * @throws IOException
	 */
	public ResponseStatus postEntity(String url, String urlEncoding) throws HttpException, IOException {
		if (url == null)
			return null;

		HttpEntity entity = null;
		HttpRequestBase request = null;
		CloseableHttpResponse response = null;
		try {
			this.parseUrl(url);
			HttpPost httpPost = new HttpPost(toUrl());

			//对请求的表单域进行填充  
			MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
			entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
			for (NameValuePair nameValuePair : this.getNVBodies()) {
				entityBuilder.addPart(nameValuePair.getName(),
						new StringBody(nameValuePair.getValue(), ContentType.create("text/plain", urlEncoding)));
			}
			for (ContentBody contentBody : getContentBodies()) {
				entityBuilder.addPart("file", contentBody);
			}
			entityBuilder.setCharset(CharsetUtils.get(urlEncoding));
			httpPost.setEntity(entityBuilder.build());
			request = httpPost;
			response = client.execute(request);

			//响应状态
			StatusLine statusLine = response.getStatusLine();
			// 获取响应对象
			entity = response.getEntity();
			ResponseStatus ret = new ResponseStatus();
			ret.setStatusCode(statusLine.getStatusCode());
			getResponseStatus(entity, ret);
			return ret;
		} finally {
			close(entity, request, response);
		}
	}

	private void close(HttpEntity entity, HttpRequestBase request, CloseableHttpResponse response) throws IOException {
		if (request != null)
			request.releaseConnection();
		if (entity != null)
			entity.getContent().close();
		if (response != null)
			response.close();
	}

	public NameValuePair[] getNVBodyArray() {
		List<NameValuePair> list = this.getNVBodies();
		if (list == null || list.isEmpty())
			return null;
		NameValuePair[] nvps = new NameValuePair[list.size()];
		Iterator<NameValuePair> it = list.iterator();
		int count = 0;
		while (it.hasNext()) {
			NameValuePair nvp = it.next();
			nvps[count++] = nvp;
		}
		return nvps;
	}

	public List<NameValuePair> getNVBodies() {
		return Collections.unmodifiableList(this.nameValuePostBodies);
	}

	private String getResponseStatusType(HttpEntity method) {
		Header contenttype = method.getContentType();
		if (contenttype == null)
			return null;
		String ret = null;
		try {
			HeaderElement[] hes = contenttype.getElements();
			if (hes != null && hes.length > 0) {
				ret = hes[0].getName();
			}
		} catch (Exception e) {
		}
		return ret;
	}

	private String getResponseStatusTypeString(HttpEntity method) {
		Header contenttype = method.getContentType();
		if (contenttype == null)
			return null;
		return contenttype.getValue();
	}

	static Set<Character> BEING_ESCAPED_CHARS = new HashSet<Character>();
	static {
		char[] signArray = { ' ''\\''‘'']''!''^''#''`''$''{''%''|''}''(''+'')''<''>',
				';''[' };
		for (int i = 0; i < signArray.length; i++) {
			BEING_ESCAPED_CHARS.add(new Character(signArray[i]));
		}
	}

	public static String encodeURL(String url, String encoding) {
		if (url == null)
			return null;
		if (encoding == null)
			return url;

		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < url.length(); i++) {
			char c = url.charAt(i);
			if (c == 10) {
				continue;
			} else if (BEING_ESCAPED_CHARS.contains(new Character(c)) || c == 13 || c > 126) {
				try {
					sb.append(URLEncoder.encode(String.valueOf(c), encoding));
				} catch (Exception e) {
					sb.append(c);
				}
			} else {
				sb.append(c);
			}
		}
		return sb.toString().replaceAll("\\+""%20");
	}

	private String protocol;
	private String host;
	private int port;
	private String dir;
	private String uri;
	private final static int DefaultPort = 80;
	private final static String ProtocolSeparator = "://";
	private final static String PortSeparator = ":";
	private final static String HostSeparator = "/";
	private final static String DirSeparator = "/";

	private void parseUrl(String url) {
		this.protocol = null;
		this.host = null;
		this.port = DefaultPort;
		this.dir = "/";
		this.uri = dir;

		if (url == null || url.length() == 0)
			return;
		String u = url.trim();
		boolean MeetProtocol = false;
		int pos = u.indexOf(ProtocolSeparator);
		if (pos > 0) {
			MeetProtocol = true;
			this.protocol = u.substring(0, pos);
			pos += ProtocolSeparator.length();
		}
		int posStartDir = 0;
		if (MeetProtocol) {
			int pos2 = u.indexOf(PortSeparator, pos);
			if (pos2 > 0) {
				this.host = u.substring(pos, pos2);
				pos2 = pos2 + PortSeparator.length();
				int pos3 = u.indexOf(HostSeparator, pos2);
				String PortStr = null;
				if (pos3 > 0) {
					PortStr = u.substring(pos2, pos3);
					posStartDir = pos3;
				} else {
					int pos4 = u.indexOf("?");
					if (pos4 > 0) {
						PortStr = u.substring(pos2, pos4);
						posStartDir = -1;
					} else {
						PortStr = u.substring(pos2);
						posStartDir = -1;
					}
				}
				try {
					this.port = Integer.parseInt(PortStr);
				} catch (Exception e) {
				}
			} else {
				pos2 = u.indexOf(HostSeparator, pos);
				if (pos2 > 0) {
					this.host = u.substring(pos, pos2);
					posStartDir = pos2;
				} else {
					this.host = u.substring(pos);
					posStartDir = -1;
				}
			}

			pos = u.indexOf(HostSeparator, pos);
			pos2 = u.indexOf("?");
			if (pos > 0 && pos2 > 0) {
				this.uri = u.substring(pos, pos2);
			} else if (pos > 0 && pos2 < 0) {
				this.uri = u.substring(pos);
			}
		}

		if (posStartDir >= 0) {
			int pos2 = u.lastIndexOf(DirSeparator, posStartDir);
			if (pos2 > 0) {
				this.dir = u.substring(posStartDir, pos2 + 1);
			}
		}

	}

	private String toUrl() {
		StringBuffer ret = new StringBuffer();
		if (this.protocol != null) {
			ret.append(this.protocol);
			ret.append(ProtocolSeparator);
			if (this.host != null)
				ret.append(this.host);
			if (this.port != DefaultPort) {
				ret.append(PortSeparator);
				ret.append(this.port);
			}
		}
		ret.append(this.uri);
		return ret.toString();
	}

	public void addNV(String name, String value) {
		BasicNameValuePair nvp = new BasicNameValuePair(name, value);
		this.nameValuePostBodies.add(nvp);
	}

	public void clearNVBodies() {
		this.nameValuePostBodies.clear();
	}

	public List<ContentBody> getContentBodies() {
		return contentBodies;
	}

}

package com.httpclint.util;

public class HttpProxy {

	private String host;
	private int port;
	private String user;
	private String password;

	public HttpProxy(String ipAndPort) {
		this.host = ipAndPort.split(":")[0];
		this.port = Integer.parseInt(ipAndPort.split(":")[1]);
	}

	public HttpProxy(String host, int port) {
		super();
		this.host = host;
		this.port = port;
	}

	public HttpProxy(String host, int port, String user, String password) {
		super();
		this.host = host;
		this.port = port;
		this.user = user;
		this.password = password;
	}

	public String getHost() {
		return host;
	}

	public void setHost(String host) {
		this.host = host;
	}

	public int getPort() {
		return port;
	}

	public void setPort(int port) {
		this.port = port;
	}

	public String getUser() {
		return user;
	}

	public void setUser(String user) {
		this.user = user;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

}

package com.httpclint.util;
 
import java.io.UnsupportedEncodingException;
 
/**
 * 封装HttpClient返回数据
 * <p>
 * @author   yangjian1004
 * @Date     Aug 5, 2014     
 */
public class ResponseStatus {
	
    private String encoding;
 
    private byte[] contentBytes;
 
    private int statusCode;
 
    private String contentType;
 
    private String contentTypeString;
 
    public String getEncoding() {
        return encoding;
    }
 
    public void setEncoding(String encoding) {
        this.encoding = encoding;
    }
 
    public String getContentType() {
        return this.contentType;
    }
 
    public void setContentType(String contentType) {
        this.contentType = contentType;
    }
 
    public String getContentTypeString() {
        return this.contentTypeString;
    }
 
    public void setContentTypeString(String contenttypeString) {
        this.contentTypeString = contenttypeString;
    }
 
    public String getContent() throws UnsupportedEncodingException {
        return this.getContent(this.encoding);
    }
 
    public String getContent(String encoding) throws UnsupportedEncodingException {
        if (encoding == null) {
            return new String(contentBytes);
        }
        return new String(contentBytes, encoding);
    }
 
    public String getUTFContent() throws UnsupportedEncodingException {
        return this.getContent("UTF-8");
    }
 
    public byte[] getContentBytes() {
        return contentBytes;
    }
 
    public void setContentBytes(byte[] contentBytes) {
        this.contentBytes = contentBytes;
    }
 
    public int getStatusCode() {
        return statusCode;
    }
 
    public void setStatusCode(int statusCode) {
        this.statusCode = statusCode;
    }
 
}

http://download.csdn.net/detail/jelly_8090/7923537

目录
相关文章
|
7月前
|
Apache
HttpClient实现RPC调用
HttpClient实现RPC调用
23 0
|
5月前
|
JSON Java 数据格式
万字长文讲解调用第三方接口,RestTemplate,urlConnection使用详解,java代码模拟postman发送请求
万字长文讲解调用第三方接口,RestTemplate,urlConnection使用详解,java代码模拟postman发送请求
48 0
万字长文讲解调用第三方接口,RestTemplate,urlConnection使用详解,java代码模拟postman发送请求
|
7月前
|
网络协议 Linux Apache
httpClient调用失败和配置优化
httpClient调用失败和配置优化
90 0
|
11月前
uiapp请求方法封装
uiapp请求方法封装
|
11月前
请求方法封装
请求方法封装
|
12月前
|
消息中间件 JavaScript 小程序
OkHttp完美封装,一行搞完外部请求
OkHttp完美封装,一行搞完外部请求
|
12月前
|
JSON JavaScript 小程序
Java实现调用HTTP请求的几种常见方式
Java实现调用HTTP请求的几种常见方式
|
Web App开发 Apache
http请求重复问题解决【防止HttpClient重复请求】
http请求重复问题解决【防止HttpClient重复请求】
488 0
http请求重复问题解决【防止HttpClient重复请求】
|
XML 前端开发 JavaScript
如何使用代码来构造HTTP请求?
如何使用代码来构造HTTP请求?
如何使用代码来构造HTTP请求?