1. 程式人生 > >JAVA——建立HTTP通訊(GET/POST方式)

JAVA——建立HTTP通訊(GET/POST方式)

建立HTTP通訊(GET/POST方式)


1.要求

此程式可以建立HTTP通訊,以GET方式和POST方式向WEB伺服器提交資訊,並接收WEB伺服器返回的響應。

2.GET和POST請求

GET請求:
  • GET查詢字串(名稱/值對)是在 GET 請求的 URL 中傳送的:
  • GET 請求可被快取
  • GET 請求保留在瀏覽器歷史記錄中
  • GET 請求可被收藏為書籤
  • GET 請求不應在處理敏感資料時使用
  • GET 請求有長度限制
  • GET 請求只應當用於取回資料
POST請求
  • POST查詢字串(名稱/值對)是在 POST 請求的 HTTP 訊息主體中傳送的
  • POST 請求不會被快取
  • POST 請求不會保留在瀏覽器歷史記錄中
  • POST 不能被收藏為書籤
  • POST 請求對資料長度沒有要求

3.實現過程

  • 使用GET方法進行通訊,主要實在建立URL連結後通過URLconnection例項呼叫getInputStream方法得到資料流,然後進行輸出。
  • 使用POST方法進行通訊,與GET不用的是需要把請求放在Http正文中。 具體的步驟: 首先,建立URL。 其次開啟連結,設定允許讀取和上傳的許可權。 然後,設定讀取方式為POST,建立輸出流,將向伺服器傳輸的資料一次性寫出,再獲取輸入流,從輸入流中讀取資料。

4.測試API地址

本文所使用的測試API介面地址如下:

https://cre.dp.sina.cn/api/v3/get?cateid=I&cre=tianyi&mod=wedu&merge=3&statics=1&length=20&tm=1489716199&ad={%22rotate_count%22:1144,%22page_url%22:%22https%3A%2F%2Fedu.sina.cn%2F%22,%22channel%22:%22130270%22,%22platform%22:%22wap%22,%22timestamp%22:1515924429346,%22net%22:null}&action=1&up=2&down=0&length=12&_=1515924436197&callback=Zepto1515924429314 

(若想更換為其他用於測試的API地址可點選此處)

5.程式碼

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class rw28 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		 new GetRun().start();//get請求
	     new PostRun().start();//post請求
	}
}
	class GetRun extends Thread{
	    public void run() {
	        try {
	            //doctype=xml/json/jsonp
	            URL url = new URL("http://www.kuaidi100.com/query?type=yuantong&postid=11111111111");
	            URLConnection connection = url.openConnection();
	            InputStream in = connection.getInputStream();
	            InputStreamReader isr = new InputStreamReader(in,"utf-8");
	            BufferedReader br = new BufferedReader(isr);
	            String line;
	            StringBuilder sb = new StringBuilder();
	            while((line = br.readLine()) != null)
	            {
	                sb.append(line);
	            }
	            br.close();
	            isr.close();
	            in.close();
	            System.out.println("使用GET方式得:\n"+sb.toString());
	        } catch (MalformedURLException e) {
	            e.printStackTrace();
	        } catch (IOException e) {
	            e.printStackTrace();
	        }
	    }
	}


	class PostRun extends Thread{
	    @Override
	    public void run() {
	        try {
	            URL url = new URL("http://www.kuaidi100.com/query");
	            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
	            connection.addRequestProperty("encoding", "UTF-8");//新增請求屬性
	            connection.setDoInput(true);//允許輸入
	            connection.setDoOutput(true);//允許輸出
	            connection.setRequestMethod("POST");//POST請求要在獲取輸入輸出流之前設定否則報錯
	            //輸出
	            OutputStream os = connection.getOutputStream();
	            OutputStreamWriter osw = new OutputStreamWriter(os);
	            BufferedWriter bw = new BufferedWriter(osw);
	            bw.write("type=yuantong&postid=11111111111");
	            bw.flush();
	
	            //輸入
	            InputStream in = connection.getInputStream();
	            InputStreamReader isr = new InputStreamReader(in,"UTF-8");
	            BufferedReader br = new BufferedReader(isr);
	
	            String line;
	            StringBuilder sb = new StringBuilder();
	            while((line = br.readLine()) != null)
	            {
	                sb.append(line);
	            }
	            bw.close();
	            osw.close();
	            os.close();
	            br.close();
	            isr.close();
	            in.close();
	
	            System.out.println("使用POST方式得:\n"+sb.toString());
	
	        } catch (MalformedURLException e) {
	            e.printStackTrace();
	        } catch (IOException e) {
	            e.printStackTrace();
	        }
	
	    }
 }

6.結果

編譯結果如下圖所示:
在這裡插入圖片描述
執行結果如下圖所示:
GET方法:
在這裡插入圖片描述
POST方法:
在這裡插入圖片描述

7.GET/POST的區別

  • get請求一般會把引數附著在請求的後面,並用?隔開。這樣的話引數容易暴露,類似密碼這樣的引數等。
    特點:傳送的資料是有限制的,一般限制在1kb以下;
    例如:
    Request URL:
http://localhost:8080/JavaWeb_001/actionServlet?user=zhangqin&password=zhangqin&submit=submit
  • post請求的方式傳送的表單欄位元素以及其資料作為http實體內容傳送給web伺服器,傳送的資料量比get請求大得多。
    如下所示:
Request URL:http://localhost:8080/JavaWeb_001/actionServlet
Request Method:POST
Status Code:404 Not Found
Remote Address:[::1]:8080
Referrer Policy:no-referrer-when-downgrade

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, br
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Content-Length:45
Content-Type:application/x-www-form-urlencoded
Host:localhost:8080
Origin:http://localhost:8080
Referer:http://localhost:8080/JavaWeb_001/login.html
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3004.3 Safari/537.36


user:zhangqin
password:zhangqin
submit:submit     ----請求中傳遞的資料引數