欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解HTTP請求與響應基礎及實例

 更新時間:2017年07月21日 09:51:15   作者:沈君  
這篇文章主要介紹了詳解HTTP請求與響應基礎及實例的相關資料,這里對http的請求和響應進行詳細分析并附有實現實例,需要的朋友可以參考下

詳解HTTP請求與響應基礎及實例

一、HTTP的請求與響應

二、HttpServletRequest和HttpServletResponse對象獲取HTTP響應和請求

一、HTTP的請求與響應

HTTP協(xié)議(HyperText Transfer Protocol,超文本傳輸協(xié)議)是用于從WWW服務器傳輸超文本到本地瀏覽器的傳輸協(xié)議。是客戶端和服務器端之間數據傳輸的格式規(guī)范。

通常,由HTTP客戶端發(fā)起一個請求,服務端一旦收到請求,向客戶端返回一個相應(一個請求的發(fā)出,有且只有一個響應)。

(一)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協(xié)議版本

(1)請求方式

請求方法有:

1) GET 請求指定的頁面信息,并返回實體主體。
2) HEAD 類似于get請求,只不過返回的響應中沒有具體的內容,用于獲取報頭
3) POST 向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。POST請求可能會導致新的資源的建立和/或已有資源的修改。
4) PUT 從客戶端向服務器傳送的數據取代指定的文檔的內容。
5) DELETE 請求服務器刪除指定的頁面。
6) CONNECT HTTP/1.1協(xié)議中預留給能夠將連接改為管道方式的代理服務器。
7) OPTIONS 允許客戶端查看服務器的性能。
8) TRACE 回顯服務器收到的請求,主要用于測試或診斷。
常用的請求方式主要是GET和POST(通常用于表單的提交),瀏覽器直接訪問的請求,默認提交方式為GET。

GET方法

提交的表單數據會在請求行的URI的后面。(以問號開頭,跟隨者鍵值對,以&連接)提交的數據大小有限制,不能超過1KB。不適合提交敏感數據。

POST方法

表單提交的數據會包含在實體內容當中。

(2)請求資源

該請求資源為Request-URI是一個統(tǒng)一資源標識符(Uniform Resource Identifier)是一個用于標識某一互聯(lián)網資源名稱的字符串。(本地,局域,互聯(lián)網)

(3)HTTP協(xié)議版本

http 1.0:當瀏覽器客戶端與服務器端建立連接后,發(fā)送一次請求后,就關閉連接
http 1.1:當瀏覽器客戶端與服務器端建立連接后,可以在一次連接后,發(fā)送多次請求

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:
求資源主機跟服務器連接狀態(tài)
Connection: close 會發(fā)送請求后,自動斷開連接
Connection: Keep-Alive 會發(fā)送請求后,依然保持連接

Date
求資源主機發(fā)出請求的時間

(二)HTTP響應

應答報文格式如下:
響應行 - 響應頭 - 實體內容

HTTP/1.1 200 OK       //響應行
Server: Apache-Coyote/1.1  //相應頭
Content-Length: 0
Date: Thu, 18 May 2017 13:21:23 GMT
              //空行
              //實體內容

HTTP響應與請求類似,主要了解的是其響應行的狀態(tài)代碼。

狀態(tài)碼:

100-199 表示成功接收請求,要求客戶端繼續(xù)提交下一次請求才能完成整個處理過程
200-299 表示成功接收請求并已完成真?zhèn)€處理過程,常用200
300-399 為完成請求,客戶需進一步細化請求
400-499 客戶端的請求有錯誤,常用404
500-599 服務器出現錯誤,常用500

常見的狀態(tài)碼:

200 表示請求處理完成并完美返回
302 表示請求需要進一細化
404 表示客戶端訪問的資源找不到
500 表示服務端出現問題

二、HttpServletRequest和HttpServletResponse對象獲取HTTP響應和請求

(一)HttpServletRequest

//HttpServletRequest對象的常見方法
//請求行:
  request.getMethod(); //獲取請求的提交方式
  request.getRequestURI(); //獲取請求的URI
  request.getProtocol(); //獲取請求的協(xié)議

//請求頭:
  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 {
    //創(chuàng)建一個字符串來存儲請求信息
    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

通過例子,來看通過修改響應信息來實現一些業(yè)務邏輯。

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、修改實體內容
    //發(fā)送字符類型的實體內容
    resp.getWriter().write("response");
    //發(fā)送字節(jié)類型的實體內容
    resp.getOutputStream().write("response".getBytes());


    //4、通過修改響應頭,來請求重定向
    //發(fā)送要給302狀態(tài)碼,location的響應頭
    /*
    當瀏覽器認識到302狀態(tài)碼的時候,會再次自動向服務器發(fā)出一個請求,請求的地址就是location的value值 
    請求重定向,一共向服務器發(fā)出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請求與響應基礎的詳細介紹,如有疑問請大家留言!感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關文章

  • SpringBoot集成minio實現文件上傳和刪除功能

    SpringBoot集成minio實現文件上傳和刪除功能

    這篇文章主要介紹了SpringBoot集成minio實現文件上傳和刪除功能,詳細介紹每個功能的實現步驟和代碼示例,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • JAXB簡介_動力節(jié)點Java學院整理

    JAXB簡介_動力節(jié)點Java學院整理

    這篇文章主要為大家詳細介紹了JAXB簡介的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • java使用ArrayList實現斗地主(無序版)

    java使用ArrayList實現斗地主(無序版)

    這篇文章主要為大家詳細介紹了java使用ArrayList實現斗地主,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • SpringCloud超詳細講解Feign聲明式服務調用

    SpringCloud超詳細講解Feign聲明式服務調用

    Feign可以把Rest的請求進行隱藏,偽裝成類似Spring?MVC的Controller一樣。不用再自己拼接url,拼接參數等等操作,一切都交給Feign去做
    2022-06-06
  • zookeeper實戰(zhàn)之實現分布式鎖的方法

    zookeeper實戰(zhàn)之實現分布式鎖的方法

    Zookeeper實現分布式鎖比Redis簡單,Zookeeper有一個特性,多個線程在Zookeeper里創(chuàng)建同一個節(jié)點時,只有一個線程執(zhí)行成功,Zookeeper主要是利用臨時有序節(jié)點這一特性實現分布式鎖,感興趣的朋友跟隨小編一起學習吧
    2022-11-11
  • springboot?vue項目管理后端實現接口新增

    springboot?vue項目管理后端實現接口新增

    這篇文章主要為大家介紹了springboot?vue項目管理后端實現接口新增,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Springboot?如何使用BindingResult校驗參數

    Springboot?如何使用BindingResult校驗參數

    這篇文章主要介紹了Springboot?如何使用BindingResult校驗參數,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • SpringMVC日期類型接收空值異常問題解決方法

    SpringMVC日期類型接收空值異常問題解決方法

    這篇文章主要介紹了SpringMVC日期類型接收空值異常問題解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • Gradle的SpringBoot項目構建圖解

    Gradle的SpringBoot項目構建圖解

    這篇文章主要介紹了Gradle的SpringBoot項目構建圖解,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • java制作仿微信錄制小視頻控件

    java制作仿微信錄制小視頻控件

    這篇文章主要介紹了java制作仿微信錄制小視頻控件的代碼,錄制小視頻非常方便,有需要的小伙伴可以參考下。
    2015-04-04

最新評論