1. 程式人生 > >java 常見幾種傳送http請求案例

java 常見幾種傳送http請求案例

<span style="font-family: Arial, Helvetica, sans-serif;">import java.io.BufferedReader;</span>
  1. import java.io.FileOutputStream;

  2. import java.io.IOException;

  3. import java.io.InputStream;

  4. import java.io.InputStreamReader;

  5. import java.io.OutputStreamWriter;

  6. import java.io.UnsupportedEncodingException;

  7. import java.net.HttpURLConnection;

  8. import java.net.Socket;

  9. import java.net.URL;

  10. import java.net.URLConnection;

  11. import java.net.URLEncoder;

  12. import java.util.ArrayList;

  13. import java.util.HashMap;

  14. import java.util.Iterator;

  15. import java.util.List;

  16. import java.util.Map;

  17. import java.util.Map.Entry;

  18. import org.apache.http.HttpResponse;

  19. import org.apache.http.NameValuePair;

  20. import org.apache.http.client.HttpClient;

  21. import org.apache.http.client.entity.UrlEncodedFormEntity;

  22. import org.apache.http.client.methods.HttpGet;

  23. import org.apache.http.client.methods.HttpPost;

  24. import org.apache.http.impl.client.DefaultHttpClient;

  25. import org.apache.http.message.BasicNameValuePair;

  26. /**

  27. * @Description:傳送http請求幫助類

  28. * @author:liuyc

  29. * @time:2016年5月17日 下午3:25:32

  30. */

  31. public class HttpClientHelper {

  32. /**

  33. * @Description:使用HttpURLConnection傳送post請求

  34. * @author:liuyc

  35. * @time:2016年5月17日 下午3:26:07

  36. */

  37. public static String sendPost(String urlParam, Map<String, Object> params, String charset) {

  38. StringBuffer resultBuffer = null;

  39. // 構建請求引數

  40. StringBuffer sbParams = new StringBuffer();

  41. if (params != null && params.size() > 0) {

  42. for (Entry<String, Object> e : params.entrySet()) {

  43. sbParams.append(e.getKey());

  44. sbParams.append("=");

  45. sbParams.append(e.getValue());

  46. sbParams.append("&");

  47. }

  48. }

  49. HttpURLConnection con = null;

  50. OutputStreamWriter osw = null;

  51. BufferedReader br = null;

  52. // 傳送請求

  53. try {

  54. URL url = new URL(urlParam);

  55. con = (HttpURLConnection) url.openConnection();

  56. con.setRequestMethod("POST");

  57. con.setDoOutput(true);

  58. con.setDoInput(true);

  59. con.setUseCaches(false);

  60. con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

  61. if (sbParams != null && sbParams.length() > 0) {

  62. osw = new OutputStreamWriter(con.getOutputStream(), charset);

  63. osw.write(sbParams.substring(0, sbParams.length() - 1));

  64. osw.flush();

  65. }

  66. // 讀取返回內容

  67. resultBuffer = new StringBuffer();

  68. int contentLength = Integer.parseInt(con.getHeaderField("Content-Length"));

  69. if (contentLength > 0) {

  70. br = new BufferedReader(new InputStreamReader(con.getInputStream(), charset));

  71. String temp;

  72. while ((temp = br.readLine()) != null) {

  73. resultBuffer.append(temp);

  74. }

  75. }

  76. } catch (Exception e) {

  77. throw new RuntimeException(e);

  78. } finally {

  79. if (osw != null) {

  80. try {

  81. osw.close();

  82. } catch (IOException e) {

  83. osw = null;

  84. throw new RuntimeException(e);

  85. } finally {

  86. if (con != null) {

  87. con.disconnect();

  88. con = null;

  89. }

  90. }

  91. }

  92. if (br != null) {

  93. try {

  94. br.close();

  95. } catch (IOException e) {

  96. br = null;

  97. throw new RuntimeException(e);

  98. } finally {

  99. if (con != null) {

  100. con.disconnect();

  101. con = null;

  102. }

  103. }

  104. }

  105. }

  106. return resultBuffer.toString();

  107. }

  108. /**

  109. * @Description:使用URLConnection傳送post

  110. * @author:liuyc

  111. * @time:2016年5月17日 下午3:26:52

  112. */

  113. public static String sendPost2(String urlParam, Map<String, Object> params, String charset) {

  114. StringBuffer resultBuffer = null;

  115. // 構建請求引數

  116. StringBuffer sbParams = new StringBuffer();

  117. if (params != null && params.size() > 0) {

  118. for (Entry<String, Object> e : params.entrySet()) {

  119. sbParams.append(e.getKey());

  120. sbParams.append("=");

  121. sbParams.append(e.getValue());

  122. sbParams.append("&");

  123. }

  124. }

  125. URLConnection con = null;

  126. OutputStreamWriter osw = null;

  127. BufferedReader br = null;

  128. try {

  129. URL realUrl = new URL(urlParam);

  130. // 開啟和URL之間的連線

  131. con = realUrl.openConnection();

  132. // 設定通用的請求屬性

  133. con.setRequestProperty("accept", "*/*");

  134. con.setRequestProperty("connection", "Keep-Alive");

  135. con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

  136. con.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");

  137. // 傳送POST請求必須設定如下兩行

  138. con.setDoOutput(true);

  139. con.setDoInput(true);

  140. // 獲取URLConnection物件對應的輸出流

  141. osw = new OutputStreamWriter(con.getOutputStream(), charset);

  142. if (sbParams != null && sbParams.length() > 0) {

  143. // 傳送請求引數

  144. osw.write(sbParams.substring(0, sbParams.length() - 1));

  145. // flush輸出流的緩衝

  146. osw.flush();

  147. }

  148. // 定義BufferedReader輸入流來讀取URL的響應

  149. resultBuffer = new StringBuffer();

  150. int contentLength = Integer.parseInt(con.getHeaderField("Content-Length"));

  151. if (contentLength > 0) {

  152. br = new BufferedReader(new InputStreamReader(con.getInputStream(), charset));

  153. String temp;

  154. while ((temp = br.readLine()) != null) {

  155. resultBuffer.append(temp);

  156. }

  157. }

  158. } catch (Exception e) {

  159. throw new RuntimeException(e);

  160. } finally {

  161. if (osw != null) {

  162. try {

  163. osw.close();

  164. } catch (IOException e) {

  165. osw = null;

  166. throw new RuntimeException(e);

  167. }

  168. }

  169. if (br != null) {

  170. try {

  171. br.close();

  172. } catch (IOException e) {

  173. br = null;

  174. throw new RuntimeException(e);

  175. }

  176. }

  177. }

  178. return resultBuffer.toString();

  179. }

  180. /**

  181. * @Description:傳送get請求儲存下載檔案

  182. * @author:liuyc

  183. * @time:2016年5月17日 下午3:27:29

  184. */

  185. public static void sendGetAndSaveFile(String urlParam, Map<String, Object> params, String fileSavePath) {

  186. // 構建請求引數

  187. StringBuffer sbParams = new StringBuffer();

  188. if (params != null && params.size() > 0) {

  189. for (Entry<String, Object> entry : params.entrySet()) {

  190. sbParams.append(entry.getKey());

  191. sbParams.append("=");

  192. sbParams.append(entry.getValue());

  193. sbParams.append("&");

  194. }

  195. }

  196. HttpURLConnection con = null;

  197. BufferedReader br = null;

  198. FileOutputStream os = null;

  199. try {

  200. URL url = null;

  201. if (sbParams != null && sbParams.length() > 0) {

  202. url = new URL(urlParam + "?" + sbParams.substring(0, sbParams.length() - 1));

  203. } else {

  204. url = new URL(urlParam);

  205. }

  206. con = (HttpURLConnection) url.openConnection();

  207. con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

  208. con.connect();

  209. InputStream is = con.getInputStream();

  210. os = new FileOutputStream(fileSavePath);

  211. byte buf[] = new byte[1024];

  212. int count = 0;

  213. while ((count = is.read(buf)) != -1) {

  214. os.write(buf, 0, count);

  215. }

  216. os.flush();

  217. } catch (Exception e) {

  218. throw new RuntimeException(e);

  219. } finally {

  220. if (os != null) {

  221. try {

  222. os.close();

  223. } catch (IOException e) {

  224. os = null;

  225. throw new RuntimeException(e);

  226. } finally {

  227. if (con != null) {

  228. con.disconnect();

  229. con = null;

  230. }

  231. }

  232. }

  233. if (br != null) {

  234. try {

  235. br.close();

  236. } catch (IOException e) {

  237. br = null;

  238. throw new RuntimeException(e);

  239. } finally {

  240. if (con != null) {

  241. con.disconnect();

  242. con = null;

  243. }

  244. }

  245. }

  246. }

  247. }

  248. /**

  249. * @Description:使用HttpURLConnection傳送get請求

  250. * @author:liuyc

  251. * @time:2016年5月17日 下午3:27:29

  252. */

  253. public static String sendGet(String urlParam, Map<String, Object> params, String charset) {

  254. StringBuffer resultBuffer = null;

  255. // 構建請求引數

  256. StringBuffer sbParams = new StringBuffer();

  257. if (params != null && params.size() > 0) {

  258. for (Entry<String, Object> entry : params.entrySet()) {

  259. sbParams.append(entry.getKey());

  260. sbParams.append("=");

  261. sbParams.append(entry.getValue());

  262. sbParams.append("&");

  263. }

  264. }

  265. HttpURLConnection con = null;

  266. BufferedReader br = null;

  267. try {

  268. URL url = null;

  269. if (sbParams != null && sbParams.length() > 0) {

  270. url = new URL(urlParam + "?" + sbParams.substring(0, sbParams.length() - 1));

  271. } else {

  272. url = new URL(urlParam);

  273. }

  274. con = (HttpURLConnection) url.openConnection();

  275. con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

  276. con.connect();

  277. resultBuffer = new StringBuffer();

  278. br = new BufferedReader(new InputStreamReader(con.getInputStream(), charset));

  279. String temp;

  280. while ((temp = br.readLine()) != null) {

  281. resultBuffer.append(temp);

  282. }

  283. } catch (Exception e) {

  284. throw new RuntimeException(e);

  285. } finally {

  286. if (br != null) {

  287. try {

  288. br.close();

  289. } catch (IOException e) {

  290. br = null;

  291. throw new RuntimeException(e);

  292. } finally {

  293. if (con != null) {

  294. con.disconnect();

  295. con = null;

  296. }

  297. }

  298. }

  299. }

  300. return resultBuffer.toString();

  301. }

  302. /**

  303. * @Description:使用URLConnection傳送get請求

  304. * @author:liuyc

  305. * @time:2016年5月17日 下午3:27:58

  306. */

  307. public static String sendGet2(String urlParam, Map<String, Object> params, String charset) {

  308. StringBuffer resultBuffer = null;

  309. // 構建請求引數

  310. StringBuffer sbParams = new StringBuffer();

  311. if (params != null && params.size() > 0) {

  312. for (Entry<String, Object> entry : params.entrySet()) {

  313. sbParams.append(entry.getKey());

  314. sbParams.append("=");

  315. sbParams.append(entry.getValue());

  316. sbParams.append("&");

  317. }

  318. }

  319. BufferedReader br = null;

  320. try {

  321. URL url = null;

  322. if (sbParams != null && sbParams.length() > 0) {

  323. url = new URL(urlParam + "?" + sbParams.substring(0, sbParams.length() - 1));

  324. } else {

  325. url = new URL(urlParam);

  326. }

  327. URLConnection con = url.openConnection();

  328. // 設定請求屬性

  329. con.setRequestProperty("accept", "*/*");

  330. con.setRequestProperty("connection", "Keep-Alive");

  331. con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

  332. con.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");

  333. // 建立連線

  334. con.connect();

  335. resultBuffer = new StringBuffer();

  336. br = new BufferedReader(new InputStreamReader(con.getInputStream(), charset));

  337. String temp;

  338. while ((temp = br.readLine()) != null) {

  339. resultBuffer.append(temp);

  340. }

  341. } catch (Exception e) {

  342. throw new RuntimeException(e);

  343. } finally {

  344. if (br != null) {

  345. try {

  346. br.close();

  347. } catch (IOException e) {

  348. br = null;

  349. throw new RuntimeException(e);

  350. }

  351. }

  352. }

  353. return resultBuffer.toString();

  354. }

  355. /**

  356. * @Description:使用HttpClient傳送post請求

  357. * @author:liuyc

  358. * @time:2016年5月17日 下午3:28:23

  359. */

  360. public static String httpClientPost(String urlParam, Map<String, Object> params, String charset) {

  361. StringBuffer resultBuffer = null;

  362. HttpClient client = new DefaultHttpClient();

  363. HttpPost httpPost = new HttpPost(urlParam);

  364. // 構建請求引數

  365. List<NameValuePair> list = new ArrayList<NameValuePair>();

  366. Iterator<Entry<String, Object>> iterator = params.entrySet().iterator();

  367. while (iterator.hasNext()) {

  368. Entry<String, Object> elem = iterator.next();

  369. list.add(new BasicNameValuePair(elem.getKey(), String.valueOf(elem.getValue())));

  370. }

  371. BufferedReader br = null;

  372. try {

  373. if (list.size() > 0) {

  374. UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, charset);

  375. httpPost.setEntity(entity);

  376. }

  377. HttpResponse response = client.execute(httpPost);

  378. // 讀取伺服器響應資料

  379. resultBuffer = new StringBuffer();

  380. br = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

  381. String temp;

  382. while ((temp = br.readLine()) != null) {

  383. resultBuffer.append(temp);

  384. }

  385. } catch (Exception e) {

  386. throw new RuntimeException(e);

  387. } finally {

  388. if (br != null) {

  389. try {

  390. br.close();

  391. } catch (IOException e) {

  392. br = null;

  393. throw new RuntimeException(e);

  394. }

  395. }

  396. }

  397. return resultBuffer.toString();

  398. }

  399. /**

  400. * @Description:使用HttpClient傳送get請求

  401. * @author:liuyc

  402. * @time:2016年5月17日 下午3:28:56

  403. */

  404. public static String httpClientGet(String urlParam, Map<String, Object> params, String charset) {

  405. StringBuffer resultBuffer = null;

  406. HttpClient client = new DefaultHttpClient();

  407. BufferedReader br = null;

  408. // 構建請求引數

  409. StringBuffer sbParams = new StringBuffer();

  410. if (params != null && params.size() > 0) {

  411. for (Entry<String, Object> entry : params.entrySet()) {

  412. sbParams.append(entry.getKey());

  413. sbParams.append("=");

  414. try {

  415. sbParams.append(URLEncoder.encode(String.valueOf(entry.getValue()), charset));

  416. } catch (UnsupportedEncodingException e) {

  417. throw new RuntimeException(e);

  418. }

  419. sbParams.append("&");

  420. }

  421. }

  422. if (sbParams != null && sbParams.length() > 0) {

  423. urlParam = urlParam + "?" + sbParams.substring(0, sbParams.length() - 1);

  424. }

  425. HttpGet httpGet = new HttpGet(urlParam);

  426. try {

  427. HttpResponse response = client.execute(httpGet);

  428. // 讀取伺服器響應資料

  429. br = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

  430. String temp;

  431. resultBuffer = new StringBuffer();

  432. while ((temp = br.readLine()) != null) {

  433. resultBuffer.append(temp);

  434. }

  435. } catch (Exception e) {

  436. throw new RuntimeException(e);

  437. } finally {

  438. if (br != null) {

  439. try {

  440. br.close();

  441. } catch (IOException e) {

  442. br = null;

  443. throw new RuntimeException(e);

  444. }

  445. }

  446. }

  447. return resultBuffer.toString();

  448. }

  449. /**

  450. * @Description:使用socket傳送post請求

  451. * @author:liuyc

  452. * @time:2016年5月18日 上午9:26:22

  453. */

  454. public static String sendSocketPost(String urlParam, Map<String, Object> params, String charset) {

  455. String result = "";

  456. // 構建請求引數

  457. StringBuffer sbParams = new StringBuffer();

  458. if (params != null && params.size() > 0) {

  459. for (Entry<String, Object> entry : params.entrySet()) {

  460. sbParams.append(entry.getKey());

  461. sbParams.append("=");

  462. sbParams.append(entry.getValue());

  463. sbParams.append("&");

  464. }

  465. }

  466. Socket socket = null;

  467. OutputStreamWriter osw = null;

  468. InputStream is = null;

  469. try {

  470. URL url = new URL(urlParam);

  471. String host = url.getHost();

  472. int port = url.getPort();

  473. if (-1 == port) {

  474. port = 80;

  475. }

  476. String path = url.getPath();

  477. socket = new Socket(host, port);

  478. StringBuffer sb = new StringBuffer();

  479. sb.append("POST " + path + " HTTP/1.1\r\n");

  480. sb.append("Host: " + host + "\r\n");

  481. sb.append("Connection: Keep-Alive\r\n");

  482. sb.append("Content-Type: application/x-www-form-urlencoded; charset=utf-8 \r\n");

  483. sb.append("Content-Length: ").append(sb.toString().getBytes().length).append("\r\n");

  484. // 這裡一個回車換行,表示訊息頭寫完,不然伺服器會繼續等待

  485. sb.append("\r\n");

  486. if (sbParams != null && sbParams.length() > 0) {

  487. sb.append(sbParams.substring(0, sbParams.length() - 1));

  488. }

  489. osw = new OutputStreamWriter(socket.getOutputStream());

  490. osw.write(sb.toString());

  491. osw.flush();

  492. is = socket.getInputStream();

  493. String line = null;

  494. // 伺服器響應體資料長度

  495. int contentLength = 0;

  496. // 讀取http響應頭部資訊

  497. do {

  498. line = readLine(is, 0, charset);

  499. if (line.startsWith("Content-Length")) {

  500. // 拿到響應體內容長度

  501. contentLength = Integer.parseInt(line.split(":")[1].trim());

  502. }

  503. // 如果遇到了一個單獨的回車換行,則表示請求頭結束

  504. } while (!line.equals("\r\n"));

  505. // 讀取出響應體資料(就是你要的資料)

  506. result = readLine(is, contentLength, charset);

  507. } catch (Exception e) {

  508. throw new RuntimeException(e);

  509. } finally {

  510. if (osw != null) {

  511. try {

  512. osw.close();

  513. } catch (IOException e) {

  514. osw = null;

  515. throw new RuntimeException(e);

  516. } finally {

  517. if (socket != null) {

  518. try {

  519. socket.close();

  520. } catch (IOException e) {

  521. socket = null;

  522. throw new RuntimeException(e);

  523. }

  524. }

  525. }

  526. }

  527. if (is != null) {

  528. try {

  529. is.close();

  530. } catch (IOException e) {

  531. is = null;

  532. throw new RuntimeException(e);

  533. } finally {

  534. if (socket != null) {

  535. try {

  536. socket.close();

  537. } catch (IOException e) {

  538. socket = null;

  539. throw new RuntimeException(e);

  540. }

  541. }

  542. }

  543. }

  544. }

  545. return result;

  546. }

  547. /**

  548. * @Description:使用socket傳送get請求

  549. * @author:liuyc

  550. * @time:2016年5月18日 上午9:27:18

  551. */

  552. public static String sendSocketGet(String urlParam, Map<String, Object> params, String charset) {

  553. String result = "";

  554. // 構建請求引數

  555. StringBuffer sbParams = new StringBuffer();

  556. if (params != null && params.size() > 0) {

  557. for (Entry<String, Object> entry : params.entrySet()) {

  558. sbParams.append(entry.getKey());

  559. sbParams.append("=");

  560. sbParams.append(entry.getValue());

  561. sbParams.append("&");

  562. }

  563. }

  564. Socket socket = null;

  565. OutputStreamWriter osw = null;

  566. InputStream is = null;

  567. try {

  568. URL url = new URL(urlParam);

  569. String host = url.getHost();

  570. int port = url.getPort();

  571. if (-1 == port) {

  572. port = 80;

  573. }

  574. String path = url.getPath();

  575. socket = new Socket(host, port);

  576. StringBuffer sb = new StringBuffer();

  577. sb.append("GET " + path + " HTTP/1.1\r\n");

  578. sb.append("Host: " + host + "\r\n");

  579. sb.append("Connection: Keep-Alive\r\n");

  580. sb.append("Content-Type: application/x-www-form-urlencoded; charset=utf-8 \r\n");

  581. sb.append("Content-Length: ").append(sb.toString().getBytes().length).append("\r\n");

  582. // 這裡一個回車換行,表示訊息頭寫完,不然伺服器會繼續等待

  583. sb.append("\r\n");

  584. if (sbParams != null && sbParams.length() > 0) {

  585. sb.append(sbParams.substring(0, sbParams.length() - 1));

  586. }

  587. osw = new OutputStreamWriter(socket.getOutputStream());

  588. osw.write(sb.toString());

  589. osw.flush();

  590. is = socket.getInputStream();

  591. String line = null;

  592. // 伺服器響應體資料長度

  593. int contentLength = 0;

  594. // 讀取http響應頭部資訊

  595. do {

  596. line = readLine(is, 0, charset);

  597. if (line.startsWith("Content-Length")) {

  598. // 拿到響應體內容長度

  599. contentLength = Integer.parseInt(line.split(":")[1].trim());

  600. }

  601. // 如果遇到了一個單獨的回車換行,則表示請求頭結束

  602. } while (!line.equals("\r\n"));

  603. // 讀取出響應體資料(就是你要的資料)

  604. result = readLine(is, contentLength, charset);

  605. } catch (Exception e) {

  606. throw new RuntimeException(e);

  607. } finally {

  608. if (osw != null) {

  609. try {

  610. osw.close();

  611. } catch (IOException e) {

  612. osw = null;

  613. throw new RuntimeException(e);

  614. } finally {

  615. if (socket != null) {

  616. try {

  617. socket.close();

  618. } catch (IOException e) {

  619. socket = null;

  620. throw new RuntimeException(e);

  621. }

  622. }

  623. }

  624. }

  625. if (is != null) {

  626. try {

  627. is.close();

  628. } catch (IOException e) {

  629. is = null;

  630. throw new RuntimeException(e);

  631. } finally {

  632. if (socket != null) {

  633. try {

  634. socket.close();

  635. } catch (IOException e) {

  636. socket = null;

  637. throw new RuntimeException(e);

  638. }

  639. }

  640. }

  641. }

  642. }

  643. return result;

  644. }

  645. /**

  646. * @Description:讀取一行資料,contentLe內容長度為0時,讀取響應頭資訊,不為0時讀正文

  647. * @time:2016年5月17日 下午6:11:07

  648. */

  649. private static String readLine(InputStream is, int contentLength, String charset) throws IOException {

  650. List<Byte> lineByte = new ArrayList<Byte>();

  651. byte tempByte;

  652. int cumsum = 0;

  653. if (contentLength != 0) {

  654. do {

  655. tempByte = (byte) is.read();

  656. lineByte.add(Byte.valueOf(tempByte));

  657. cumsum++;

  658. } while (cumsum < contentLength);// cumsum等於contentLength表示已讀完

  659. } else {

  660. do {

  661. tempByte = (byte) is.read();

  662. lineByte.add(Byte.valueOf(tempByte));

  663. } while (tempByte != 10);// 換行符的ascii碼值為10

  664. }

  665. byte[] resutlBytes = new byte[lineByte.size()];

  666. for (int i = 0; i < lineByte.size(); i++) {

  667. resutlBytes[i] = (lineByte.get(i)).byteValue();

  668. }

  669. return new String(resutlBytes, charset);

  670. }

  671. }

以上4種分別可傳送get和post請求的方法,第1種:HttpURLConnection、第2種:URLConnection、第3種:HttpClient、第4種:Socket,朋友們要注意的是,使用第3種HttpClient時需要依賴於三個jar包,分別是:apache-httpcomponents-httpclient.jar、commons-logging-1.0.4.jar、httpcore-4.1.1.jar。好了就到這裡吧,有問題記得留言哦