HTTP 方法
HTTP協議 所有的方法
| GET | 獲得資源 | 1.0、 1.1 |
| POST | 傳輸實體主體 | 1.0、 1.1 |
| PUT | 傳輸文件 | 1.0、 1.1 |
| DELETE | 刪除文件 | 1.0、 1.1 |
| HEAD | 獲得HTTP協議首部 | 1.0、 1.1 |
| OPTIONS | 詢問HTTP服務器支持的HTTP協議的方法 | 1.1 |
| TRACE | 追蹤路徑 | 1.1 |
| CONNECT | 要求用隧道協議連接代理 | 1.1 |
| LINK | 建立和資源之間的關系 | 1.0 |
| UNLINK | 斷開連接關系 | 1.0 |
下面我們通過tomcat所支持的HTTP方法來詳解每個方法。
tomcat默認支持 GET、POST、HEAD、OPTIONS方法,而不支持PUT、DELETE、TRACE方法。
下面我們配置tomcat,讓tomcat支持PUT、DELETE、TRACE方法。
配置Tomcat
配置tomcat支持 PUT、DELETE方法
打開tomcat/conf/web.xml配置文件
從說明中可以看出,如果要支持PUT、DELETE方法,需要將readonly設置為true。
在DefaultServlet的初始化參數中配置readonly=true。
配置tomcat支持TRACE方法
打開tomcat/conf/server.xml配置文件
在連接器中添加 allowTrace=true, 使tomcat支持TRACE方法。
Servlet 實現 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進行請求http服務。
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提交參數 // 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 協議格式
Http協議格式分為客戶端請求格式和服務端響應格式。
客戶端請求:
1. 請求行 (Http方法 空格 請求路徑 空格 協議版本 \r\n)
2. 請求首部 (key : value 可以多個以回車換行結束)
3. 請求實體 (與請求首部中間有一空行, 請求的實體內容)
服務器端響應
1. 響應行 (協議版本 空格 狀態碼 空格 狀態碼說明)
2. 響應首部 (key : value 可以多個以回車換行結束)
3. 響應實體 (與請求首部中間有一空行,響應的內容)
通過抓包分析7種方法
通過上面代碼示例,請求http的7種方法,然后使用抓包工具查看7中HTTP請求,每種HTTP協議發送的內容如下:
GET方法
GET方法用來請求訪問已被URI識別的資源。指定的資源經服務器解析后返回的內容。
請求信息:
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響應信息:
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方法用來傳輸實體的主體。提交表單的信息存放在請求實體中。例如下面的例子name=jijs存放在請求實體中。
請求信息:
響應信息:
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協議的文件上傳一樣,要求在請求報文的主體中包含文件內容,然后保存到請求URL指定的位置。
HTTP1.1的PUT方法自身不帶驗證機制,任何人都可能上傳文件,存在安全問題,因此一般的Web網站都不使用該方法。如果使用REST,一般就會使用該方法。
請求信息:
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響應信息:
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 方法用來刪除一個文檔,與PUT方法相反。DELETE方法也存在PUT存在問題,沒有自帶安全機制,如果采用REST,一般會使用該方法。
請求信息:
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響應信息:
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服務器支持那些方法。
請求信息:
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響應信息:
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方法是讓Web服務器端將之前的請求通信(服務器接收到的請求頭)返回給客戶端的方法。
通過TRACE方法,我們就可以知道用戶訪問到服務器之間是否有人(代理服務器 等)修改過HTTP請求頭信息。
請求信息:
響應信息:
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本人簡書blog地址:http://www.jianshu.com/u/1f0067e24ff8????
點擊這里快速進入簡書
GIT地址:http://git.oschina.net/brucekankan/
點擊這里快速進入GIT
總結
- 上一篇: URL 源码分析
- 下一篇: InetAddress 解析