欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-19 19:30:17
详解http请求与响应基础及实例 一、http的请求与响应 二、httpservletrequest和httpservletresponse对象获取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请求与响应基础的详细介绍,如有疑问请大家留言!感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!