項目中需要使用java發送restful請求,主要包括post和get。
- HTTP和REST的關系
HTTP是超文本傳輸協議,是應用層的協議,一般使用在TCP協議之上,具有請求行(返回:狀態行)、報文頭和報文正文組成,有以下幾個特點:1. 支持客戶/服務器模式 2.簡單訪問,只需要請求方式和路徑。3. 靈活允許任何格式的對象 4. 無連接 5. 無狀態。
REST是表征狀態轉移,是一種支持HTTP協議的框架約束條件和原則,滿足REST約束條件和原則的設計和實現方式就是RESTful。RREST有以下幾個特點:1. 所有的資源都有ID標識。 2. 所有的資源都有互聯性 3. 使用標准的方法 4.多種表現形式 5. 無狀態
一個Http請求包括三個重要的部分:
Method-URI-Protocol/Version
Request headers
Entity body
下面是一個Http請求的例子:
POST /servlet/default.jsp HTTP/1.1
Accept: text/plain; text/html
Accept-Language: en-gb
Connection: Keep-Alive
Host: localhost
Referer: http://localhost/ch8/SendDetails.htm
User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)
Content-Length: 33
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
LastName=Franks&FirstName=Michael
HTTP響應和請求非常相似,同樣包括三個部分:
Protocol-Status code-Description
Response headers
Entity body
下面是一個具體的例子:
HTTP/1.1 200 OK
Server: Microsoft-IIS/4.0
Date: Mon, 3 Jan 1998 13:13:33 GMT
Content-Type: text/html
Last-Modified: Mon, 11 Jan 1998 13:23:42 GMT
Content-Length: 112
something in html style......................
- REST和RESTful的區別?
REST(Representational State Transfer)是表征狀態轉移,是一種基於HTTP協議的框架條件約束和原則,而RESTful是基於REST設計和實現的框架。
- get和post的區別
http的訪問方式有主要有GET,POST,PUT,DELETE四種,它們分別對應於查、改、增、刪。GET一般用於獲取/查詢資源信息,而POST一般用於更新資源信息。get請求一般是安全和冪等的。安全是因為get是查詢操作,不會修改數據,所以安全;冪等是對同樣的url多次請求,返回同樣的結果。但是目前許多開發人員在使用這四個操作的時候,並沒有嚴格按照各自的去操作。
1)get發送方式是將實體與url拼接,放在報文頭部的,而post是放在報文正文的部分。
2)get發送的數據量小,一般小於1024K,post發送的大,理論上無限制。[url其實也沒有對長度做出限制,get的限制是因為瀏覽器和服務器對url做出了限制,post實際時根據服務器的處理程序的處理能力限制,一般存在80K/100K的大小限制]
3)post比get更加的安全。這里的安全和上面的不一樣,這里的安全是因為get會將數據顯示在url中,會暴露數據信息,post就不會。
- 實現方式
<-----使用代理的方式------->
1.get
1)實例化一個url,使用openConnection的方法打開url鏈接。 //將內容與url拼接,使用url的openConnection返回一個UrlConnection
2)設置訪問的屬性值(報文頭)。
3)使用實例的方法getInputStream,可以獲得返回的數據流,定義BufferedReader輸入流來讀取URL的響應就可以獲得返回的數據
2.post
1)實例化一個URL類,然后使用openConnection的方法打開url鏈接。
2)設置訪問的屬性值(報文頭,注意打開OutPut)。
3)將conn的outputstream封裝到一個printwriter類的out實例中,然后使用out實例的flush()方法輸出流的緩沖。//將內容放到報文正文中
4)使用實例的方法getInputStream,可以獲得返回的數據流,定義BufferedReader輸入流來讀取URL的響應就可以獲得返回的數據。
import java.io.*; import java.net.*; import java.util.*; public class HttpTest{ public static void main(String [] args){ HttpTest ht = new HttpTest(); String url = "http://10.104.5.241:8080/IoTApp/URTFMS/road/nodes/11010802020000000001"; String param=""; String head1 = "Content-Type"; String head2 = "application/json"; //ht.httpConn(url,param,head1,head2); ht.doPost(url,param,head1,head2); } //get方式:參數放置在url上 public void httpConn(String url1, String param , String head1, String head2){ String urlNameString = url1 + "?" + param; try{ URL url = new URL(url1); //打開url的連接 URLConnection conn = url.openConnection(); //設置連接屬性 conn.setConnectTimeout(6*1000); //獲得輸入流,並封裝為字符 BufferedReader in = new BufferedReader( new InputStreamReader(conn.getInputStream()));//獲得網絡返回的輸入流 String line; String result=null; while ((line = in.readLine()) != null) { result += "/n" + line; } result=new String(result.getBytes(),"UTF-8"); System.out.println("result"+result); }catch(Exception e){ e.printStackTrace(); } finally{ } } //post方式,以輸出流的形式發送 public void doPost(String url1, String param , String head1, String head2){ try{ URL url = new URL(url1); //打開url的連接 URLConnection conn = url.openConnection(); //設置url的連接屬性 conn.setConnectTimeout(6*1000); conn.setDoOutput(true); //設置OutPut是Ture //獲得輸出流,並將其封裝為字符流 PrintWriter out = new PrintWriter(conn.getOutputStream()); //按字節的方式打印輸出字符,並寫入數組的某一部分 out.print(param); //刷新輸出流的緩沖 out.flush(); //獲得網絡返回的輸入流,並封裝為輸入流 BufferedReader in = new BufferedReader( new InputStreamReader(conn.getInputStream())); String line; String result=null; while ((line = in.readLine()) != null) { result += "/n" + line; } result=new String(result.getBytes(),"UTF-8"); System.out.println("result"+result); }catch(Exception e){ e.printStackTrace(); } finally{ } } }
備注:
URL realUrl = new URL(url_s); Class<?> clazz=realUrl.openConnection().getClass(); System.out.println(clazz); //這個類不是java.net包下的UrlConnection,是sun公司后期包裝的UrlConnection//sun.net.www.protocol.http.HttpURLConnection Class<?> superClazz=clazz.getSuperclass(); System.out.println(superClazz); //class java.net.HttpURLConnection