Web核心+HTTP協(xié)議
準(zhǔn)備工作:XAMPP+PhpWindd+Aglieone
HTTP協(xié)議簡介
HTTP請求
最常用請求
GET請求獲取URL所標(biāo)識的資源
POST請求在URL所標(biāo)識的資源后附加新的數(shù)據(jù)
請求參數(shù)所代表的意義
content-Length內(nèi)容大小
content-Type內(nèi)容類型
Server服務(wù)器類型
等等
不常用請求
HEAD請求獲取由Request-URL所標(biāo)識的資源的響應(yīng)消息報頭
OPTIONS請求查詢服務(wù)器的性能慷嗜,或查詢與資源相關(guān)的選項和需求
PUT請求服務(wù)器存儲一個資源碰凶,并用URL作為其標(biāo)識
DELETE請求服務(wù)器刪除由URL所標(biāo)識的資源
TRACE請求服務(wù)器回送收到的請求信息型诚,主要用于測試或診斷
HTTP響應(yīng)
HTTP
網(wǎng)絡(luò)協(xié)議版本
Server
服務(wù)器版本
Data
服務(wù)器處理頁面的時間姑子,格林威治時間+8小時=北京時間
content-Type
告訴服務(wù)器傳輸數(shù)據(jù)類型
transfer-encoding
數(shù)據(jù)分塊傳輸寻定,響應(yīng)后需要拼接
X-UA-compatible
瀏覽器的兼容性
HTTP字段含義較多蓖租,不一一總結(jié)了
學(xué)習(xí)方法
善于結(jié)合工具進行分析
字段的理解缭保,歸納常用字段信息
HTTP-Session
無狀態(tài)的缺失
Session ID
一個回話的ID號蘸朋,用來唯一標(biāo)識客戶端
比如進行登錄時就需要對session進行保存
鍵值對
保存在服務(wù)器端
清除catch和cooki信息
cookie的作用域
HTTP-Cookie
鍵值對形式
保存在客戶端
比如使用cookie保存用戶登錄時長
實戰(zhàn):Fiddler協(xié)議監(jiān)控工具使用
暴力破解
重編譯url
實戰(zhàn):HTTPWatch協(xié)議分析
實戰(zhàn):RestClient手動發(fā)送請求
實戰(zhàn):論壇自動灌水-Java
測試類型
業(yè)務(wù)
場景
技術(shù)
梳理思路
GET,POST,Session,Cookie
如何與論壇發(fā)帖關(guān)聯(lián)起來
1.GET,POST請求如何發(fā)送
get請求
創(chuàng)建一個get請求方法
1.建立連接
HttpURLConnection對象
URL對象
將URL對象轉(zhuǎn)換為HttpURLConnection對象
2. 設(shè)置請求參數(shù)
urlConnection.setConnectTimeout(5000);
3. 獲取響應(yīng)內(nèi)容
bf = new BuffereReader(new ImputStreamReader(urlConnection.getInputStream(),"UTF-8"))
String line = bf.readLine();
4. 在main函數(shù)中調(diào)用該方法
post請求
多了一個給服務(wù)器發(fā)送的正文
創(chuàng)建一個寫文件的標(biāo)準(zhǔn)對象,獲取getOutputStream輸出流
pw = new PrintWriter(urlConnection.getOutputStream());
傳送給服務(wù)器的參數(shù),即post的正文
pw.print(paramValue);
pw.flush();
2.JAVA如何維護Session
想辦法獲取到變量和值
在響應(yīng)的內(nèi)容進行查找cookie
將用Java代碼獲取到的cookie信息發(fā)給服務(wù)器
Java的字符串處理操作
相關(guān)代碼和注釋詳解
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.*; // 跟網(wǎng)絡(luò)相關(guān)的包都在Java.net下
import java.util.List;
import java.util.Map;
public class JavaHTTPHandle {
private String globalCookie = "";
public static void main(String[] args) {
// TODO Auto-generated method stub
JavaHTTPHandle jhh = new JavaHTTPHandle(); // 實例化類JavaHTTPHandle
// jhh.sendGet("http://www.baidu.com",""); // 調(diào)用自定義的sendGet方法
jhh.sendPost("https://cloud.ravvar.cn/account/login/username", "username=darseek1&password=123456","");
jhh.sendPost("https://cloud.ravvar.cn/account/login/username", "username=darseek1&password=123456",jhh.globalCookie);
}
public void sendGet(String urlAddress,String cookieValue) {// 第一步創(chuàng)建一個get請求
try {
// 建立連接并發(fā)送請求
HttpURLConnection urlConnection = null; // 實例化對象
URL url = new URL(urlAddress); // 實例化對象韩容,打開URL地址;用字符串參數(shù)的形式進行傳遞
// URL與HttpURLConnection的類型不一致款违,在轉(zhuǎn)換的時候需要強制轉(zhuǎn)換,將URL父對象轉(zhuǎn)換為HttpURLConnection子對象群凶。
urlConnection = (HttpURLConnection)url.openConnection(); // 建立了鏈接并且訪問了url地址
// 設(shè)置請求里的發(fā)送參數(shù)
urlConnection.setConnectTimeout(5000);
urlConnection.setReadTimeout(5000);
urlConnection.setUseCaches(false);
// urlConnection.setRequestProperty("cookie", "x=y"); //設(shè)置cookie請求值
urlConnection.connect(); // 將get請求發(fā)送給服務(wù)器
// 獲取響應(yīng)內(nèi)容,可選項;從輸入流InputStreamReader里面讀取響應(yīng)內(nèi)容urlConnection.getInputStream()插爹,讀取后放到緩沖區(qū)
BufferedReader bf = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(),"UTF-8"));
// 將緩沖區(qū)內(nèi)容一行行輸出出來
String line = bf.readLine(); // 讀取第一行內(nèi)容
while (line !=null) { // 循環(huán)到一行中沒有內(nèi)容時停止
System.out.println(line);
line = bf.readLine(); // 循環(huán)一次讀一行
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void sendPost(String urlAddress,String paramValue,String cookieValue) {
try {
// 建立連接并發(fā)送請求
HttpURLConnection urlConnection = null; // 實例化對象
URL url = new URL(urlAddress); // 實例化對象,打開URL地址;用字符串參數(shù)的形式進行傳遞
// URL與HttpURLConnection的類型不一致请梢,在轉(zhuǎn)換的時候需要強制轉(zhuǎn)換赠尾,將URL父對象轉(zhuǎn)換為HttpURLConnection子對象。
urlConnection = (HttpURLConnection)url.openConnection(); // 建立了鏈接并且訪問了url地址
// 設(shè)置請求里的發(fā)送參數(shù)
urlConnection.setConnectTimeout(5000);
urlConnection.setReadTimeout(5000);
urlConnection.setDoOutput(true); // 接受輸出
urlConnection.setUseCaches(false);
urlConnection.setRequestProperty("Cookie", cookieValue);
urlConnection.connect(); // 將get請求發(fā)送給服務(wù)器
// 創(chuàng)建一個寫文件的標(biāo)準(zhǔn)對象,獲取getOutputStream輸出流
PrintWriter pw = new PrintWriter(urlConnection.getOutputStream());
pw.print(paramValue); // 傳送給服務(wù)器的參數(shù)毅弧,即post的正文气嫁,比如用戶名和密碼
pw.flush();
// 獲取響應(yīng)內(nèi)容,可選項;從輸入流InputStreamReader里面讀取響應(yīng)內(nèi)容urlConnection.getInputStream(),讀取后放到緩沖區(qū)
BufferedReader bf = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(),"UTF-8"));
// 將緩沖區(qū)內(nèi)容一行行輸出出來
String line = bf.readLine(); // 讀取第一行內(nèi)容
while (line !=null) { // 循環(huán)到一行中沒有內(nèi)容時停止
System.out.println(line);
line = bf.readLine(); // 循環(huán)一次讀一行
}
// urlConnection.getHeaderField("Set-Cookie") // 獲取響應(yīng)頭中Set-Cookie對應(yīng)的值
Map<String,List<String>> map = urlConnection.getHeaderFields(); // 獲取所有響應(yīng)頭里的信息
List list = (List)map.get("Set-Cookie"); // 取出Set-Cookie相關(guān)的信息
for (int i=0;i<list.size();i++) { // 取出list中的所有行
// 從每一行中獲取關(guān)鍵字
String temp = list.get(i).toString(); // 定義一個變量
String value[] = temp.split(";"); // 定義一個數(shù)組够坐,使用分號進行分割
this.globalCookie += value[0] + ";"; // 定義一個全局變量來存放數(shù)組中獲取到的第一個字段,并進行拼裝
System.out.println(globalCookie);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}