JAVA發(fā)送HTTP請(qǐng)求的多種方式詳細(xì)總結(jié)
程序員日常工作中,發(fā)送http請(qǐng)求特別常見(jiàn)。本文以Java為例,總結(jié)發(fā)送http請(qǐng)求的多種方式。
1. HttpURLConnection
使用JDK原生提供的net,無(wú)需其他jar包,代碼如下:
import com.alibaba.fastjson.JSON; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import java.util.Map; public class HttpTest1 { public static void main(String[] args) { HttpURLConnection con = null; BufferedReader buffer = null; StringBuffer resultBuffer = null; try { URL url = new URL("http://10.30.10.151:8012/gateway.do"); //得到連接對(duì)象 con = (HttpURLConnection) url.openConnection(); //設(shè)置請(qǐng)求類(lèi)型 con.setRequestMethod("POST"); //設(shè)置Content-Type,此處根據(jù)實(shí)際情況確定 con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); //允許寫(xiě)出 con.setDoOutput(true); //允許讀入 con.setDoInput(true); //不使用緩存 con.setUseCaches(false); OutputStream os = con.getOutputStream(); Map paraMap = new HashMap(); paraMap.put("type", "wx"); paraMap.put("mchid", "10101"); //組裝入?yún)? os.write(("consumerAppId=test&serviceName=queryMerchantService¶ms=" + JSON.toJSONString(paraMap)).getBytes()); //得到響應(yīng)碼 int responseCode = con.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { //得到響應(yīng)流 InputStream inputStream = con.getInputStream(); //將響應(yīng)流轉(zhuǎn)換成字符串 resultBuffer = new StringBuffer(); String line; buffer = new BufferedReader(new InputStreamReader(inputStream, "GBK")); while ((line = buffer.readLine()) != null) { resultBuffer.append(line); } System.out.println("result:" + resultBuffer.toString()); } } catch (Exception e) { e.printStackTrace(); } } }
2. HttpClient
需要用到commons-httpclient-3.1.jar,maven依賴(lài)如下:
<dependency> <groupId>commons-httpclient</groupId> <artifactId>commons-httpclient</artifactId> <version>3.1</version> </dependency>
代碼如下:
import com.alibaba.fastjson.JSON; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.methods.PostMethod; import java.io.IOException; import java.util.HashMap; import java.util.Map; public class HttpTest2 { public static void main(String[] args) { HttpClient httpClient = new HttpClient(); PostMethod postMethod = new PostMethod("http://10.30.10.151:8012/gateway.do"); postMethod.addRequestHeader("accept", "*/*"); //設(shè)置Content-Type,此處根據(jù)實(shí)際情況確定 postMethod.addRequestHeader("Content-Type", "application/x-www-form-urlencoded"); //必須設(shè)置下面這個(gè)Header //添加請(qǐng)求參數(shù) Map paraMap = new HashMap(); paraMap.put("type", "wx"); paraMap.put("mchid", "10101"); postMethod.addParameter("consumerAppId", "test"); postMethod.addParameter("serviceName", "queryMerchantService"); postMethod.addParameter("params", JSON.toJSONString(paraMap)); String result = ""; try { int code = httpClient.executeMethod(postMethod); if (code == 200){ result = postMethod.getResponseBodyAsString(); System.out.println("result:" + result); } } catch (IOException e) { e.printStackTrace(); } } }
3. CloseableHttpClient
需要用到httpclient-4.5.6.jar,maven依賴(lài)如下:
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.6</version> </dependency>
代碼如下:
import com.alibaba.fastjson.JSON; import org.apache.http.Consts; import org.apache.http.HttpEntity; 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.HttpPost; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class HttpTest3 { public static void main(String[] args) { int timeout = 120000; CloseableHttpClient httpClient = HttpClients.createDefault(); RequestConfig defaultRequestConfig = RequestConfig.custom().setConnectTimeout(timeout) .setConnectionRequestTimeout(timeout).setSocketTimeout(timeout).build(); HttpPost httpPost = null; List<NameValuePair> nvps = null; CloseableHttpResponse responses = null;// 命名沖突,換一個(gè)名字,response HttpEntity resEntity = null; String result; try { httpPost = new HttpPost("http://10.30.10.151:8012/gateway.do"); httpPost.setConfig(defaultRequestConfig); Map paraMap = new HashMap(); paraMap.put("type", "wx"); paraMap.put("mchid", "10101"); nvps = new ArrayList<NameValuePair>(); nvps.add(new BasicNameValuePair("consumerAppId", "test")); nvps.add(new BasicNameValuePair("serviceName", "queryMerchantService")); nvps.add(new BasicNameValuePair("params", JSON.toJSONString(paraMap))); httpPost.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8)); responses = httpClient.execute(httpPost); resEntity = responses.getEntity(); result = EntityUtils.toString(resEntity, Consts.UTF_8); EntityUtils.consume(resEntity); System.out.println("result:" + result); } catch (Exception e) { e.printStackTrace(); } finally { try { responses.close(); httpClient.close(); } catch (IOException e) { e.printStackTrace(); } } } }
4. okhttp
需要用到okhttp-3.10.0.jar,maven依賴(lài)如下:
<dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>3.10.0</version> </dependency>
代碼如下:
import com.alibaba.fastjson.JSON; import okhttp3.*; import java.io.IOException; import java.util.HashMap; import java.util.Map; public class HttpTest4 { public static void main(String[] args) throws IOException { String url = "http://10.30.10.151:8012/gateway.do"; OkHttpClient client = new OkHttpClient(); Map paraMap = new HashMap(); paraMap.put("yybh", "1231231"); RequestBody requestBody = new MultipartBody.Builder() .addFormDataPart("consumerAppId", "tst") .addFormDataPart("serviceName", "queryCipher") .addFormDataPart("params", JSON.toJSONString(paraMap)) .build(); Request request = new Request.Builder() .url(url) .post(requestBody) .addHeader("Content-Type", "application/x-www-form-urlencoded") .build(); Response response = client .newCall(request) .execute(); if (response.isSuccessful()) { System.out.println("result:" + response.body().string()); } else { throw new IOException("Unexpected code " + response); } } }
5. Socket
使用JDK原生提供的net,無(wú)需其他jar包
此處參考:https://www.cnblogs.com/hehongtao/p/5276425.html
代碼如下:
import com.alibaba.fastjson.JSON; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.net.Socket; import java.net.URLEncoder; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; public class HttpTest6 { private static String encoding = "utf-8"; public static void main(String[] args) { try { Map paraMap = new HashMap(); paraMap.put("yybh", "12312311"); String data = URLEncoder.encode("consumerAppId", "utf-8") + "=" + URLEncoder.encode("test", "utf-8") + "&" + URLEncoder.encode("serviceName", "utf-8") + "=" + URLEncoder.encode("queryCipher", "utf-8") + "&" + URLEncoder.encode("params", "utf-8") + "=" + URLEncoder.encode(JSON.toJSONString(paraMap), "utf-8"); Socket s = new Socket("10.30.10.151", 8012); OutputStreamWriter osw = new OutputStreamWriter(s.getOutputStream()); StringBuffer sb = new StringBuffer(); sb.append("POST /gateway.do HTTP/1.1\r\n"); sb.append("Host: 10.30.10.151:8012\r\n"); sb.append("Content-Length: " + data.length() + "\r\n"); sb.append("Content-Type: application/x-www-form-urlencoded\r\n"); //注,這里很關(guān)鍵。這里一定要一個(gè)回車(chē)換行,表示消息頭完,不然服務(wù)器會(huì)等待 sb.append("\r\n"); osw.write(sb.toString()); osw.write(data); osw.write("\r\n"); osw.flush(); //--輸出服務(wù)器傳回的消息的頭信息 InputStream is = s.getInputStream(); String line = null; int contentLength = 0;//服務(wù)器發(fā)送回來(lái)的消息長(zhǎng)度 // 讀取所有服務(wù)器發(fā)送過(guò)來(lái)的請(qǐng)求參數(shù)頭部信息 do { line = readLine(is, 0); //如果有Content-Length消息頭時(shí)取出 if (line.startsWith("Content-Length")) { contentLength = Integer.parseInt(line.split(":")[1].trim()); } //打印請(qǐng)求部信息 System.out.print(line); //如果遇到了一個(gè)單獨(dú)的回車(chē)換行,則表示請(qǐng)求頭結(jié)束 } while (!line.equals("\r\n")); //--輸消息的體 System.out.print(readLine(is, contentLength)); //關(guān)閉流 is.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /* * 這里我們自己模擬讀取一行,因?yàn)槿绻褂肁PI中的BufferedReader時(shí),它是讀取到一個(gè)回車(chē)換行后 * 才返回,否則如果沒(méi)有讀取,則一直阻塞,直接服務(wù)器超時(shí)自動(dòng)關(guān)閉為止,如果此時(shí)還使用BufferedReader * 來(lái)讀時(shí),因?yàn)樽x到最后一行時(shí),最后一行后不會(huì)有回車(chē)換行符,所以就會(huì)等待。如果使用服務(wù)器發(fā)送回來(lái)的 * 消息頭里的Content-Length來(lái)截取消息體,這樣就不會(huì)阻塞 * * contentLe 參數(shù) 如果為0時(shí),表示讀頭,讀時(shí)我們還是一行一行的返回;如果不為0,表示讀消息體, * 時(shí)我們根據(jù)消息體的長(zhǎng)度來(lái)讀完消息體后,客戶(hù)端自動(dòng)關(guān)閉流,這樣不用先到服務(wù)器超時(shí)來(lái)關(guān)閉。 */ private static String readLine(InputStream is, int contentLe) throws IOException { ArrayList lineByteList = new ArrayList(); byte readByte; int total = 0; if (contentLe != 0) { do { readByte = (byte) is.read(); lineByteList.add(Byte.valueOf(readByte)); total++; } while (total < contentLe);//消息體讀還未讀完 } else { do { readByte = (byte) is.read(); lineByteList.add(Byte.valueOf(readByte)); } while (readByte != 10); } byte[] tmpByteArr = new byte[lineByteList.size()]; for (int i = 0; i < lineByteList.size(); i++) { tmpByteArr[i] = ((Byte) lineByteList.get(i)).byteValue(); } lineByteList.clear(); return new String(tmpByteArr, encoding); } }
6. RestTemplate
RestTemplate 是由Spring提供的一個(gè)HTTP請(qǐng)求工具。比傳統(tǒng)的Apache和HttpCLient便捷許多,能夠大大提高客戶(hù)端的編寫(xiě)效率。代碼如下:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; @Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate(ClientHttpRequestFactory factory){ return new RestTemplate(factory); } @Bean public ClientHttpRequestFactory simpleClientHttpRequestFactory(){ SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); factory.setConnectTimeout(15000); factory.setReadTimeout(5000); return factory; } } @Autowired RestTemplate restTemplate; @Test public void postTest() throws Exception { MultiValueMap<String, String> requestEntity = new LinkedMultiValueMap<>(); Map paraMap = new HashMap(); paraMap.put("type", "wx"); paraMap.put("mchid", "10101"); requestEntity.add("consumerAppId", "test"); requestEntity.add("serviceName", "queryMerchant"); requestEntity.add("params", JSON.toJSONString(paraMap)); RestTemplate restTemplate = new RestTemplate(); System.out.println(restTemplate.postForObject("http://10.30.10.151:8012/gateway.do", requestEntity, String.class)); }
總結(jié)
到此這篇關(guān)于JAVA發(fā)送HTTP請(qǐng)求的多種方式的文章就介紹到這了,更多相關(guān)JAVA發(fā)送HTTP請(qǐng)求方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot的SpringPropertyAction事務(wù)屬性源碼解讀
這篇文章主要介紹了springboot的SpringPropertyAction事務(wù)屬性源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11Spring?Data?Exists查詢(xún)最佳方法編寫(xiě)示例
這篇文章主要為大家介紹了Spring?Data?Exists查詢(xún)最佳方法編寫(xiě)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08Java游戲開(kāi)發(fā)之俄羅斯方塊的實(shí)現(xiàn)
俄羅斯方塊是一個(gè)最初由阿列克謝帕吉特諾夫在蘇聯(lián)設(shè)計(jì)和編程的益智類(lèi)視頻游戲。本文和大家分享了利用Java語(yǔ)言實(shí)現(xiàn)這一經(jīng)典的小游戲的示例代碼,需要的可以參考一下2022-05-05Java中生成微信小程序太陽(yáng)碼的實(shí)現(xiàn)方案
這篇文章主要介紹了Java中生成微信小程序太陽(yáng)碼的實(shí)現(xiàn)方案,本文講解了如何生成微信小程序太陽(yáng)碼,通過(guò)微信提供的兩種方案都可以實(shí)現(xiàn),在實(shí)際的項(xiàng)目中建議采用第二種方案,需要的朋友可以參考下2022-05-05