转自https://blog.csdn.net/u010197591/article/details/51441399
以下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。
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 19 import org.apache.http.HttpResponse; 20 import org.apache.http.NameValuePair; 21 import org.apache.http.client.HttpClient; 22 import org.apache.http.client.entity.UrlEncodedFormEntity; 23 import org.apache.http.client.methods.HttpGet; 24 import org.apache.http.client.methods.HttpPost; 25 import org.apache.http.impl.client.DefaultHttpClient; 26 import org.apache.http.message.BasicNameValuePair; 27 28 /** 29 * @Description:发送http请求帮助类 30 * @author:liuyc 31 * @time:2016年5月17日 下午3:25:32 32 */ 33 public class HttpClientHelper { 34 /** 35 * @Description:使用HttpURLConnection发送post请求 36 * @author:liuyc 37 * @time:2016年5月17日 下午3:26:07 38 */ 39 public static String sendPost(String urlParam, Map<String, Object> params, String charset) { 40 StringBuffer resultBuffer = null; 41 // 构建请求参数 42 StringBuffer sbParams = new StringBuffer(); 43 if (params != null && params.size() > 0) { 44 for (Entry<String, Object> e : params.entrySet()) { 45 sbParams.append(e.getKey()); 46 sbParams.append("="); 47 sbParams.append(e.getValue()); 48 sbParams.append("&"); 49 } 50 } 51 HttpURLConnection con = null; 52 OutputStreamWriter osw = null; 53 BufferedReader br = null; 54 // 发送请求 55 try { 56 URL url = new URL(urlParam); 57 con = (HttpURLConnection) url.openConnection(); 58 con.setRequestMethod("POST"); 59 con.setDoOutput(true); 60 con.setDoInput(true); 61 con.setUseCaches(false); 62 con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 63 if (sbParams != null && sbParams.length() > 0) { 64 osw = new OutputStreamWriter(con.getOutputStream(), charset); 65 osw.write(sbParams.substring(0, sbParams.length() - 1)); 66 osw.flush(); 67 } 68 // 读取返回内容 69 resultBuffer = new StringBuffer(); 70 int contentLength = Integer.parseInt(con.getHeaderField("Content-Length")); 71 if (contentLength > 0) { 72 br = new BufferedReader(new InputStreamReader(con.getInputStream(), charset)); 73 String temp; 74 while ((temp = br.readLine()) != null) { 75 resultBuffer.append(temp); 76 } 77 } 78 } catch (Exception e) { 79 throw new RuntimeException(e); 80 } finally { 81 if (osw != null) { 82 try { 83 osw.close(); 84 } catch (IOException e) { 85 osw = null; 86 throw new RuntimeException(e); 87 } finally { 88 if (con != null) { 89 con.disconnect(); 90 con = null; 91 } 92 } 93 } 94 if (br != null) { 95 try { 96 br.close(); 97 } catch (IOException e) { 98 br = null; 99 throw new RuntimeException(e); 100 } finally { 101 if (con != null) { 102 con.disconnect(); 103 con = null; 104 } 105 } 106 } 107 } 108 109 return resultBuffer.toString(); 110 } 111 112 /** 113 * @Description:使用URLConnection发送post 114 * @author:liuyc 115 * @time:2016年5月17日 下午3:26:52 116 */ 117 public static String sendPost2(String urlParam, Map<String, Object> params, String charset) { 118 StringBuffer resultBuffer = null; 119 // 构建请求参数 120 StringBuffer sbParams = new StringBuffer(); 121 if (params != null && params.size() > 0) { 122 for (Entry<String, Object> e : params.entrySet()) { 123 sbParams.append(e.getKey()); 124 sbParams.append("="); 125 sbParams.append(e.getValue()); 126 sbParams.append("&"); 127 } 128 } 129 URLConnection con = null; 130 OutputStreamWriter osw = null; 131 BufferedReader br = null; 132 try { 133 URL realUrl = new URL(urlParam); 134 // 打开和URL之间的连接 135 con = realUrl.openConnection(); 136 // 设置通用的请求属性 137 con.setRequestProperty("accept", "*/*"); 138 con.setRequestProperty("connection", "Keep-Alive"); 139 con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 140 con.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); 141 // 发送POST请求必须设置如下两行 142 con.setDoOutput(true); 143 con.setDoInput(true); 144 // 获取URLConnection对象对应的输出流 145 osw = new OutputStreamWriter(con.getOutputStream(), charset); 146 if (sbParams != null && sbParams.length() > 0) { 147 // 发送请求参数 148 osw.write(sbParams.substring(0, sbParams.length() - 1)); 149 // flush输出流的缓冲 150 osw.flush(); 151 } 152 // 定义BufferedReader输入流来读取URL的响应 153 resultBuffer = new StringBuffer(); 154 int contentLength = Integer.parseInt(con.getHeaderField("Content-Length")); 155 if (contentLength > 0) { 156 br = new BufferedReader(new InputStreamReader(con.getInputStream(), charset)); 157 String temp; 158 while ((temp = br.readLine()) != null) { 159 resultBuffer.append(temp); 160 } 161 } 162 } catch (Exception e) { 163 throw new RuntimeException(e); 164 } finally { 165 if (osw != null) { 166 try { 167 osw.close(); 168 } catch (IOException e) { 169 osw = null; 170 throw new RuntimeException(e); 171 } 172 } 173 if (br != null) { 174 try { 175 br.close(); 176 } catch (IOException e) { 177 br = null; 178 throw new RuntimeException(e); 179 } 180 } 181 } 182 return resultBuffer.toString(); 183 } 184 185 /** 186 * @Description:发送get请求保存下载文件 187 * @author:liuyc 188 * @time:2016年5月17日 下午3:27:29 189 */ 190 public static void sendGetAndSaveFile(String urlParam, Map<String, Object> params, String fileSavePath) { 191 // 构建请求参数 192 StringBuffer sbParams = new StringBuffer(); 193 if (params != null && params.size() > 0) { 194 for (Entry<String, Object> entry : params.entrySet()) { 195 sbParams.append(entry.getKey()); 196 sbParams.append("="); 197 sbParams.append(entry.getValue()); 198 sbParams.append("&"); 199 } 200 } 201 HttpURLConnection con = null; 202 BufferedReader br = null; 203 FileOutputStream os = null; 204 try { 205 URL url = null; 206 if (sbParams != null && sbParams.length() > 0) { 207 url = new URL(urlParam + "?" + sbParams.substring(0, sbParams.length() - 1)); 208 } else { 209 url = new URL(urlParam); 210 } 211 con = (HttpURLConnection) url.openConnection(); 212 con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 213 con.connect(); 214 InputStream is = con.getInputStream(); 215 os = new FileOutputStream(fileSavePath); 216 byte buf[] = new byte[1024]; 217 int count = 0; 218 while ((count = is.read(buf)) != -1) { 219 os.write(buf, 0, count); 220 } 221 os.flush(); 222 } catch (Exception e) { 223 throw new RuntimeException(e); 224 } finally { 225 if (os != null) { 226 try { 227 os.close(); 228 } catch (IOException e) { 229 os = null; 230 throw new RuntimeException(e); 231 } finally { 232 if (con != null) { 233 con.disconnect(); 234 con = null; 235 } 236 } 237 } 238 if (br != null) { 239 try { 240 br.close(); 241 } catch (IOException e) { 242 br = null; 243 throw new RuntimeException(e); 244 } finally { 245 if (con != null) { 246 con.disconnect(); 247 con = null; 248 } 249 } 250 } 251 } 252 } 253 254 /** 255 * @Description:使用HttpURLConnection发送get请求 256 * @author:liuyc 257 * @time:2016年5月17日 下午3:27:29 258 */ 259 public static String sendGet(String urlParam, Map<String, Object> params, String charset) { 260 StringBuffer resultBuffer = null; 261 // 构建请求参数 262 StringBuffer sbParams = new StringBuffer(); 263 if (params != null && params.size() > 0) { 264 for (Entry<String, Object> entry : params.entrySet()) { 265 sbParams.append(entry.getKey()); 266 sbParams.append("="); 267 sbParams.append(entry.getValue()); 268 sbParams.append("&"); 269 } 270 } 271 HttpURLConnection con = null; 272 BufferedReader br = null; 273 try { 274 URL url = null; 275 if (sbParams != null && sbParams.length() > 0) { 276 url = new URL(urlParam + "?" + sbParams.substring(0, sbParams.length() - 1)); 277 } else { 278 url = new URL(urlParam); 279 } 280 con = (HttpURLConnection) url.openConnection(); 281 con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 282 con.connect(); 283 resultBuffer = new StringBuffer(); 284 br = new BufferedReader(new InputStreamReader(con.getInputStream(), charset)); 285 String temp; 286 while ((temp = br.readLine()) != null) { 287 resultBuffer.append(temp); 288 } 289 } catch (Exception e) { 290 throw new RuntimeException(e); 291 } finally { 292 if (br != null) { 293 try { 294 br.close(); 295 } catch (IOException e) { 296 br = null; 297 throw new RuntimeException(e); 298 } finally { 299 if (con != null) { 300 con.disconnect(); 301 con = null; 302 } 303 } 304 } 305 } 306 return resultBuffer.toString(); 307 } 308 309 /** 310 * @Description:使用URLConnection发送get请求 311 * @author:liuyc 312 * @time:2016年5月17日 下午3:27:58 313 */ 314 public static String sendGet2(String urlParam, Map<String, Object> params, String charset) { 315 StringBuffer resultBuffer = null; 316 // 构建请求参数 317 StringBuffer sbParams = new StringBuffer(); 318 if (params != null && params.size() > 0) { 319 for (Entry<String, Object> entry : params.entrySet()) { 320 sbParams.append(entry.getKey()); 321 sbParams.append("="); 322 sbParams.append(entry.getValue()); 323 sbParams.append("&"); 324 } 325 } 326 BufferedReader br = null; 327 try { 328 URL url = null; 329 if (sbParams != null && sbParams.length() > 0) { 330 url = new URL(urlParam + "?" + sbParams.substring(0, sbParams.length() - 1)); 331 } else { 332 url = new URL(urlParam); 333 } 334 URLConnection con = url.openConnection(); 335 // 设置请求属性 336 con.setRequestProperty("accept", "*/*"); 337 con.setRequestProperty("connection", "Keep-Alive"); 338 con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 339 con.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); 340 // 建立连接 341 con.connect(); 342 resultBuffer = new StringBuffer(); 343 br = new BufferedReader(new InputStreamReader(con.getInputStream(), charset)); 344 String temp; 345 while ((temp = br.readLine()) != null) { 346 resultBuffer.append(temp); 347 } 348 } catch (Exception e) { 349 throw new RuntimeException(e); 350 } finally { 351 if (br != null) { 352 try { 353 br.close(); 354 } catch (IOException e) { 355 br = null; 356 throw new RuntimeException(e); 357 } 358 } 359 } 360 return resultBuffer.toString(); 361 } 362 363 /** 364 * @Description:使用HttpClient发送post请求 365 * @author:liuyc 366 * @time:2016年5月17日 下午3:28:23 367 */ 368 public static String httpClientPost(String urlParam, Map<String, Object> params, String charset) { 369 StringBuffer resultBuffer = null; 370 HttpClient client = new DefaultHttpClient(); 371 HttpPost httpPost = new HttpPost(urlParam); 372 // 构建请求参数 373 List<NameValuePair> list = new ArrayList<NameValuePair>(); 374 Iterator<Entry<String, Object>> iterator = params.entrySet().iterator(); 375 while (iterator.hasNext()) { 376 Entry<String, Object> elem = iterator.next(); 377 list.add(new BasicNameValuePair(elem.getKey(), String.valueOf(elem.getValue()))); 378 } 379 BufferedReader br = null; 380 try { 381 if (list.size() > 0) { 382 UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, charset); 383 httpPost.setEntity(entity); 384 } 385 HttpResponse response = client.execute(httpPost); 386 // 读取服务器响应数据 387 resultBuffer = new StringBuffer(); 388 br = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 389 String temp; 390 while ((temp = br.readLine()) != null) { 391 resultBuffer.append(temp); 392 } 393 } catch (Exception e) { 394 throw new RuntimeException(e); 395 } finally { 396 if (br != null) { 397 try { 398 br.close(); 399 } catch (IOException e) { 400 br = null; 401 throw new RuntimeException(e); 402 } 403 } 404 } 405 return resultBuffer.toString(); 406 } 407 408 /** 409 * @Description:使用HttpClient发送get请求 410 * @author:liuyc 411 * @time:2016年5月17日 下午3:28:56 412 */ 413 public static String httpClientGet(String urlParam, Map<String, Object> params, String charset) { 414 StringBuffer resultBuffer = null; 415 HttpClient client = new DefaultHttpClient(); 416 BufferedReader br = null; 417 // 构建请求参数 418 StringBuffer sbParams = new StringBuffer(); 419 if (params != null && params.size() > 0) { 420 for (Entry<String, Object> entry : params.entrySet()) { 421 sbParams.append(entry.getKey()); 422 sbParams.append("="); 423 try { 424 sbParams.append(URLEncoder.encode(String.valueOf(entry.getValue()), charset)); 425 } catch (UnsupportedEncodingException e) { 426 throw new RuntimeException(e); 427 } 428 sbParams.append("&"); 429 } 430 } 431 if (sbParams != null && sbParams.length() > 0) { 432 urlParam = urlParam + "?" + sbParams.substring(0, sbParams.length() - 1); 433 } 434 HttpGet httpGet = new HttpGet(urlParam); 435 try { 436 HttpResponse response = client.execute(httpGet); 437 // 读取服务器响应数据 438 br = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 439 String temp; 440 resultBuffer = new StringBuffer(); 441 while ((temp = br.readLine()) != null) { 442 resultBuffer.append(temp); 443 } 444 } catch (Exception e) { 445 throw new RuntimeException(e); 446 } finally { 447 if (br != null) { 448 try { 449 br.close(); 450 } catch (IOException e) { 451 br = null; 452 throw new RuntimeException(e); 453 } 454 } 455 } 456 return resultBuffer.toString(); 457 } 458 459 /** 460 * @Description:使用socket发送post请求 461 * @author:liuyc 462 * @time:2016年5月18日 上午9:26:22 463 */ 464 public static String sendSocketPost(String urlParam, Map<String, Object> params, String charset) { 465 String result = ""; 466 // 构建请求参数 467 StringBuffer sbParams = new StringBuffer(); 468 if (params != null && params.size() > 0) { 469 for (Entry<String, Object> entry : params.entrySet()) { 470 sbParams.append(entry.getKey()); 471 sbParams.append("="); 472 sbParams.append(entry.getValue()); 473 sbParams.append("&"); 474 } 475 } 476 Socket socket = null; 477 OutputStreamWriter osw = null; 478 InputStream is = null; 479 try { 480 URL url = new URL(urlParam); 481 String host = url.getHost(); 482 int port = url.getPort(); 483 if (-1 == port) { 484 port = 80; 485 } 486 String path = url.getPath(); 487 socket = new Socket(host, port); 488 StringBuffer sb = new StringBuffer(); 489 sb.append("POST " + path + " HTTP/1.1 "); 490 sb.append("Host: " + host + " "); 491 sb.append("Connection: Keep-Alive "); 492 sb.append("Content-Type: application/x-www-form-urlencoded; charset=utf-8 "); 493 sb.append("Content-Length: ").append(sb.toString().getBytes().length).append(" "); 494 // 这里一个回车换行,表示消息头写完,不然服务器会继续等待 495 sb.append(" "); 496 if (sbParams != null && sbParams.length() > 0) { 497 sb.append(sbParams.substring(0, sbParams.length() - 1)); 498 } 499 osw = new OutputStreamWriter(socket.getOutputStream()); 500 osw.write(sb.toString()); 501 osw.flush(); 502 is = socket.getInputStream(); 503 String line = null; 504 // 服务器响应体数据长度 505 int contentLength = 0; 506 // 读取http响应头部信息 507 do { 508 line = readLine(is, 0, charset); 509 if (line.startsWith("Content-Length")) { 510 // 拿到响应体内容长度 511 contentLength = Integer.parseInt(line.split(":")[1].trim()); 512 } 513 // 如果遇到了一个单独的回车换行,则表示请求头结束 514 } while (!line.equals(" ")); 515 // 读取出响应体数据(就是你要的数据) 516 result = readLine(is, contentLength, charset); 517 } catch (Exception e) { 518 throw new RuntimeException(e); 519 } finally { 520 if (osw != null) { 521 try { 522 osw.close(); 523 } catch (IOException e) { 524 osw = null; 525 throw new RuntimeException(e); 526 } finally { 527 if (socket != null) { 528 try { 529 socket.close(); 530 } catch (IOException e) { 531 socket = null; 532 throw new RuntimeException(e); 533 } 534 } 535 } 536 } 537 if (is != null) { 538 try { 539 is.close(); 540 } catch (IOException e) { 541 is = null; 542 throw new RuntimeException(e); 543 } finally { 544 if (socket != null) { 545 try { 546 socket.close(); 547 } catch (IOException e) { 548 socket = null; 549 throw new RuntimeException(e); 550 } 551 } 552 } 553 } 554 } 555 return result; 556 } 557 558 /** 559 * @Description:使用socket发送get请求 560 * @author:liuyc 561 * @time:2016年5月18日 上午9:27:18 562 */ 563 public static String sendSocketGet(String urlParam, Map<String, Object> params, String charset) { 564 String result = ""; 565 // 构建请求参数 566 StringBuffer sbParams = new StringBuffer(); 567 if (params != null && params.size() > 0) { 568 for (Entry<String, Object> entry : params.entrySet()) { 569 sbParams.append(entry.getKey()); 570 sbParams.append("="); 571 sbParams.append(entry.getValue()); 572 sbParams.append("&"); 573 } 574 } 575 Socket socket = null; 576 OutputStreamWriter osw = null; 577 InputStream is = null; 578 try { 579 URL url = new URL(urlParam); 580 String host = url.getHost(); 581 int port = url.getPort(); 582 if (-1 == port) { 583 port = 80; 584 } 585 String path = url.getPath(); 586 socket = new Socket(host, port); 587 StringBuffer sb = new StringBuffer(); 588 sb.append("GET " + path + " HTTP/1.1 "); 589 sb.append("Host: " + host + " "); 590 sb.append("Connection: Keep-Alive "); 591 sb.append("Content-Type: application/x-www-form-urlencoded; charset=utf-8 "); 592 sb.append("Content-Length: ").append(sb.toString().getBytes().length).append(" "); 593 // 这里一个回车换行,表示消息头写完,不然服务器会继续等待 594 sb.append(" "); 595 if (sbParams != null && sbParams.length() > 0) { 596 sb.append(sbParams.substring(0, sbParams.length() - 1)); 597 } 598 osw = new OutputStreamWriter(socket.getOutputStream()); 599 osw.write(sb.toString()); 600 osw.flush(); 601 is = socket.getInputStream(); 602 String line = null; 603 // 服务器响应体数据长度 604 int contentLength = 0; 605 // 读取http响应头部信息 606 do { 607 line = readLine(is, 0, charset); 608 if (line.startsWith("Content-Length")) { 609 // 拿到响应体内容长度 610 contentLength = Integer.parseInt(line.split(":")[1].trim()); 611 } 612 // 如果遇到了一个单独的回车换行,则表示请求头结束 613 } while (!line.equals(" ")); 614 // 读取出响应体数据(就是你要的数据) 615 result = readLine(is, contentLength, charset); 616 } catch (Exception e) { 617 throw new RuntimeException(e); 618 } finally { 619 if (osw != null) { 620 try { 621 osw.close(); 622 } catch (IOException e) { 623 osw = null; 624 throw new RuntimeException(e); 625 } finally { 626 if (socket != null) { 627 try { 628 socket.close(); 629 } catch (IOException e) { 630 socket = null; 631 throw new RuntimeException(e); 632 } 633 } 634 } 635 } 636 if (is != null) { 637 try { 638 is.close(); 639 } catch (IOException e) { 640 is = null; 641 throw new RuntimeException(e); 642 } finally { 643 if (socket != null) { 644 try { 645 socket.close(); 646 } catch (IOException e) { 647 socket = null; 648 throw new RuntimeException(e); 649 } 650 } 651 } 652 } 653 } 654 return result; 655 } 656 657 /** 658 * @Description:读取一行数据,contentLe内容长度为0时,读取响应头信息,不为0时读正文 659 * @time:2016年5月17日 下午6:11:07 660 */ 661 private static String readLine(InputStream is, int contentLength, String charset) throws IOException { 662 List<Byte> lineByte = new ArrayList<Byte>(); 663 byte tempByte; 664 int cumsum = 0; 665 if (contentLength != 0) { 666 do { 667 tempByte = (byte) is.read(); 668 lineByte.add(Byte.valueOf(tempByte)); 669 cumsum++; 670 } while (cumsum < contentLength);// cumsum等于contentLength表示已读完 671 } else { 672 do { 673 tempByte = (byte) is.read(); 674 lineByte.add(Byte.valueOf(tempByte)); 675 } while (tempByte != 10);// 换行符的ascii码值为10 676 } 677 678 byte[] resutlBytes = new byte[lineByte.size()]; 679 for (int i = 0; i < lineByte.size(); i++) { 680 resutlBytes[i] = (lineByte.get(i)).byteValue(); 681 } 682 return new String(resutlBytes, charset); 683 } 684 685 }