详解HTTP请求与响应基础及实例

详解HTTP请求与响应基础及实例

一、HTTP的请求与响应

二、HttpServletRequest和HttpServletResponse对象获取HTTP响应和请求

一、HTTP的请求与响应

HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传输协议。是客户端和服务器端之间数据传输的格式规范。

通常,由HTTP客户端发起一个请求,服务端一旦收到请求,向客户端返回一个相应(一个请求的发出,有且只有一个响应)。

(一)HTTP请求

请求报文格式如下:

请求行 - 请求头 - 实体内容

例如:

GET /webDemo/Hellow HTTP/1.1  //请求行
Host: localhost:8080      //请求头
Connection: keep-alive
Accept: text/html
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: zh-CN,zh;q=0.8
                //空行
                //实体内容

1、请求行

请求行的格式为

GET /webDemo/Hellow HTTP/1.1

请求方式 请求资源 http协议版本

(1)请求方式

请求方法有:

1) GET 请求指定的页面信息,并返回实体主体。
2) HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
3) POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
4) PUT 从客户端向服务器传送的数据取代指定的文档的内容。
5) DELETE 请求服务器删除指定的页面。
6) CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
7) OPTIONS 允许客户端查看服务器的性能。
8) TRACE 回显服务器收到的请求,主要用于测试或诊断。
常用的请求方式主要是GET和POST(通常用于表单的提交),浏览器直接访问的请求,默认提交方式为GET。

GET方法

提交的表单数据会在请求行的URI的后面。(以问号开头,跟随者键值对,以&连接)提交的数据大小有限制,不能超过1KB。不适合提交敏感数据。

POST方法

表单提交的数据会包含在实体内容当中。

(2)请求资源

该请求资源为Request-URI是一个统一资源标识符(Uniform Resource Identifier)是一个用于标识某一互联网资源名称的字符串。(本地,局域,互联网)

(3)HTTP协议版本

http 1.0:当浏览器客户端与服务器端建立连接后,发送一次请求后,就关闭连接
http 1.1:当浏览器客户端与服务器端建立连接后,可以在一次连接后,发送多次请求

2、请求头

常见的请求行:
Accept:text/html,image/*
请求报头域用于指定客户端接受哪些类型的信息

Accept-Charset: ISO-8859-1
求资源主机接受的编码格式

Accept-Encoding: gzip,compress
求资源主机接受的数据压缩格式

Accept-Language: en-us,zh-
求资源主机接受的语言

Host: localhost:8080
(必须的)主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的

User-Agent:
求资源主机浏览器类型

Connection:
求资源主机跟服务器连接状态
Connection: close 会发送请求后,自动断开连接
Connection: Keep-Alive 会发送请求后,依然保持连接

Date
求资源主机发出请求的时间

(二)HTTP响应

应答报文格式如下:
响应行 - 响应头 - 实体内容

HTTP/1.1 200 OK       //响应行
Server: Apache-Coyote/1.1  //相应头
Content-Length: 0
Date: Thu, 18 May 2017 13:21:23 GMT
              //空行
              //实体内容

HTTP响应与请求类似,主要了解的是其响应行的状态代码。

状态码:

100-199 表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程
200-299 表示成功接收请求并已完成真个处理过程,常用200
300-399 为完成请求,客户需进一步细化请求
400-499 客户端的请求有错误,常用404
500-599 服务器出现错误,常用500

常见的状态码:

200 表示请求处理完成并完美返回
302 表示请求需要进一细化
404 表示客户端访问的资源找不到
500 表示服务端出现问题

二、HttpServletRequest和HttpServletResponse对象获取HTTP响应和请求

(一)HttpServletRequest

//HttpServletRequest对象的常见方法
//请求行:
  request.getMethod(); //获取请求的提交方式
  request.getRequestURI(); //获取请求的URI
  request.getProtocol(); //获取请求的协议

//请求头:
  request.getHeader();  //获取请求头的强求值
  request.getHeaderName(); //获取请求头的所有名称

//实体内容:
  request.getInputStream(); //获取实体内容的输入流

例如,我们可以搭建一个tomcat servlet服务端,来获取用客户端的请求信息。

package sun;

import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Hellow
 */
@WebServlet("/Hellow")
public class GetRequestInfo extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //创建一个字符串来存储请求信息
    StringBuffer req = new StringBuffer();

    //获取请求行
    //获取请求方法,URI,HTTP版本
    req.append(request.getMethod()+" "+request.getRequestURI()+" "+request.getProtocol()+"\n");

    //获取请求头
    //获取所有请求头
    Enumeration<?> headerName = request.getHeaderNames();
    while(headerName.hasMoreElements()){
      String header= (String)headerName.nextElement();
      req.append(header+": ");

      //获取指定请求头的值
      Enumeration<?> headerValue = request.getHeaders(header);
      while(headerValue.hasMoreElements()){
        req.append((String)headerValue.nextElement()+";");
      }
      req.append("\n");
    }

    req.append("\n");
    //获取实体内容
    InputStream input = request.getInputStream();
    byte[] buffer = new byte[1024];
    int len = 0;
    while((len=input.read(buffer))!=-1){
      String str = new String(buffer,0,len);
      req.append(str);
    }
    //输出请求信息
    System.out.println(req);
  }

}

(二)HttpServletResponse

通过例子,来看通过修改响应信息来实现一些业务逻辑。

package sun;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Response
 */
@WebServlet("/Response")
public class ModifyResponseInfo extends HttpServlet {

  /**
   * Description:
   * 通过HttpServletResponse对象,改变响应信息
   * */
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    //1、修改响应行
    resp.setStatus(404);
    //resp.sendError(404);

    //2、修改响应头
    resp.setHeader("Server","JBoss");

    //3、修改实体内容
    //发送字符类型的实体内容
    resp.getWriter().write("response");
    //发送字节类型的实体内容
    resp.getOutputStream().write("response".getBytes());

    //4、通过修改响应头,来请求重定向
    //发送要给302状态码,location的响应头
    /*
    当浏览器认识到302状态码的时候,会再次自动向服务器发出一个请求,请求的地址就是location的value值
    请求重定向,一共向服务器发出2次请求
     */
    resp.setStatus(302);
    resp.setHeader("location","/webDemo/index.html");

    //也可以直接调用sendRedirect方法直接重定向
    //resp.sendRedirect("/webDemo/adv.html");

    //5、通过修改响应头,来实现定时刷新页面
    //一秒后刷新页面
    resp.setHeader("refresh","1");

    //也可以定时重定向页面
    //resp.setHeader("refresh","1;url=/webDemo/index.html");

    //6、通过修改响应头,来修改服务端和客户端的传输的数据类型
    //resp.setHeader("content-type","text/html")

    //也可以直接调用setContentType方法直接设置
    //在web.xml文件中找到对应的数据类型写法
    resp.setContentType("text/html");

  }

}

(三)获取请求参数

由于GET和POST提交参数的位置不同(POST方法: 表单提交的数据会包含在实体内容当中;GET方法: 提交的表单数据会在请求行的URI的后面。),因此GET和POST方法获取请求参数的方法也不样。

//获取GET方式参数:
request.getQueryString();

//获取POST方式参数:
request.getInputStream();

但是这样获得的参数,需要进行字符串的拆分以后才能使用。因此,Tomcat自动将GET和POST的请求参数封装在HttpServletRequest对象当中。可以调用以下方法获得:

  //根据指定名字来获取参数值
    request.getParameter("name");
    request.getParameter("password");

    //获取所有参数名字
    Enumeration<String> params = request.getParameterNames();
    while(params.hasMoreElements()){
      String param = params.nextElement();
      String value = request.getParameter(param);
    }

(四)编码问题

服务端和客户端可能存在着编码问题,当服务端和客户端的编码不同时,传输的数据就有可能因为编码问题而导致乱码。

1、手动解码

在获取的每个数据进行手工再次编码,这里是必须知道服务端的编码方式和客户端的编码方法。

name = new String(name.getBytes("iso-8859-1"),"utf-8");

2、设置参数查询码表

在获取数据之前,调用setCharacherEncoding方法设置指定编码格式。

该方法,只能对请求实体内容的编码起作用,所以只能对POST提交参数起作用。

request.setCharacherEncoding(“utf-8”);

3、修改服务器的配置文件

比如,tomcat服务器当中,修改server.xml配置文件

<!-- A "Connector" represents an endpoint by which requests are received
     and responses are returned. Documentation at :
     Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
     Java AJP Connector: /docs/config/ajp.html
     APR (HTTP/AJP) Connector: /docs/apr.html
     Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
  -->
  <!--在这里,加上属性URIEncoding,及指定编码值-->
  <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="utf-8"/>

以上就是HTTP请求与响应基础的详细介绍,如有疑问请大家留言!感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Android HTTP发送请求和接收响应的实例代码

    添加权限 首先要在manifest中加上访问网络的权限: 复制代码 代码如下: <manifest ... > <uses-permission android:name="android.permission.INTERNET" /> ... </manifest> 完整的Manifest文件如下: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?>

  • JAVA发送HTTP请求,返回HTTP响应内容,应用及实例代码

    JDK 中提供了一些对无状态协议请求(HTTP )的支持,下面我就将我所写的一个小例子(组件)进行描述:首先让我们先构建一个请求类(HttpRequester ).该类封装了 JAVA 实现简单请求的代码,如下: 复制代码 代码如下: import java.io.BufferedReader;  import java.io.IOException;  import java.io.InputStream;  import java.io.InputStreamReader;  import

  • python通过get,post方式发送http请求和接收http响应的方法

    本文实例讲述了python通过get,post方式发送http请求和接收http响应的方法.分享给大家供大家参考.具体如下: 测试用CGI,名字为test.py,放在apache的cgi-bin目录下: #!/usr/bin/python import cgi def main(): print "Content-type: text/html\n" form = cgi.FieldStorage() if form.has_key("ServiceCode") a

  • Node.js发送HTTP客户端请求并显示响应结果的方法示例

    本文实例讲述了Node.js发送HTTP客户端请求并显示响应结果的方法.分享给大家供大家参考,具体如下: wget.js:发送HTTP客户端请求并显示响应的各种结果 options对象描述了将要发出的请求. data事件在数据到达时被触发,error事件在发生错误时被触发. HTTP请求中的数据格式通过MIME协议来声明,例如,提交HTML表单时它的Content-Type会被设置成multipart/form-data. 要在HTTP客户端请求中发送数据,只需调用.write方法并写入符合规范

  • angular 用拦截器统一处理http请求和响应的方法

    想使用angularjs里的htpp向后台发送请求,现在有个用户唯一识别的token想要放到headers里面去,也就是{headres:{'token':1}} index.html里引入以下js: angular.module('app.factorys',[]) .factory('httpInterceptor',['$q','$injector','$localStorage',function ($q,$injector,$localStorage) { var httpInterc

  • 详解AngularJS用Interceptors来统一处理HTTP请求和响应

    Web 开发中,除了数据操作之外,最频繁的就是发起和处理各种 HTTP 请求了,加上 HTTP 请求又是异步的,如果在每个请求中来单独捕获各种常规错误,处理各类自定义错误,那将会有大量的功能类似的代码,或者使用丑陋的方法在每个请求中调用某几个自定义的函数来处理.这两种方法基本都不是靠谱之选.好在 AngularJS 提供了 Interceptors --拦截战斗机--来对应用内所有的 XHR 请求进行统一处理. 主要功能 Interceptors 有两个处理时机,分别是: 其它程序代码执行 HT

  • 详解HTTP请求与响应基础及实例

    详解HTTP请求与响应基础及实例 一.HTTP的请求与响应 二.HttpServletRequest和HttpServletResponse对象获取HTTP响应和请求 一.HTTP的请求与响应 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传输协议.是客户端和服务器端之间数据传输的格式规范. 通常,由HTTP客户端发起一个请求,服务端一旦收到请求,向客户端返回一个相应(一个请求的发出,有且只有一个响应). (一)

  • Spring Boot详解各类请求和响应的处理方法

    目录 1. HttpServletRequest与HttpServletResponse 2. GET类型的请求 2.1 /students?current=1&limit=20 2.2 /student/123 3. POST类型的请求 4. 响应HTML格式的数据 4.1 使用ModelAndView 4.2 使用Model 5. 响应JSON格式的数据 5.1 单组数据 5.2 多组数据 1. HttpServletRequest与HttpServletResponse 浏览器输入:htt

  • 详解Http请求中Content-Type讲解以及在Spring MVC中的应用

    详解Http请求中Content-Type讲解以及在Spring MVC中的应用 引言: 在Http请求中,我们每天都在使用Content-type来指定不同格式的请求信息,但是却很少有人去全面了解content-type中允许的值有多少,这里将讲解Content-Type的可用值,以及在spring MVC中如何使用它们来映射请求信息. 1.  Content-Type MediaType,即是Internet Media Type,互联网媒体类型:也叫做MIME类型,在Http协议消息头中,

  • 详解http请求中的Content-Type

    详解http请求中的Content-Type http头部字段Content-Type约定请求和响应的HTTP body内容编码类型,客户端和服务端根据http头部字段Content-Type正确解码HTTP body内容. 常见的http头部Content-Type: * application/x-www-form-urlencoded * multipart/form-data * application/json * application/xml 示例说明 * 前端使用Content-

  • 详解nginx请求头数据读取流程

    在上一篇文章中,我们讲解了nginx是如何读取请求行的数据,并且解析请求行的.本文我们则主要讲解nginx是如何读取客户端发送来的请求头的数据,并且解析这些数据的.本质上来讲,请求行的数据和请求头的数据读取流程是基本一致的,因为其都面临着如何从间断的数据流中读取到数据,也面临着如何对数据进行处理的问题. 1. 请求头读取主流程 在介绍请求头的读取流程之前,我们首先展示一个http请求报文的示例: POST /web/book/read HTTP/1.1 Host: localhost Conne

  • 详解Java中二叉树的基础概念(递归&迭代)

    目录 1.树型结构 1.1概念 1.2概念(重要) 2.二叉树(重点) 2.1概念 2.2二叉树的基本形态 2.3两种特殊的二叉树 2.4二叉树的性质 2.5二叉树的存储 2.6二叉树的基本操作 2.7二叉树的层序遍历 3.二叉树完整代码 1. 树型结构 1.1概念 树是一种 非线性 的数据结构,它是由 n ( n>=0 )个有限结点组成一个具有层次关系的集合. 把它叫做树是因为它看 起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的 . 1.2 概念(重要) a.节点的度:该节点子树的个数:如

  • 详解Python import方法引入模块的实例

    详解Python import方法引入模块的实例 在Python用import或者from-import或者from-import-as-来导入相应的模块,作用和使用方法与C语言的include头文件类似.其实就是引入某些成熟的函数库和成熟的方法,避免重复造轮子,提高开发速度. python的import方法可以引入系统的模块,也可以引入我们自己写好的共用模块,这点和PHP非常相似,但是它们的具体细节还不是很一样.因为php是在引入的时候指明引入文件的具体路径,而python中不能够写文件路径进

  • 详解 Python 与文件对象共事的实例

    详解 Python 与文件对象共事的实例 Python 有一个内置函数,open,用来打开在磁盘上的文件.open 返回一个文件对象,它拥有一些方法和属性,可以得到被打开文件的信息,以及对被打开文件进行操作. >>> f = open("/music/_singles/kairo.mp3", "rb") (1) >>> f (2) <open file '/music/_singles/kairo.mp3', mode 'r

  • 详解HDFS多文件Join操作的实例

    详解HDFS多文件Join操作的实例 最近在做HDFS文件处理之时,遇到了多文件Join操作,其中包括:All Join以及常用的Left Join操作, 下面是个简单的例子:采用两个表来做left join其中数据结构如下: A 文件: a|1b|2|c B文件: a|b|1|2|c 即:A文件中的第一.二列与B文件中的第一.三列对应:类似数据库中Table的主键/外键 代码如下: import java.io.DataInput; import java.io.DataOutput; imp

  • 详解json string转换为java bean及实例代码

    详解json string转换为java bean及实例代码 pom中添加如下两个库: <dependency> <groupId>org.codehaus.jackson </groupId> <artifactId>jackson-core-asl</artifactId> <version>1.9.2</version> <scope>provided</scope> </depende

随机推荐