zoukankan      html  css  js  c++  java
  • http就是这么简单

     

     关于http的简单介绍请参考MDN的文档,写的非常好,https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Overview。

    http是简单的/无状态的/可拓展的/请求响应式的超文本传输协议。底层一般采用tcp传输。

      1. 请求

    http请求报文:

    请求由以下元素组成:

      • 一个HTTP的method,经常是由一个动词像GETPOST 或者一个名词像OPTIONSHEAD来定义客户端的动作行为。通常客户端的操作都是获取资源(GET方法)或者发送HTML form表单值(POST方法),虽然在一些情况下也会有其他操作。
      • 要获取的资源的路径,通常是上下文中就很明显的元素资源的URL,它没有protocolhttp://),domaindeveloper.mozilla.org),或是TCP的port(HTTP一般在80端口)。
      • HTTP协议版本号。
      • 为服务端表达其他信息的可选头部headers
      • 对于一些像POST这样的方法,报文的body就包含了发送的资源,这与响应报文的body类似。

         2.响应

    HTTP响应的一个例子:

    响应报文包含了下面的元素:

      • HTTP协议版本号。
      • 一个状态码(status code),来告知对应请求执行成功或失败,以及失败的原因。
      • 一个状态信息,这个信息是非权威的状态码描述信息,可以由服务端自行设定。
      • HTTP headers,与请求头部类似。
      • 可选项,比起请求报文,响应报文中更常见地包含获取的资源body。

    http最简单的一个响应为:

    PrintWriter pw = new PrintWriter(socket.getOutputStream());
    pw.println("HTTP/1.1
    
    hello,world");
    pw.flush();

    其中"HTTP/1.1"为协议版本,' '为换行符号,意思就是中间要隔着一个空行,'hello,world'是请求body.

    即:

    HTTP/1.1
    
    hello,world
    

     也就是说,最简单的http响应为:

    请求头(协议版本)
    (空行)
    请求体

    当然,如果直接pw.println("hello,world"),firefox可以解析,但是chrome不能正常解析,亲测。

    不过这不是最基本的响应,最基本的应该是这样:

    HTTP/1.1 200 OK
    
    <html>
        <head>
           <title>a</title>
        </head>
        <body>hello,world!
          <button>submit</button>
        </body>
    </html>

    在代码中表示:

                    StringBuilder sb = new StringBuilder();
                    sb.append("HTTP/1.1 200 OK").append("
    
    ")
                            .append("<html><head><title>a</title></head><body>hello,world!<button>submit</button></body></html>");
                    pw.println(sb.toString());

    效果:

    像我们平时看到的这种响应。

    这些其实都是一些非必要的header,我们完全可以自己定义一些header,只要客户端和服务端能约定好其中的语义,能互相理解就行,这就是为什么说http是可扩展的。

    .append("
    name:xiejh").append("
    sex:man")

    效果:

    这下,明白http为啥很简单了吧,哈哈。

  • 相关阅读:
    C# Linq 类似Scala中的map的函数
    Spark DataFrame NOT IN实现方法
    Scala scopt 命令行解析
    WPF 绑定到静态属性,可通知
    WPF GroupBox Header居中
    WPF开源项目整理(排名不分先后)
    Windows 上配置 Go 的 gRPC 编译环境
    C++20新线程 jthread 体验代码
    查找被删除但仍然占据磁盘的文件
    以Docker方式安装Redis集群
  • 原文地址:https://www.cnblogs.com/xiejh8/p/10705561.html
Copyright © 2011-2022 走看看