HTTP 方法

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。

tomcat默认servlet

在DefaultServlet的初始化参数中配置readonly=true。

配置tomcat支持TRACE方法

打开tomcat/conf/server.xml配置文件

Paste_Image.png

在连接器中添加 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>");
    }

    @Override
    protected void doHead(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    }

    @Override
    protected void doPut(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.getWriter().append("<html><body>Http Method : PUT</body></html>");
    }
    
    @Override
    protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().append("<html><body>Http Method : DELETE</body></html>");
    }

    @Override
    protected 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、TRACE
            http.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. 请求实体 (与请求首部中间有一空行, 请求的实体内容)

http请求格式

服务器端响应

  1. 响应行 (协议版本 空格 状态码 空格 状态码说明)
  2. 响应首部 (key : value 可以多个以回车换行结束)
  3. 响应实体 (与请求首部中间有一空行,响应的内容)

http响应格式

通过抓包分析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存放在请求实体中。 请求信息:

POST /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
Content-type: application/x-www-form-urlencoded
Content-Length: 9

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 GMT

TRACE方法

TRACE方法是让Web服务器端将之前的请求通信(服务器接收到的请求头)返回给客户端的方法。 通过TRACE方法,我们就可以知道用户访问到服务器之间是否有人(代理服务器 等)修改过HTTP请求头信息。 请求信息:

TRACE /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: 161
Date: Thu, 03 Aug 2017 10:38:43 GMT

TANCE /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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小灰灰

Redis实现分布式锁相关注意事项

Redis实现分布式锁相关注意事项 查看了不少关于redis实现分布式锁的文章,无疑要设计一个靠谱的分布式并不太容易,总会出现各种鬼畜的问题;现在就来小述一下...

33680
来自专栏龙首琴剑庐

Java使用wsdl生成axis版本webservice服务端/客户端代码

步骤摘要: 1、使用axis安装包的jar包 2、直接执行 WSDL2Java.main(new String[]{"-o", "src", "--serve...

51980
来自专栏韩东吉的Unity杂货铺

零基础入门 26:通过代码关闭程序

Hello,各位小伙伴,又是好久没见,因为最近工作变动的原因,停更了快一个月的时间,好多同学都QQ问我什么时候更,会不会不更新了之类的。答案当然是不会的。

9310
来自专栏FreeBuf

HTTP认证的底层技术简析与揭秘

写在前面的话 HTTP认证实现的基础是Web服务器与浏览器之间能够安全地交换类似用户名和密码这样的用户凭证,我们也可以把HTTP认证当作是摘要验证(Digest...

22290
来自专栏码农阿宇

asp.net core轻松入门之MVC中Options读取配置文件

接上一篇中讲到利用Bind方法读取配置文件 ASP.NET Core轻松入门Bind读取配置文件到C#实例 那么在这篇文章中,我将在上一篇文章的基础上,利...

27840
来自专栏IMWeb前端团队

上手 yeoman generator

最近折腾脚手架相关的一些事情。说到脚手架,不得不谈的就是yeoman了。 是什么 yeoman是一个脚手架生成工具。 yeoman generator则是yeo...

25150
来自专栏静默虚空的博客

[Servlet] 初识Servlet

什么是Servlet? 定义 Servlet的全称是 Server Applet,顾名思义,就是用 Java 编写的服务器端程序。 Servlet 是一个 Ja...

19990
来自专栏张善友的专栏

Contact Manager Web API 示例[2] Web API Routing

联系人管理器web API是一个Asp.net web api示例程序,演示了通过ASP.NET Web API 公开联系信息,并允许您添加和删除联系人,示例地...

20760
来自专栏熊训德的专栏

Hbase compaction 源码分析一:compaction 概况分析

本文档从框架的源码角度梳理了,hbase 在什么情况下会触发compaction,并通过官方文档说明出发minor 和major compaction的时间点。

56810
来自专栏技术之路

servlet乱码问题总结

在学习时servlet乱码问题还是挺严重的,总结一下有三种情况  1.新建HTML页面后浏览出现乱码 2.以post形式请求时出现乱码 3.以get形式请求时出...

21560

扫码关注云+社区

领取腾讯云代金券