HTTP 方法
HTTP協(xié)議 所有的方法
| GET | 獲得資源 | 1.0、 1.1 |
| POST | 傳輸實(shí)體主體 | 1.0、 1.1 |
| PUT | 傳輸文件 | 1.0、 1.1 |
| DELETE | 刪除文件 | 1.0、 1.1 |
| HEAD | 獲得HTTP協(xié)議首部 | 1.0、 1.1 |
| OPTIONS | 詢問HTTP服務(wù)器支持的HTTP協(xié)議的方法 | 1.1 |
| TRACE | 追蹤路徑 | 1.1 |
| CONNECT | 要求用隧道協(xié)議連接代理 | 1.1 |
| LINK | 建立和資源之間的關(guān)系 | 1.0 |
| UNLINK | 斷開連接關(guān)系 | 1.0 |
下面我們通過tomcat所支持的HTTP方法來詳解每個(gè)方法。
tomcat默認(rèn)支持 GET、POST、HEAD、OPTIONS方法,而不支持PUT、DELETE、TRACE方法。
下面我們配置tomcat,讓tomcat支持PUT、DELETE、TRACE方法。
配置Tomcat
配置tomcat支持 PUT、DELETE方法
打開tomcat/conf/web.xml配置文件
從說明中可以看出,如果要支持PUT、DELETE方法,需要將readonly設(shè)置為true。
在DefaultServlet的初始化參數(shù)中配置readonly=true。
配置tomcat支持TRACE方法
打開tomcat/conf/server.xml配置文件
在連接器中添加 allowTrace=true, 使tomcat支持TRACE方法。
Servlet 實(shí)現(xiàn) Http 方法
import java.io.IOException; import java.util.Enumeration; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class ServletTest extends HttpServlet {private static final long serialVersionUID = 1L;public ServletTest() {super();}protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.getWriter().append("<html><body>Http Method : GET</body></html>");}protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.getWriter().append("<html><body>Http Method : POST<br>").append("name : ").append(request.getParameter("name")).append("</body></html>");}@Overrideprotected void doHead(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {}@Overrideprotected void doPut(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.getWriter().append("<html><body>Http Method : PUT</body></html>");}@Overrideprotected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.getWriter().append("<html><body>Http Method : DELETE</body></html>");}@Overrideprotected void doTrace(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.getWriter().append("TANCE "+request.getRequestURI()+" HTTP/1.1\r\n");Enumeration<String> enumer = request.getHeaderNames();while (enumer.hasMoreElements()) {String name = enumer.nextElement();response.getWriter().append(name+":"+request.getHeader(name)+"\r\n");}} }通過下面代碼,使用不同的Method進(jìn)行請(qǐng)求http服務(wù)。
import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.Iterator; import java.util.List; import java.util.Map;public class Options {public static void main(String[] args) {try {args = new String[]{"http://localhost:9999/webDemo/test"};URL u = new URL(args[0]);HttpURLConnection http = (HttpURLConnection) u.openConnection();//GET、POST、PUT、DELETE、HEAD、OPTIONS、TRACEhttp.setRequestMethod("GET");//POST方法需要使用OutputStream提交參數(shù) // http.setDoOutput(true); // Writer w = new OutputStreamWriter(http.getOutputStream()); // w.write("name=jijs"); // w.flush(); // w.close();Map<String, List<String>> headers = http.getHeaderFields();for (Map.Entry<String, List<String>> header : headers.entrySet()) {if(header.getKey()!=null){System.out.println(header.getKey() + ": " + join(header.getValue()));}else{System.out.println(join(header.getValue()));}}} catch (MalformedURLException ex) {System.err.println(args[0] + " is not a parseable URL");} catch (IOException ex) {System.err.println(ex);}System.out.println();}private static String join(List<String> list) {StringBuilder builder = new StringBuilder();Iterator<String> iterator = list.iterator();while (iterator.hasNext()) {builder.append(iterator.next());if (iterator.hasNext())builder.append(", ");}return builder.toString();} }HTTP 協(xié)議格式
Http協(xié)議格式分為客戶端請(qǐng)求格式和服務(wù)端響應(yīng)格式。
客戶端請(qǐng)求:
1. 請(qǐng)求行 (Http方法 空格 請(qǐng)求路徑 空格 協(xié)議版本 \r\n)
2. 請(qǐng)求首部 (key : value 可以多個(gè)以回車換行結(jié)束)
3. 請(qǐng)求實(shí)體 (與請(qǐng)求首部中間有一空行, 請(qǐng)求的實(shí)體內(nèi)容)
服務(wù)器端響應(yīng)
1. 響應(yīng)行 (協(xié)議版本 空格 狀態(tài)碼 空格 狀態(tài)碼說明)
2. 響應(yīng)首部 (key : value 可以多個(gè)以回車換行結(jié)束)
3. 響應(yīng)實(shí)體 (與請(qǐng)求首部中間有一空行,響應(yīng)的內(nèi)容)
通過抓包分析7種方法
通過上面代碼示例,請(qǐng)求http的7種方法,然后使用抓包工具查看7中HTTP請(qǐng)求,每種HTTP協(xié)議發(fā)送的內(nèi)容如下:
GET方法
GET方法用來請(qǐng)求訪問已被URI識(shí)別的資源。指定的資源經(jīng)服務(wù)器解析后返回的內(nèi)容。
請(qǐng)求信息:
GET /webDemo/test HTTP/1.1 User-Agent: Java/1.8.0_77 Host: localhost:9999 Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 Connection: keep-alive響應(yīng)信息:
HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Content-Length: 43 Date: Thu, 03 Aug 2017 10:02:00 GMT<html><body>Http Method : GET</body></html>POST方法
POST方法用來傳輸實(shí)體的主體。提交表單的信息存放在請(qǐng)求實(shí)體中。例如下面的例子name=jijs存放在請(qǐng)求實(shí)體中。
請(qǐng)求信息:
響應(yīng)信息:
HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Content-Length: 59 Date: Thu, 03 Aug 2017 10:50:31 GMT<html><body>Http Method : POST<br>name : jijs</body></html>PUT方法
PUT 方法用來傳輸文件的。就想FTP協(xié)議的文件上傳一樣,要求在請(qǐng)求報(bào)文的主體中包含文件內(nèi)容,然后保存到請(qǐng)求URL指定的位置。
HTTP1.1的PUT方法自身不帶驗(yàn)證機(jī)制,任何人都可能上傳文件,存在安全問題,因此一般的Web網(wǎng)站都不使用該方法。如果使用REST,一般就會(huì)使用該方法。
請(qǐng)求信息:
PUT /webDemo/test HTTP/1.1 User-Agent: Java/1.8.0_77 Host: localhost:9999 Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 Connection: keep-alive響應(yīng)信息:
HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Content-Length: 43 Date: Thu, 03 Aug 2017 10:51:24 GMT<html><body>Http Method : PUT</body></html>DELETE方法
DELETE 方法用來刪除一個(gè)文檔,與PUT方法相反。DELETE方法也存在PUT存在問題,沒有自帶安全機(jī)制,如果采用REST,一般會(huì)使用該方法。
請(qǐng)求信息:
DELETE /webDemo/test HTTP/1.1 User-Agent: Java/1.8.0_77 Host: localhost:9999 Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 Connection: keep-alive響應(yīng)信息:
HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Content-Length: 46 Date: Thu, 03 Aug 2017 14:56:30 GMT<html><body>Http Method : DELETE</body></html>OPTIONS方法
OPTIONS 方法用來詢問HTTP服務(wù)器支持那些方法。
請(qǐng)求信息:
OPTIONS /webDemo/test HTTP/1.1 User-Agent: Java/1.8.0_77 Host: localhost:9999 Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 Connection: keep-alive響應(yīng)信息:
HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Allow: GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS Content-Length: 0 Date: Thu, 03 Aug 2017 09:07:18 GMTTRACE方法
TRACE方法是讓W(xué)eb服務(wù)器端將之前的請(qǐng)求通信(服務(wù)器接收到的請(qǐng)求頭)返回給客戶端的方法。
通過TRACE方法,我們就可以知道用戶訪問到服務(wù)器之間是否有人(代理服務(wù)器 等)修改過HTTP請(qǐng)求頭信息。
請(qǐng)求信息:
響應(yīng)信息:
HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Content-Length: 161 Date: Thu, 03 Aug 2017 10:38:43 GMTTANCE /webDemo/test HTTP/1.1 user-agent:Java/1.8.0_77 host:localhost:9999 accept:text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 connection:keep-alive本人簡(jiǎn)書blog地址:http://www.jianshu.com/u/1f0067e24ff8????
點(diǎn)擊這里快速進(jìn)入簡(jiǎn)書
GIT地址:http://git.oschina.net/brucekankan/
點(diǎn)擊這里快速進(jìn)入GIT
總結(jié)
- 上一篇: URL 源码分析
- 下一篇: InetAddress 解析