Ⅰ 北大青鳥java培訓:http協議請求處理過程
隨著互聯網的不斷發展,用戶在訪問互聯網的時候使用的終端設備類型也在不斷的變化,但是這些都是基於http協議來實現的,下面我們就簡單分析一下,http發送請求的處理過程。
HTTP協議是基於TCP協議的,所以它使用面向連接的方式發送請求,通過stream二進制流的方式傳給對方。
當然,到了TCP層,它會把二進制流變成一個的報文段發送給伺服器。
在發送給每個報文段的時候,都需要對方有一個回應ACK,來保證報文可靠地到達了對方。
如果沒有回應,那麼TCP這一層會進行重新傳輸,直到可以到達。
同一個包有可能被傳了好多次,但是HTTP這一層不需要知道這一點,因為是TCP這一層在埋頭苦幹。
TCP層發送每一個報文的時候,都需要加上自己的地址(即源地址)和它想要去的地方(即目標地址),將這兩個信息放到IP頭裡面,交給IP層進行傳輸。
IP層需要查看目標地址和自己是否是在同一個區域網。
如果是,就發送ARP協議來請求這個目標地址對應的MAC地址,然後將源MAC和目標MAC放入MAC頭,發送出去即可。
如果不在同一個區域網,就需要發送到網關,還要需要發送ARP協議,來獲取網關的MAC地址,然後將源MAC和網關MAC放入MAC頭,發送出去。
網關收到包發現MAC符合,取出目標IP地址,根據路由協議找到下一跳的路由器,獲取下一跳路由器的MAC地址,將包發給下一跳路由器。
這樣路由器一跳一跳終於到達目標的區域網。
這個時候,後一跳的路由器能夠發現,目標地址就在自己的某一個出口的區域網上。
於是,在這個區域網上發送ARP,獲得這個目標地址的MAC地址,將包發出去。
目標的機器發現MAC地址符合,就將包收起來;發現IP地址符合,根據IP頭中協議項,知道自己上一層是TCP協議,於是解析TCP的頭,裡面有序列號,IT培訓http://www.kmbdqn.cn/建議需要看一看這個序列包是不是我要的,如果是就放入緩存中然後返回一個ACK,如果不是就丟棄。
TCP頭裡面還有埠號,HTTP的伺服器正在監聽這個埠號。
於是,目標機器自然知道是HTTP伺服器這個進程想要這個包,於是將包發給HTTP伺服器。
HTTP伺服器的進程看到,原來這個請求是要訪問一個網頁,於是就把這個網頁發給客戶端。
Ⅱ java使用HttpResponse請求其他系統的介面,對應Postman的設置
首先弄懂測試的需求,比如介面功能測試需求是什麼(什麼樣的輸入參數,返回什麼樣的輸出)、介面性能測試需求是什麼(最大支持多少並發訪問,後台伺服器資源配置極限是多少等等)
然後選擇一款介面測試工具(一般推薦 POSTMAN JMETER等等),也可以自己開發介面工具。
編寫介面功能測試和性能測試的用例(這個和一般的黑盒測試用例差不多,預置條件,測試步驟,預期結果)
使用測試工具或者腳本,執行測試用例。含提交BUG,跟蹤BUG閉環等等。
分析測試結果,出具測試報告。
PS:介面的功能測試很簡單,一般是訪問的URL,帶什麼參數,然後什麼加密方式,然後看返回值符不符合預期就可以了,把各種正常異常情況考慮到。介面性能測試的話除了要設置集合點並發訪問後台介面,然後還要在後台伺服器加監控,以便於檢測系統資源,一般通用的監控指標CPU 內存 網路 等等。當然具體也要看你要測試什麼樣的介面,弄懂介面的協議再測試。希望能幫到你。
Ⅲ 如何在java中發起http和https請求
1.寫http請求方法
[java] view plain
//處理http請求 requestUrl為請求地址 requestMethod請求方式,值為"GET"或"POST"
public static String httpRequest(String requestUrl,String requestMethod,String outputStr){
StringBuffer buffer=null;
try{
URL url=new URL(requestUrl);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestMethod(requestMethod);
conn.connect();
//往伺服器端寫內容 也就是發起http請求需要帶的參數
if(null!=outputStr){
OutputStream os=conn.getOutputStream();
os.write(outputStr.getBytes("utf-8"));
os.close();
}
//讀取伺服器端返回的內容
InputStream is=conn.getInputStream();
InputStreamReader isr=new InputStreamReader(is,"utf-8");
BufferedReader br=new BufferedReader(isr);
buffer=new StringBuffer();
String line=null;
while((line=br.readLine())!=null){
buffer.append(line);
}
}catch(Exception e){
e.printStackTrace();
}
return buffer.toString();
}
2.測試。
[java] view plain
public static void main(String[] args){
String s=httpRequest("http://www.qq.com","GET",null);
System.out.println(s);
}
輸出結果為www.qq.com的源代碼,說明請求成功。
註:1).第一個參數url需要寫全地址,即前邊的http必須寫上,不能只寫www.qq.com這樣的。
2).第二個參數是請求方式,一般介面調用會給出URL和請求方式說明。
3).第三個參數是我們在發起請求的時候傳遞參數到所要請求的伺服器,要傳遞的參數也要看介面文檔確定格式,一般是封裝成json或xml.
4).返回內容是String類,但是一般是有格式的json或者xml。
二:發起https請求。
1.https是對鏈接加了安全證書SSL的,如果伺服器中沒有相關鏈接的SSL證書,它就不能夠信任那個鏈接,也就不會訪問到了。所以我們第一步是自定義一個信任管理器。自要實現自帶的X509TrustManager介面就可以了。
[java] view plain
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;
public class MyX509TrustManager implements X509TrustManager {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
// TODO Auto-generated method stub
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
// TODO Auto-generated method stub
}
@Override
public X509Certificate[] getAcceptedIssuers() {
// TODO Auto-generated method stub
return null;
}
}
註:1)需要的包都是java自帶的,所以不用引入額外的包。
2.)可以看到裡面的方法都是空的,當方法為空是默認為所有的鏈接都為安全,也就是所有的鏈接都能夠訪問到。當然這樣有一定的安全風險,可以根據實際需要寫入內容。
2.編寫https請求方法。
[java] view plain
/*
* 處理https GET/POST請求
* 請求地址、請求方法、參數
* */
public static String httpsRequest(String requestUrl,String requestMethod,String outputStr){
StringBuffer buffer=null;
try{
//創建SSLContext
SSLContext sslContext=SSLContext.getInstance("SSL");
TrustManager[] tm={new MyX509TrustManager()};
//初始化
sslContext.init(null, tm, new java.security.SecureRandom());;
//獲取SSLSocketFactory對象
SSLSocketFactory ssf=sslContext.getSocketFactory();
URL url=new URL(requestUrl);
HttpsURLConnection conn=(HttpsURLConnection)url.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
conn.setRequestMethod(requestMethod);
//設置當前實例使用的SSLSoctetFactory
conn.setSSLSocketFactory(ssf);
conn.connect();
//往伺服器端寫內容
if(null!=outputStr){
OutputStream os=conn.getOutputStream();
os.write(outputStr.getBytes("utf-8"));
os.close();
}
//讀取伺服器端返回的內容
InputStream is=conn.getInputStream();
InputStreamReader isr=new InputStreamReader(is,"utf-8");
BufferedReader br=new BufferedReader(isr);
buffer=new StringBuffer();
String line=null;
while((line=br.readLine())!=null){
buffer.append(line);
}
}catch(Exception e){
e.printStackTrace();
}
return buffer.toString();
}
可見和http訪問的方法類似,只是多了SSL的相關處理。
3.測試。先用http請求的方法訪問,再用https的請求方法訪問,進行對比。
http訪問:
[java] view plain
public static void main(String[] args){
String s=httpRequest("https://kyfw.12306.cn/","GET",null);
System.out.println(s);
}
結果為:
https訪問:
[java] view plain
public static void main(String[] args){
String s=httpsRequest("https://kyfw.12306.cn/","GET",null);
System.out.println(s);
}
結果為:
可見https的鏈接一定要進行SSL的驗證或者過濾之後才能夠訪問。
三:https的另一種訪問方式——導入服務端的安全證書。
1.下載需要訪問的鏈接所需要的安全證書。https://kyfw.12306.cn/ 以這個網址為例。
1)在瀏覽器上訪問https://kyfw.12306.cn/。
2)點擊上圖的那個打了×的鎖查看證書。
3)選擇復制到文件進行導出,我們把它導入到java項目所使用的jre的lib文件下的security文件夾中去,我的是這個路徑。D:\Program Files (x86)\Java\jre8\lib\security
註:中間需要選導出格式,就選默認的就行,還需要命名,我命名的是12306.
2.打開cmd,進入到java項目所使用的jre的lib文件下的security目錄。
3.在命令行輸入 Keytool -import -alias 12306 -file 12306.cer -keystore cacerts
4.回車後會讓輸入口令,一般默認是changeit,輸入時不顯示,輸入完直接按回車,會讓確認是否信任該證書,輸入y,就會提示導入成功。
5.導入成功後就能像請求http一樣請求https了。
測試:
[java] view plain
public static void main(String[] args){
String s=httpRequest("https://kyfw.12306.cn/","GET",null);
System.out.println(s);
}
結果:
現在就可以用http的方法請求https了。
註:有時候這一步還是會出錯,那可能是jre的版本不對,我們右鍵run as——run configurations,選擇證書所在的jre之後再運行。
Ⅳ java怎麼主動發送http請求
實現思路就是先定義請求頭內容,之後進行請求頭設置。
定義請求頭
LinkedHashMap<String,String> headers = new LinkedHashMap<String,String>();
headers.put("Content-type","text/xml");
headers.put("Cache-Control", "no-cache");
headers.put("Connection", "close");
給HttpPost 設置請求頭
HttpPost httpPost = new HttpPost("地址");
if (headers != null) {
for (String key : headers.keySet()) {
httpPost.setHeader(key, headers.get(key));
}
}
備註:只需要在map中設置相應的請求頭內容即可。根據實際需要修改即可
Ⅳ java HTTP請求 處理
javax.servlet.http.HttpResponse類用於產生返回頁面.通過HttpResponse定義的方法getOutputStream()可以獲得ServletOutputStream的實例,這樣用戶就可以利用ServletOutputStream.write方法向輸出流中寫入返回頁面的內容. 但是ServletOutputStream使用的是預設的編碼方式,如果要使返回頁面中的中文字 符能夠正常顯示,最好顯示地指定所用的字元編碼方式. 通常需要構造一個 OutputStreamWriter , 常式如下:
public void doGet (HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
res.setContentType("text/html");
ServletOutputStream out = res.getOutputStream();
OutputStreamWriter ow = new OutputStreamWriter(out,"GB2312");
ow.write("這是測試");
ow.flush();
ow.close();
}
Ⅵ java 接受http請求
使用servlet
public class Test extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public Test() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//接收get請求
// 這里寫你接收request請求後要處理的操作
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//接收post請求
// 這里寫你接收request請求後要處理的操作
}
}
Ⅶ JAVA程序中的HttpURLConnection或httpclient如何設置intel連接
有多個寬頻連接就必須配置多個ip地址,如果網卡不支持多ip,就需要多塊網卡設置不同的網路
你用的寬頻A對應的ip當然就是用的寬頻A
Ⅷ 如何使用HttpClient包實現JAVA發起HTTP請求
publicclassHttpClientUtil{
publicstaticStringdoGet(Stringurl,Map<String,String>param){
//創建Httpclient對象
CloseableHttpClienthttpclient=HttpClients.createDefault();
StringresultString="";
CloseableHttpResponseresponse=null;
try{
//創建uri
URIBuilderbuilder=newURIBuilder(url);
if(param!=null){
for(Stringkey:param.keySet()){
builder.addParameter(key,param.get(key));
}
}
URIuri=builder.build();
//創建httpGET請求
HttpGethttpGet=newHttpGet(uri);
//執行請求
response=httpclient.execute(httpGet);
//判斷返回狀態是否為200
if(response.getStatusLine().getStatusCode()==200){
resultString=EntityUtils.toString(response.getEntity(),"UTF-8");
}
}catch(Exceptione){
e.printStackTrace();
}finally{
try{
if(response!=null){
response.close();
}
httpclient.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
returnresultString;
}
publicstaticStringdoGet(Stringurl){
returndoGet(url,null);
}
publicstaticStringdoPost(Stringurl,Map<String,String>param){
//創建Httpclient對象
CloseableHttpClienthttpClient=HttpClients.createDefault();
CloseableHttpResponseresponse=null;
StringresultString="";
try{
//創建HttpPost請求
HttpPosthttpPost=newHttpPost(url);
//創建參數列表
if(param!=null){
List<NameValuePair>paramList=newArrayList<>();
for(Stringkey:param.keySet()){
paramList.add(newBasicNameValuePair(key,param.get(key)));
}
//模擬表單
UrlEncodedFormEntityentity=newUrlEncodedFormEntity(paramList);
httpPost.setEntity(entity);
}
//執行http請求
response=httpClient.execute(httpPost);
System.out.println(response.getStatusLine());
resultString=EntityUtils.toString(response.getEntity(),"utf-8");
System.out.println(resultString);
}catch(Exceptione){
e.printStackTrace();
}finally{
try{
response.close();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
returnresultString;
}
publicstaticStringdoPost(Stringurl){
returndoPost(url,null);
}
publicstaticStringdoPostJson(Stringurl,Stringjson){
//創建Httpclient對象
CloseableHttpClienthttpClient=HttpClients.createDefault();
CloseableHttpResponseresponse=null;
StringresultString="";
try{
//創建HttpPost請求
HttpPosthttpPost=newHttpPost(url);
//創建請求內容
StringEntityentity=newStringEntity(json,ContentType.APPLICATION_JSON);
httpPost.setEntity(entity);
//執行http請求
response=httpClient.execute(httpPost);
resultString=EntityUtils.toString(response.getEntity(),"utf-8");
}catch(Exceptione){
e.printStackTrace();
}finally{
try{
response.close();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
returnresultString;
}
}
Ⅸ java 使用HttpURLConnection請求伺服器,如果發送請求時沒有問題,但返回結果時網路斷了,如何處理
.setConnectTimeout() 指的是與請求網址的伺服器建立連接的超時時間。
setReadTimeout() 指的是建立連接後如果指定時間內伺服器沒有返回數據的後超時。
503是錯誤碼,能返回就說明伺服器返回了response。超時指的是你指定的時間沒有收到伺服器的response。
不管哪種超時都不有狀態碼返回。因為返回是在response響應中的,而就是在設定的時間內沒有收到響應,才會超時。如果出現超時的話會拋出一個異常。你可以catch超時異常,然後根據需要處理就行了。
Ⅹ 如何使用HttpClient包實現JAVA發起HTTP請求
HttpClient可以發起Http請求.
比如要獲取某頁面, 那麼需要分析, 是POST請求還是GET請求.
分析請求的標題頭 ,參數 ,cookie等,
所以 , 分析頁面請求, 才是關鍵, 分析好了, 直接按套路,設置標頭, 設置參數, 設置cookie, 然後提交POST/GET就可以了
推薦win10自帶的EDGE瀏覽器, 按F12彈出開發窗口, 裡面詳細記錄了http請求