您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)使用Java 如何發(fā)送http請(qǐng)求,文章內(nèi)容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
1.情景展示
java發(fā)送get請(qǐng)求、post請(qǐng)求(form表單、json數(shù)據(jù))至另一服務(wù)器;
可設(shè)置HTTP請(qǐng)求頭部信息,可以接收服務(wù)器返回cookie信息,可以上傳文件等;
2.代碼實(shí)現(xiàn)
所需jar包:httpcore-4.4.1.jar;httpclient-4.4.1.jar;httpmime-4.4.1.jar;epoint-utils-9.3.3.jar
import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; import java.security.GeneralSecurityException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPatch; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.TrustStrategy; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.entity.mime.content.StringBody; 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.ssl.SSLContextBuilder; import org.apache.http.util.EntityUtils; import com.epoint.core.utils.string.StringUtil; /** * HttpClient工具類(lèi),使用http-client包實(shí)現(xiàn),原先的common-httpclient已經(jīng)淘汰 * * @作者 ko * @version [版本號(hào), 2017年10月18日] */ public class HttpUtil { private static PoolingHttpClientConnectionManager connMgr; private static RequestConfig requestConfig; private static final int MAX_TIMEOUT = 7000; /** * 直接以流返回 */ public static final int RTN_TYPE_1 = 1; /** * 直接以string返回 */ public static final int RTN_TYPE_2 = 2; /** * 以map返回,reslut:接口結(jié)果string;statusCode:http狀態(tài)碼 */ public static final int RTN_TYPE_3 = 3; /** * 以map返回,reslut:接口結(jié)果string;statusCode:http狀態(tài)碼;cookie:response的cookie * cookie值鍵值對(duì),格式 key1=value1;key2=value2;... */ public static final int RTN_TYPE_4 = 4; /** * 默認(rèn)上傳文件的文件流或file 的key Name */ private static final String DEFAULT_BINARYBODY_KEYNAME = "file"; static { // 設(shè)置連接池 connMgr = new PoolingHttpClientConnectionManager(); // 設(shè)置連接池大小 connMgr.setMaxTotal(100); connMgr.setDefaultMaxPerRoute(connMgr.getMaxTotal()); // 在提交請(qǐng)求之前 測(cè)試連接是否可用 connMgr.setValidateAfterInactivity(1); RequestConfig.Builder configBuilder = RequestConfig.custom(); // 設(shè)置連接超時(shí) configBuilder.setConnectTimeout(MAX_TIMEOUT); // 設(shè)置讀取超時(shí) configBuilder.setSocketTimeout(MAX_TIMEOUT); // 設(shè)置從連接池獲取連接實(shí)例的超時(shí) configBuilder.setConnectionRequestTimeout(MAX_TIMEOUT); requestConfig = configBuilder.build(); } /** * 發(fā)送 GET請(qǐng)求 * * @param apiUrl * API接口URL * @return String 響應(yīng)內(nèi)容 */ public static String doGet(String apiUrl) { return doHttp(apiUrl, null, "get", RTN_TYPE_2); } /** * 發(fā)送POST請(qǐng)求 * * @param apiUrl * API接口URL * @param params * K-V參數(shù) * @return String 響應(yīng)內(nèi)容 */ public static String doPost(String apiUrl, Map<String, Object> params) { return doHttp(apiUrl, params, "post", RTN_TYPE_2); } /** * 發(fā)送POST請(qǐng)求 * * @param apiUrl * API接口URL * @param json * json參數(shù) * @return String 響應(yīng)內(nèi)容 */ public static String doPostJson(String apiUrl, String json) { return doHttp(apiUrl, json, "post", RTN_TYPE_2); } /** * 發(fā)送 http 請(qǐng)求 * * @param apiUrl * API接口URL * @param params * {Map<String, Object> K-V形式、json字符串} * @param method * {null、或者post:POST請(qǐng)求、patch:PATCH請(qǐng)求、delete:DELETE請(qǐng)求、get:GET請(qǐng)求} * @param type * {HttpUtil.RTN_TYPE_1:請(qǐng)求返回stream(此時(shí)流需要在外部手動(dòng)關(guān)閉);HttpUtil. * RTN_TYPE_2:string;HttpUtil.RTN_TYPE_3:返回一個(gè)map,map包含結(jié)果( * 結(jié)果是string形式)以及http狀態(tài)碼;HttpUtil.RTN_TYPE_4:返回一個(gè)map,map包含結(jié)果( * 結(jié)果是string形式), http狀態(tài)碼和cookie;其他情況返回string} * 如果結(jié)果是個(gè)map,key為:result,statusCode,cookie,分別返回 結(jié)果 * string,http狀態(tài)碼,cookie; cookie值鍵值對(duì),格式 * key1=value1;key2=value2;... * @return stream或 string 或 map */ public static <T> T doHttp(String apiUrl, Object params, String method, int type) { return doHttp(apiUrl, null, params, method, type); } /** * 發(fā)送 http 請(qǐng)求 * * @param apiUrl * API接口URL * @param headerMap * header信息Map<String, String>,可設(shè)置cookie * @param params * {Map<String, Object> K-V形式、json字符串} * @param method * {null、或者post:POST請(qǐng)求、patch:PATCH請(qǐng)求、delete:DELETE請(qǐng)求、get:GET請(qǐng)求} * @param type * {HttpUtil.RTN_TYPE_1:請(qǐng)求返回stream(此時(shí)流需要在外部手動(dòng)關(guān)閉);HttpUtil. * RTN_TYPE_2:string;HttpUtil.RTN_TYPE_3:返回一個(gè)map,map包含結(jié)果( * 結(jié)果是string形式)以及http狀態(tài)碼;HttpUtil.RTN_TYPE_4:返回一個(gè)map,map包含結(jié)果( * 結(jié)果是string形式), http狀態(tài)碼和cookie;其他情況返回string} * 如果結(jié)果是個(gè)map,key為:result,statusCode,cookie,分別返回 結(jié)果 * string,http狀態(tài)碼,cookie; cookie值鍵值對(duì),格式 * key1=value1;key2=value2;... * @return stream或 string 或 map */ public static <T> T doHttp(String apiUrl, Map<String, String> headerMap, Object params, String method, int type) { CloseableHttpClient httpClient = null; if (isSSL(apiUrl)) { httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()) .setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build(); } else { httpClient = HttpClients.createDefault(); } return doHttp(httpClient, apiUrl, headerMap, params, method, type); } /** * 發(fā)送 http 請(qǐng)求 * * @param httpClient * httpclient對(duì)象 由外部傳入,用戶(hù) 需要保持登錄狀態(tài)等情況 此時(shí)如果要ssl,那么要在外部加入ssl特性 * httpClient = * HttpClients.custom().setSSLSocketFactory(HttpUtil. * createSSLConnSocketFactory()) * .setConnectionManager(HttpUtil.getConnMgr()). * setDefaultRequestConfig(HttpUtil..getRequestConfig()).build(); * @param apiUrl * API接口URL * @param headerMap * header信息Map<String, String>,可設(shè)置cookie * * @param params * {Map<String, Object> K-V形式、json字符串} * @param method * {null、或者post:POST請(qǐng)求、patch:PATCH請(qǐng)求、delete:DELETE請(qǐng)求、get:GET請(qǐng)求} * @param type * {HttpUtil.RTN_TYPE_1:請(qǐng)求返回stream(此時(shí)流需要在外部手動(dòng)關(guān)閉);HttpUtil. * RTN_TYPE_2:string;HttpUtil.RTN_TYPE_3:返回一個(gè)map,map包含結(jié)果( * 結(jié)果是string形式)以及http狀態(tài)碼;HttpUtil.RTN_TYPE_4:返回一個(gè)map,map包含結(jié)果( * 結(jié)果是string形式), http狀態(tài)碼和cookie;其他情況返回string} * 如果結(jié)果是個(gè)map,key為:result,statusCode,cookie,分別返回 結(jié)果 * string,http狀態(tài)碼,cookie; cookie值鍵值對(duì),格式 * key1=value1;key2=value2;... * @return stream或 string 或 map */ @SuppressWarnings("unchecked") public static <T> T doHttp(CloseableHttpClient httpClient, String apiUrl, Map<String, String> headerMap, Object params, String method, int type) { HttpRequestBase httpPost = null; if (StringUtil.isNotBlank(method)) { if ("patch".equalsIgnoreCase(method)) { httpPost = new HttpPatch(apiUrl); } else if ("delete".equalsIgnoreCase(method)) { httpPost = new HttpDelete(apiUrl); } else if ("get".equalsIgnoreCase(method)) { httpPost = new HttpGet(apiUrl); } else if ("post".equalsIgnoreCase(method)) { httpPost = new HttpPost(apiUrl); } } else { httpPost = new HttpPost(apiUrl); } CloseableHttpResponse response = null; try { // 設(shè)置header信息 if (headerMap != null && !headerMap.isEmpty()) { for (Map.Entry<String, String> entry : headerMap.entrySet()) { httpPost.addHeader(entry.getKey(), entry.getValue()); } } if (isSSL(apiUrl)) { httpPost.setConfig(requestConfig); } // 參數(shù)不為null、要處理參數(shù) if (params != null) { // get請(qǐng)求拼接在url后面 if (httpPost instanceof HttpGet) { StringBuffer param = new StringBuffer(); if (params instanceof Map) { Map<String, Object> paramsConvert = (Map<String, Object>) params; int i = 0; for (String key : paramsConvert.keySet()) { if (i == 0) param.append("?"); else param.append("&"); param.append(key).append("=").append(paramsConvert.get(key)); i++; } } else { param.append("?" + params.toString()); } apiUrl += param; } // delete請(qǐng)求暫不處理 else if (!(httpPost instanceof HttpDelete)) { // K-V形式 if (params instanceof Map) { Map<String, Object> paramsConvert = (Map<String, Object>) params; List<NameValuePair> pairList = new ArrayList<>(paramsConvert.size()); for (Map.Entry<String, Object> entry : paramsConvert.entrySet()) { NameValuePair pair = new BasicNameValuePair(entry.getKey(), entry.getValue() == null ? "" : entry.getValue().toString()); pairList.add(pair); } ((HttpEntityEnclosingRequestBase) httpPost) .setEntity(new UrlEncodedFormEntity(pairList, Charset.forName("UTF-8"))); } // json格式 else { StringEntity stringEntity = new StringEntity(params.toString(), "UTF-8"); stringEntity.setContentEncoding("UTF-8"); stringEntity.setContentType("application/json"); ((HttpEntityEnclosingRequestBase) httpPost).setEntity(stringEntity); } } } response = httpClient.execute(httpPost); // int statusCode = response.getStatusLine().getStatusCode(); // if (statusCode != HttpStatus.SC_OK) { // return null; // } HttpEntity entity = response.getEntity(); if (entity != null) { if (type == RTN_TYPE_1) { return (T) entity.getContent(); } else if (RTN_TYPE_2 == type) { return (T) EntityUtils.toString(entity, "UTF-8"); } else if (RTN_TYPE_3 == type || RTN_TYPE_4 == type) { Map<String, String> rtnMap = new HashMap<String, String>(); rtnMap.put("result", EntityUtils.toString(entity, "UTF-8")); rtnMap.put("statusCode", response.getStatusLine().getStatusCode() + ""); if (RTN_TYPE_4 == type) { rtnMap.put("cookie", getCookie(response)); } return (T) rtnMap; } else { return (T) EntityUtils.toString(entity, "UTF-8"); } } } catch (Exception e) { e.printStackTrace(); } finally { if (response != null && type != RTN_TYPE_1) { try { EntityUtils.consume(response.getEntity()); } catch (IOException e) { e.printStackTrace(); } } } return null; } /** * 上傳附件(post形式) * * @param url * 請(qǐng)求地址 * @param headerMap * header參數(shù)map Map<String, String> * @param paramMap * 額外的參數(shù)map,Map<String, String> * @param file * 可以選擇本地文件上傳;如果傳了file,又傳了fileName,那么文件名以fileName為準(zhǔn),否則 是file的文件名 * @param fileName * 以流傳輸時(shí),必須指定文件名 * @param ssl * 是否需要ssl * @return result,返回上傳結(jié)果,如果接口沒(méi)有返回值,則為狀態(tài)碼 */ public static String upload(String url, Map<String, String> headerMap, Map<String, String> paramMap, File file, String fileName, boolean ssl) { return upload(url, headerMap, paramMap, file, null, fileName, ssl); } /** * 上傳附件(post形式) * * @param url * 請(qǐng)求地址 * @param headerMap * header參數(shù)map Map<String, String> * @param paramMap * 額外的參數(shù)map,Map<String, String> * @param in * 文件流 * @param fileName * 以流傳輸時(shí),必須指定文件名 * @param ssl * 是否需要ssl * @return result,返回上傳結(jié)果,如果接口沒(méi)有返回值,則為狀態(tài)碼 */ public static String upload(String url, Map<String, String> headerMap, Map<String, String> paramMap, InputStream in, String fileName, boolean ssl) { return upload(url, headerMap, paramMap, null, in, fileName, ssl); } /** * 上傳附件(post形式) * * @param httpClient * 外部傳入httpClient * @param url * 請(qǐng)求地址 * @param headerMap * header參數(shù)map Map<String, String> * @param paramMap * 額外的參數(shù)map,Map<String, String> * @param file * 可以選擇本地文件上傳;如果傳了file,又傳了fileName,那么文件名以fileName為準(zhǔn),否則 是file的文件名 * @param fileName * 以流傳輸時(shí),必須指定文件名 * @param ssl * 是否需要ssl * @return result,返回上傳結(jié)果,如果接口沒(méi)有返回值,則為狀態(tài)碼 */ public static String upload(CloseableHttpClient httpClient, String url, Map<String, String> headerMap, Map<String, String> paramMap, File file, String fileName, boolean ssl) { return upload(httpClient, url, headerMap, paramMap, file, null, fileName, ssl); } /** * 上傳附件(post形式) * * @param httpClient * 外部傳入httpClient * @param url * 請(qǐng)求地址 * @param headerMap * header參數(shù)map Map<String, String> * @param paramMap * 額外的參數(shù)map,Map<String, String> * @param in * 文件流 * @param fileName * 以流傳輸時(shí),必須指定文件名 * @param ssl * 是否需要ssl * @return result,返回上傳結(jié)果,如果接口沒(méi)有返回值,則為狀態(tài)碼 */ public static String upload(CloseableHttpClient httpClient, String url, Map<String, String> headerMap, Map<String, String> paramMap, InputStream in, String fileName, boolean ssl) { return upload(httpClient, url, headerMap, paramMap, null, in, fileName, ssl); } /** * 上傳附件(post形式) * * @param url * 請(qǐng)求地址 * @param headerMap * header參數(shù)map Map<String, String> * @param paramMap * 額外的參數(shù)map,Map<String, String> * @param file * 可以選擇本地文件上傳,file,in互斥;如果傳了file,又傳了fileName,那么文件名以fileName為準(zhǔn),否則 * 是file的文件名 * @param in * 文件流 * @param fileName * 以流傳輸時(shí),必須指定文件名 * @param ssl * 是否需要ssl * @return result,返回上傳結(jié)果,如果接口沒(méi)有返回值,則為狀態(tài)碼 */ private static String upload(String url, Map<String, String> headerMap, Map<String, String> paramMap, File file, InputStream in, String fileName, boolean ssl) { CloseableHttpClient httpClient = null; if (ssl) { httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()) .setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build(); } else { httpClient = HttpClients.createDefault(); } return upload(httpClient, url, headerMap, paramMap, file, in, fileName, ssl); } /** * 上傳附件(post形式) * * @param httpClient * 外部傳入httpClient * @param url * 請(qǐng)求地址 * @param headerMap * header參數(shù)map Map<String, String> * @param paramMap * 額外的參數(shù)map,Map<String, String> * @param file * 可以選擇本地文件上傳,file,in互斥;如果傳了file,又傳了fileName,那么文件名以fileName為準(zhǔn),否則 * 是file的文件名 * @param in * 文件流 * @param fileName * 以流傳輸時(shí),必須指定文件名 * @param ssl * 是否需要ssl * @return result,返回上傳結(jié)果,如果接口沒(méi)有返回值,則為狀態(tài)碼 */ private static String upload(CloseableHttpClient httpClient, String url, Map<String, String> headerMap, Map<String, String> paramMap, File file, InputStream in, String fileName, boolean ssl) { String result = ""; CloseableHttpResponse response = null; try { HttpPost httpPost = new HttpPost(url); // 設(shè)置header信息 if (headerMap != null && !headerMap.isEmpty()) { for (Map.Entry<String, String> entry : headerMap.entrySet()) { httpPost.addHeader(entry.getKey(), entry.getValue()); } } if (ssl) { httpPost.setConfig(requestConfig); } MultipartEntityBuilder builder = MultipartEntityBuilder.create(); // 選擇以file形式上傳 if (file != null && file.exists()) { if (StringUtil.isNotBlank(fileName)) { builder.addBinaryBody(DEFAULT_BINARYBODY_KEYNAME, file, ContentType.DEFAULT_BINARY, fileName); } else { builder.addBinaryBody(DEFAULT_BINARYBODY_KEYNAME, file); } } // 以流上傳 else if (in != null && StringUtil.isNotBlank(fileName)) { builder.addBinaryBody(DEFAULT_BINARYBODY_KEYNAME, in, ContentType.DEFAULT_BINARY, fileName); } if (paramMap != null && !paramMap.isEmpty()) { for (Map.Entry<String, String> entry : paramMap.entrySet()) { builder.addPart(entry.getKey(), new StringBody(entry.getValue(), ContentType.TEXT_PLAIN)); } } HttpEntity reqEntity = builder.build(); httpPost.setEntity(reqEntity); response = httpClient.execute(httpPost); HttpEntity entity = response.getEntity(); if (entity != null) { result = EntityUtils.toString(entity, "UTF-8"); } else { result = response.getStatusLine().getStatusCode() + ""; } } catch (Exception e) { e.printStackTrace(); } finally { if (response != null) { try { EntityUtils.consume(response.getEntity()); } catch (IOException e) { e.printStackTrace(); } } } return result; } private static String getCookie(HttpResponse httpResponse) { Map<String, String> cookieMap = new HashMap<String, String>(64); Header headers[] = httpResponse.getHeaders("Set-Cookie"); if (headers == null || headers.length == 0) { return null; } String cookie = ""; for (int i = 0; i < headers.length; i++) { cookie += headers[i].getValue(); if (i != headers.length - 1) { cookie += ";"; } } String cookies[] = cookie.split(";"); for (String c : cookies) { c = c.trim(); if (cookieMap.containsKey(c.split("=")[0])) { cookieMap.remove(c.split("=")[0]); } cookieMap.put(c.split("=")[0], c.split("=").length == 1 ? "" : (c.split("=").length == 2 ? c.split("=")[1] : c.split("=", 2)[1])); } String cookiesTmp = ""; for (String key : cookieMap.keySet()) { cookiesTmp += key + "=" + cookieMap.get(key) + ";"; } return cookiesTmp.substring(0, cookiesTmp.length() - 2); } /** * 創(chuàng)建SSL安全連接 * * @return */ public static SSLConnectionSocketFactory createSSLConnSocketFactory() { SSLConnectionSocketFactory sslsf = null; try { SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { return true; } }).build(); sslsf = new SSLConnectionSocketFactory(sslContext, new HostnameVerifier() { @Override public boolean verify(String arg0, SSLSession arg1) { return true; } }); } catch (GeneralSecurityException e) { e.printStackTrace(); } return sslsf; } public static PoolingHttpClientConnectionManager getConnMgr() { return connMgr; } public static RequestConfig getRequestConfig() { return requestConfig; } private static boolean isSSL(String apiUrl) { if (apiUrl.indexOf("https") != -1 ) { return true; } else { return false; } } }
上述就是小編為大家分享的使用Java 如何發(fā)送http請(qǐng)求了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。