java http请求讲解、实现案例

进行Web开发关键是要了解超文本传输协议(HTTP),该协议用来传输网页、图像以及因特网上在浏览器与服务器间传输的其他类型文件。只要你在浏览器上输入一个URL,最前面的http://就表示使用HTTP来访问指定位置的信息。(大部分浏览器还支持其他一些不同的协议,其中FTP就是一个典型例子。)

本文从HTTP协议的结构上初步探讨HTTP协议的工作原理和请求响应格式,并最后通过一个使用Java编写的小HTTP服务器验证了如何处理和响应HTTP请求

HTTP 由两部分组成:请求和响应。当你在Web浏览器中输入一个URL时,浏览器将根据你的要求创建并发送请求,该请求包含所输入的URL以及一些与浏览器本身相关的信息。当服务器收到这个请求时将返回一个响应,该响应包括与该请求相关的信息以及位于指定URL(如果有的话)的数据。直到浏览器解析该响应并显示出网页(或其他资源)为止。
HTTP请求

HTTP请求的格式如下所示:

<request-line>
<headers>
<blank line>
[<request-body>]

在HTTP 请求中,第一行必须是一个请求行(request line),用来说明请求类型、要访问的资源以及使用的HTTP版本。紧接着是一个首部(header)小节,用来说明服务器要使用的附加信息。在首部之后是一个空行,再此之后可以添加任意的其他数据[称之为主体(body)]。

在HTTP中,定义了大量的请求类型,不过Ajax开发人员关心的只有GET请求和POST 请求。只要在Web浏览器上输入一个URL,浏览器就将基于该URL向服务器发送一个GET请求,以告诉服务器获取并返回什么资源。对于 www.wrox.com的GET请求如下所示:

GET / HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive

请求行的第一部分说明了该请求是GET请求。该行的第二部分是一个斜杠(/),用来说明请求的是该域名的根目录。该行的最后一部分说明使用的是HTTP 1.1版本(另一个可选项是1.0)。那么请求发到哪里去呢?这就是第二行的内容。

第2 行是请求的第一个首部,HOST。首部HOST将指出请求的目的地。结合HOST和上一行中的斜杠(/),可以通知服务器请求的是 www.wrox.com/(HTTP 1.1才需要使用首部HOST,而原来的1.0版本则不需要使用)。第三行中包含的是首部User-Agent,服务器端和客户端脚本都能够访问它,它是浏览器类型检测逻辑的重要基础。该信息由你使用的浏览器来定义(在本例中是Firefox 1.0.1),并且在每个请求中将自动发送。最后一行是首部Connection,通常将浏览器操作设置为Keep-Alive(当然也可以设置为其他值,但这已经超出了本书讨论的范围)。注意,在最后一个首部之后有一个空行。即使不存在请求主体,这个空行也是必需的。

如果要获取一个诸如http://www.wrox.com/books的www.wrox.com域内的页面,那么该请求可能类似于:

GET /books/ HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive
注意只有第一行的内容发生了变化,它只包含URL中www.wrox.com后面的部分。

要发送GET请求的参数,则必须将这些额外的信息附在URL本身的后面。其格式类似于:

URL ? name1=value1&name2=value2&..&nameN=valueN

该信息称之为查询字符串(query string),它将会复制在HTTP请求的请求行中,如下所示:

GET /books/?name=Professional%20Ajax HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive

注意,为了将文本“Professional Ajax”作为URL的参数,需要编码处理其内容,将空格替换成%20,这称为URL编码(URL encoding),常用于HTTP的许多地方(JavaScript提供了内建的函数来处理URL编码和解码,这些将在本章中的后续部分中说明)。“名称—值”(name—value)对用 & 隔开。绝大部分的服务器端技术能够自动对请求主体进行解码,并为这些值的访问提供一些逻辑方式。当然,如何使用这些数据还是由服务器决定的。



浏览器发送的首部,通常比本文中所讨论的要多得多。为了简单起见,这里的例子尽可能简短。


另一方面,POST请求在请求主体中为服务器提供了一些附加的信息。通常,当填写一个在线表单并提交它时,这些填入的数据将以POST请求的方式发送给服务器。

以下就是一个典型的POST请求:

POST / HTTP/1.1

Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive
name=Professional%20Ajax&publisher=Wiley

从上面可以发现, POST请求和GET请求之间有一些区别。首先,请求行开始处的GET改为了POST,以表示不同的请求类型。你会发现首部Host和User- Agent仍然存在,在后面有两个新行。其中首部Content-Type说明了请求主体的内容是如何编码的。浏览器始终以application/ x-www-form- urlencoded的格式编码来传送数据,这是针对简单URL编码的MIME类型。首部Content-Length说明了请求主体的字节数。在首部 Connection后是一个空行,再后面就是请求主体。与大多数浏览器的POST请求一样,这是以简单的“名称—值”对的形式给出的,其中name是 Professional Ajax,publisher是Wiley。你可以以同样的格式来组织URL的查询字符串参数。

正如前面所提到的,还有其他的HTTP请求类型,它们遵从的基本格式与GET请求和POST请求相同。下一步我们来看看服务器将对HTTP请求发送什么响应。

HTTP响应

如下所示,HTTP响应的格式与请求的格式十分类似:

<status-line>
<headers>
<blank line>
[<response-body>]

正如你所见,在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息。状态行(status line)通过提供一个状态码来说明所请求的资源情况。以下就是一个HTTP响应的例子:

HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122
<html>
<head>
<title>Wrox Homepage</title>
</head>
<body>
<!-- body goes here -->
</body>
</html>

在本例中,状态行给出的HTTP状态代码是200,以及消息OK。状态行始终包含的是状态码和相应的简短消息,以避免混乱。最常用的状态码有:

◆200 (OK): 找到了该资源,并且一切正常。

◆304 (NOT MODIFIED): 该资源在上次请求之后没有任何修改。这通常用于浏览器的缓存机制。

◆401 (UNAUTHORIZED): 客户端无权访问该资源。这通常会使得浏览器要求用户输入用户名和密码,以登录到服务器。

◆403 (FORBIDDEN): 客户端未能获得授权。这通常是在401之后输入了不正确的用户名或密码。

◆404 (NOT FOUND): 在指定的位置不存在所申请的资源。

在状态行之后是一些首部。通常,服务器会返回一个名为Data的首部,用来说明响应生成的日期和时间(服务器通常还会返回一些关于其自身的信息,尽管并非是必需的)。接下来的两个首部大家应该熟悉,就是与POST请求中一样的Content-Type和Content-Length。在本例中,首部 Content-Type指定了MIME类型HTML(text/html),其编码类型是ISO-8859-1(这是针对美国英语资源的编码标准)。响应主体所包含的就是所请求资源的HTML源文件(尽管还可能包含纯文本或其他资源类型的二进制数据)。浏览器将把这些数据显示给用户。

注意,这里并没有指明针对该响应的请求类型,不过这对于服务器并不重要。客户端知道每种类型的请求将返回什么类型的数据,并决定如何使用这些数据。


转自 http://canrry.iteye.com/blog/1331292


以下是

java 常见几种发送http请求和响应的方式


  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 params, String charset) {  
  40.         StringBuffer resultBuffer = null;  
  41.         // 构建请求参数  
  42.         StringBuffer sbParams = new StringBuffer();  
  43.         if (params != null && params.size() > 0) {  
  44.             for (Entry 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 params, String charset) {  
  118.         StringBuffer resultBuffer = null;  
  119.         // 构建请求参数  
  120.         StringBuffer sbParams = new StringBuffer();  
  121.         if (params != null && params.size() > 0) {  
  122.             for (Entry 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:2016517日 下午3:27:29  
  189.      */  
  190.     public static void sendGetAndSaveFile(String urlParam, Map params, String fileSavePath) {  
  191.         // 构建请求参数  
  192.         StringBuffer sbParams = new StringBuffer();  
  193.         if (params != null && params.size() > 0) {  
  194.             for (Entry 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 params, String charset) {  
  260.         StringBuffer resultBuffer = null;  
  261.         // 构建请求参数  
  262.         StringBuffer sbParams = new StringBuffer();  
  263.         if (params != null && params.size() > 0) {  
  264.             for (Entry 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 params, String charset) {  
  315.         StringBuffer resultBuffer = null;  
  316.         // 构建请求参数  
  317.         StringBuffer sbParams = new StringBuffer();  
  318.         if (params != null && params.size() > 0) {  
  319.             for (Entry 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:2016517日 下午3:28:23  
  367.      */  
  368.     public static String httpClientPost(String urlParam, Map params, String charset) {  
  369.         StringBuffer resultBuffer = null;  
  370.         HttpClient client = new DefaultHttpClient();  
  371.         HttpPost httpPost = new HttpPost(urlParam);  
  372.         // 构建请求参数  
  373.         List list = new ArrayList();  
  374.         Iterator> iterator = params.entrySet().iterator();  
  375.         while (iterator.hasNext()) {  
  376.             Entry 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 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 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 params, String charset) {  
  465.         String result = "";  
  466.         // 构建请求参数  
  467.         StringBuffer sbParams = new StringBuffer();  
  468.         if (params != null && params.size() > 0) {  
  469.             for (Entry 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\r\n");  
  490.             sb.append("Host: " + host + "\r\n");  
  491.             sb.append("Connection: Keep-Alive\r\n");  
  492.             sb.append("Content-Type: application/x-www-form-urlencoded; charset=utf-8 \r\n");  
  493.             sb.append("Content-Length: ").append(sb.toString().getBytes().length).append("\r\n");  
  494.             // 这里一个回车换行,表示消息头写完,不然服务器会继续等待  
  495.             sb.append("\r\n");  
  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("\r\n"));  
  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 params, String charset) {  
  564.         String result = "";  
  565.         // 构建请求参数  
  566.         StringBuffer sbParams = new StringBuffer();  
  567.         if (params != null && params.size() > 0) {  
  568.             for (Entry 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\r\n");  
  589.             sb.append("Host: " + host + "\r\n");  
  590.             sb.append("Connection: Keep-Alive\r\n");  
  591.             sb.append("Content-Type: application/x-www-form-urlencoded; charset=utf-8 \r\n");  
  592.             sb.append("Content-Length: ").append(sb.toString().getBytes().length).append("\r\n");  
  593.             // 这里一个回车换行,表示消息头写完,不然服务器会继续等待  
  594.             sb.append("\r\n");  
  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("\r\n"));  
  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 lineByte = new ArrayList();  
  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. }  


以上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。

转自:http://blog.csdn.net/u010197591/article/details/51441399

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值