java發送http請求


項目中需要使用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

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM