1、http請求的基本過程是什麼?
http請求的基本過程是連接、請求、應答、關閉連接。
2、如何給http伺服器發送post請求
1、HTTP請求概述
在前面有一篇文章對HTTP協議有詳細的描述,這里就不再過多的做說明,只是簡單的作為這篇文章的引子。
HTTP協議又被稱為超文本傳輸協議,它的的設計目的是保證客戶機與伺服器之間的通信。HTTP 的工作方式是客戶端與伺服器之間的請求-應答協議。在客戶端和伺服器之間進行請求-響應時,有兩個最基本的請求方式:GET 和 POST。
其中,GET請求表示從指定的資源請求數據,POST請求表示向指定的資源提交要被處理的數據。
2、HTTP請求格式
在HTTP請求中,首先是請求行,注意這里的請求行一定要放在最前面;其次,是請求頭,英文表示為header;然後會空一行,緊接著就可以是請求的具體內容了,一般稱之為請求體,request-body。給出一個圖示如下:
3、GET請求與POST請求對比
GET請求與POST請求有一些異同點,主要有以下幾點問題:
(1)、GET請求和POST請求都是客戶端與伺服器之間交互,請求--應答模式的協議
(2)、GET請求是通過URL直接請求數據,數據信息可以在URL中直接看到,比如瀏覽器訪問;而POST請求是放在請求頭中的,我們是無法直接看到的;
(3)、GET提交有數據大小的限制,一般是不超過1024個位元組,而這種說法也不完全准確,HTTP協議並沒有設定URL位元組長度的上限,而是瀏
覽器做了些處理,所以長度依據瀏覽器的不同有所不同;POST請求在HTTP協議中也沒有做說明,一般來說是沒有設置限制的,但是實際上瀏覽器也有默認
值。總體來說,少量的數據使用GET,大量的數據使用POST。
(4)、GET請求因為數據參數是暴露在URL中的,所以安全性比較低,比如密碼是不能暴露的,就不能使用GET請求;POST請求中,請求參數信息是放在請求頭的,所以安全性較高,可以使用。在實際中,涉及到登錄操作的時候,盡量使用HTTPS請求,安全性更好。
下面給出一副圖示,說明一下HTTP中GET與POST請求的差異:
4、使用步驟:
在Android中使用HTTP請求,主要步驟如下:
(1)、實例化一個HttpGet(或HttpPost)對象,將請求的URL地址通過構造方法傳給HttpGet(或HttpPost)對象;
(2)、使用DefaultHttpClient類的execute方法發送GET或POST 請求,並返回HttpResponse對象;
(3)、通過HttpResponse介面的getEntity方法返回響應信息。
5、實例代碼
給出一個在實際應用中的一個POST請求的代碼片段:
[java] view plain copy print?
params = new LinkedList();
params.add(new BasicNameValuePair("param1", "Post方法"));
params.add(new BasicNameValuePair("param2", "第二個參數"));
try {
HttpPost post = new HttpPost(baseUrl);
post.setEntity(new UrlEncodedFormEntity(params, "utf-8")); //將參數填入POST Entity中
HttpResponse response = httpClient.execute(post); //執行POST方法
resCode = response.getStatusLine().getStatusCode()); //獲取響應碼
result = EntityUtils.toString(response.getEntity(), "utf-8")); //獲取響應內容
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
6、HTTP請求狀態碼意義
HTTP請求中,主要有這樣幾個類型:1XX:表示信息提示,2XX:表示成功,3XX:表示重定向,4XX:表示客戶端請求錯誤,5XX:表示伺服器錯誤。常見的幾個HTTP請求狀態碼意義如下:
200 OK: 找到了該資源,並且一切正常。
304 NOT MODIFIED: 該資源在上次請求之後沒有任何修改。這通常用於瀏覽器的緩存機制。
401 UNAUTHORIZED: 客戶端無權訪問該資源。這通常會使得瀏覽器要求用戶輸入用戶名和密碼,以登錄到伺服器。
403 FORBIDDEN: 客戶端未能獲得授權。這通常是在401之後輸入了不正確的用戶名或密碼。
404 NOT FOUND: 在指定的位置不存在所申請的資源。
505 NOT SUPPORTED:伺服器不支持請求中所指明的HTTP版本
3、HTTP 的請求處理過程是什麼?
那個叫名稱解析過程:
當客戶端向DNS伺服器發送請求,要求解析地址地址www.baidu.com時,將執行如下步驟:
1.為了查詢www.baidu.com的IP地址,客戶端發出請求並向所設置的DNS伺服器發送遞歸查詢。
2.若所設DNS伺服器無法在其資料庫中找到www.baidu.com的匹配項,則向根目錄域的權威DNS發送迭代查詢。
3.若根目錄域權威DNS伺服器也找不到www.baidu.com的匹配項,則以com域的權威DNS伺服器的IP地址返回給1中的伺服器。
4.1中的DNS伺服器收到根目錄域返回信息後,向com域的權威DNS伺服器發送迭代查詢。
5.若com域的權威DNS伺服器也找不到www.baidu.com的匹配項,則以web.com域的權威DNS伺服器的IP地址返回給1中的伺服器。
6.1中的DNS伺服器收到com域返回信息後,向web.com域的權威DNS伺服器發送迭代查詢。
7.若web.com域的權威DNS伺服器在其資料庫中找到了www.baidu.com的匹配項,則以www.baidu.com的IP地址返回給1中的伺服器。
8.1中的DNS伺服器收到web.com域返回信息後,將www.baidu.com的IP地址作為響應發送給客戶端。
4、如何對 HTTP 請求中的字元編碼進行正確的處理
1. 什麼是URL編碼。
URL編碼是一種瀏覽器用來打包表單輸入的格式,瀏覽器從表單中獲取所有的name和其對應的value,將他們以name/value編碼方式作為URL的一部分或者分離的發送到伺服器上。
2. URL編碼規則。
每對name/value由&分開,每對來自表單的name/value用=分開。如果用戶沒有輸入值的那個name依舊會出現不過就是沒有值。
URL編碼是在字元ASCII碼的十六進制數的前面加上%。例如\(她的十六進制數表示為5c)的URL編碼就是%5c。
3. 簡單介紹亂碼和http請求
其實做web開發亂碼問題是經常出現的,有了上面編碼的基礎之後下面來看看亂碼。
1) 亂碼問題是web開發過程中經常遇到的問題,主要原因就是URL中使用了非ASCII碼造成伺服器後台程序解析出現亂碼的問題。
2) URL中最容易出現中文的地方就是在QueryString的參數值還有Servletpath中。
3) 簡單用一個圖來說明一下http請求的流程:
第一步:瀏覽器把URL經過編碼送給伺服器;
第二步:伺服器把這些請求解碼處理完畢之後將顯示的內容進行編碼發送給客戶端瀏覽器;
第三步:瀏覽器按照指定的編碼顯示網頁
4) 詳細剖析GET提交如何編碼以及伺服器如何解碼以及亂碼解決方案
對於GET方式,我們知道它的提交是將請求數據附加到URL後面作為參數,這樣依賴亂碼就會很容易出現,因為數據name和value很有可能就是傳遞的為非ASCII碼。
當URL拼接後,瀏覽器對其進行encode,然後發送到伺服器。具體規則見URL編碼規則。
這里詳細說一下encode的過程中容易出現的問題,在這個過程中我們要明白需要URL encode的字元一般都是非ASCII碼字元,所以我們就能知道出現亂碼主要是URL中附加了中文或特殊字元做成的,另一個要知道URL encode到底是以什麼樣的編碼方式對字元進行編碼的,其實這個編碼方式是由瀏覽器決定的,不同的瀏覽器和同一瀏覽器的不同設置影響了URL的編碼,所以為了避免我們不需要的編碼,我們可以通過java代碼或javaspcript代碼統一進行控制。
完成了URL encode之後URL就成了ASCII范圍內的字元了,然後就以iso-8859-1的編碼方式轉換為二進制隨著請求頭一起發送出去。
到了伺服器之後,首先伺服器會先用iso-8859-1進行解碼,伺服器獲取的數據都是ASCII范圍內的請求頭字元,其中請求URL裡面帶有參數數據,如果是中衛或特殊字元,那麼encode後的%XY(編碼規則中的十六進制數)通過request.setCharacterEncoding()是不管用的。這時候我們就能發現出現亂碼的根本原因就是客戶端一般是通過用UTF-8或GBK等對數據進行encode的,到了伺服器卻用iso-8859-1方式decoder顯然不行。
這里的解決方式有兩種,
一種:是通過String類的getBytes方法進行編碼轉換,具體java代碼是:
new String(request.getParameter(「name」).getBytes(「iso-8859-1」),「客戶端編碼方式」)
第二種:在伺服器xml代碼中改配置信息:
<Connector port="8080"protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000"
redirectPort="8443"URIEncoding="客戶端編碼"/>
5) 詳細剖析POST提交如何編碼以及伺服器如何解碼以及亂碼解決方案
對於POST方式,表單中的參數值對是通過request包發送給伺服器,此時瀏覽器會根據網頁的ContentType("text/html; charset=GBK")中指定的編碼進行對表單中的數據進行編碼,然後發給伺服器。
在伺服器端的程序中我們可以通過
Request.setCharacterEncoding()設置編碼,然後通過
request.getParameter獲得正確的數據。
這里出現亂碼可以通過Request.setCharacterEncoding()直接解決。
5、java 使用HttpURLConnection請求伺服器,如果發送請求時沒有問題,但返回結果時網路斷了,如何處理?
.setConnectTimeout() 指的是與請求網址的伺服器建立連接的超時時間。
setReadTimeout() 指的是建立連接後如果指定時間內內伺服器沒有返回數據容的後超時。
503是錯誤碼,能返回就說明伺服器返回了response。超時指的是你指定的時間沒有收到伺服器的response。
不管哪種超時都不有狀態碼返回。因為返回是在response響應中的,而就是在設定的時間內沒有收到響應,才會超時。如果出現超時的話會拋出一個異常。你可以catch超時異常,然後根據需要處理就行了。
6、HTTP請求方法有哪些
http請求方法的話,有很多,比如get、post,這兩個用的是最多的,還有很多比如patch、delete、put等等,如果你要做restful介面的可能需要使用。
7、http請求到a伺服器,可以在請求中添加一些數據並轉發到b伺服器嗎
Web service一般就是用SOAP協議通過HTTP來調用它,其實他就是一個WSDL文檔,客戶都可以閱讀WSDL文檔來用這個Web service。客戶根據WSDL描述文檔,會生成一個SOAP請求消息。Web service都是放在Web伺服器 (如IIS) 後面的,客戶生成的SOAP請求會被嵌入在一個HTTP POST請求中,發送到Web伺服器來。Web伺服器再把這些請求轉發給Web service請求處理器。請求處理器的作用在於,解析收到的SOAP請求,調用Web service,然後再生成相應的SOAP應答。Web伺服器得到SOAP應答後,會再通過HTTP應答的方式把它送回到客戶端。個人以為就把webservice當成是Http這種請求和響應方式就可以處理大部分問題了。 SOAP 使用 HTTP 傳送 XML,盡管HTTP 不是有效率的通訊協議,而且 XML 還需要額外的文件解析(parse),兩者使得交易的速度大大低於其它方案。但是XML 是一個開放、健全、有語義的訊息機制,而 HTTP 是一個廣泛又能避免許多關於防火牆的問題,從而使SOAP得到了廣泛的應用。但是如果效率對你來說很重要,那麼你應該多考慮其它的方式,而不要用 SOAP。為了更好的理解SOAP,HTTP,XML如何工作的,不妨先考慮一下COM/DCOM的運行機制,DCOM處理網路協議的低層次的細節問題,如PROXY/STUB間的通訊,生命周期的管理,對象的標識。在客戶端與伺服器端進行交互的時候,DCOM採用NDR(Network Data Representation)作為數據表示,它是低層次的與平台無關的數據表現形式。
8、如何實現HTTP請求
參數:url:目標地址data:要post的數據比如a=1&b=2publicstringGetPostString(stringurl,stringdata){try{byte[]postBytes=Encoding.GetEncoding("utf-8").GetBytes(data);HttpWebRequestmyRequest=(HttpWebRequest)WebRequest.Create(url);myRequest.Method="POST";myRequest.ContentType="text/html";myRequest.ContentLength=postBytes.Length;myRequest.Proxy=null;StreamnewStream=myRequest.GetRequestStream();newStream.Write(postBytes,0,postBytes.Length);newStream.Close();//=(HttpWebResponse)myRequest.GetResponse();using(StreamReaderreader=newStreamReader(myResponse.GetResponseStream(),Encoding.GetEncoding("utf-8"))){stringcontent=reader.ReadToEnd();returncontent;}}catch(System.Exceptionex){returnex.Message;}}
9、使用Java開發一個HTTP伺服器,能夠處理POST,GET,PUT,DELETE請求。
使用Java開發一個HTTP伺服器,能夠處理POST,GET,PUT,DELETE請求。
1. 監聽埠可以配置;
2. 可以配置的一個工作目錄;
3. GET請求可以獲得相對於該工作目錄的靜態文件的內容,內容格式限定為html,css,js,json,xml,txt,jpg,gif,png,ico;
a) 例如 GET /f/test1.html返回工作目錄下f文件夾下test1.html內容;
b) 在GET請求的的應答中盡可能多的在HTTP頭中返回些能獲得的到的標準的頭信息;
4. POST請求可以在工作目錄中創建請求路徑對應的文件,文件內容為POST請求的內容;
a) 例如 POST /f/test2.html,在工作目錄下f文件夾下創建test2.html文件,並將POST內容作為test2.html的內容。
5. PUT請求可以替換對應路徑的文件,修改的內容為PUT請求的內容。注意與POST不同。
a) 例如 PUT /f/test2.html,在工作目錄下f文件夾替換test2.html文件的內容,並將PUT內容作為test2.html的內容。
6. DELET請求可以刪除對應路徑的文件。
a) 例如 PUT /f/test2.html,在工作目錄下f文件夾刪除test2.html文件。
7. POST,PUT,DELETE成功後返回200,出現找不到文件的情況返回404錯誤,出現讀寫文件錯誤返回500錯誤。
8. 特別的處理~路徑下的GET請求,其包含2個參數,一個是類名,一個是方法名,這些方法都是些無參數並且以字元串為返回值的方法,GET請求應返回這些方法的返回值。
a) 例如 GET /~?class=com.test.Test&method=getTIme,則調用com.test.Test類中String getTIme()方法,將返回值作為GET請求的返回;
b) 若找不到類或方法返回404錯誤;
c) 若出錯返回500錯誤;
9. 特別的處理$路徑下的GET請求,能夠為瀏覽器添加cookie,key為sid,值為UUID的隨機字元串。
注意:不是在tomcat之類servlet容器上開發,而是要開發個類似servlet容器的東西。
10、http請求返回200,對方伺服器一定是收到請求了嗎
200響應碼表示伺服器已經正確的處理了請求,所以返回200表示伺服器一定是收到了請求。如果沒收到請求伺服器是不會返回任何狀態碼的,包括表示錯誤的狀態碼也不會有。