在文章開始,先來回憶一下GET、POST這兩種請求方式的區別。
?
Http定義了與服務器交互的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符,我們可以這樣認為:一個URL地址,它用于描述一個網絡上的資源,而HTTP中的GET,POST,PUT,DELETE就對應著對這個資源的查,改,增,刪4個操作。到這里,大家應該有個大概的了解了,GET一般用于獲取/查詢資源信息,而POST一般用于更新資源信息。
?
0、GET請求,請求的數據會附加在URL之后,以?分割URL和傳輸數據,多個參數用&連接。URL的編碼格式采用的是ASCII編碼,而不是uniclde,即是說所有的非ASCII字符都要編碼之后再傳輸。
POST請求:POST請求會把請求的數據放置在HTTP請求包的包體中。上面的item=bandsaw就是實際的傳輸數據。
因此,GET請求的數據會暴露在地址欄中,而POST請求則不會。
1、傳輸數據的大小
在HTTP規范中,沒有對URL的長度和傳輸的數據大小進行限制。但是在實際開發過程中,對于GET,特定的瀏覽器和服務器對URL的長度有限制。因此,在使用GET請求時,傳輸數據會受到URL長度的限制。
對于POST,由于不是URL傳值,理論上是不會受限制的,但是實際上各個服務器會規定對POST提交數據大小進行限制,Apache、IIS都有各自的配置。
2、安全性
POST的安全性比GET的高。這里的安全是指真正的安全,而不同于上面GET提到的安全方法中的安全,上面提到的安全僅僅是不修改服務器的數據。比如,在進行登錄操作,通過GET請求,用戶名和密碼都會暴露再URL上,因為登錄頁面有可能被瀏覽器緩存以及其他人查看瀏覽器的歷史記錄的原因,此時的用戶名和密碼就很容易被他人拿到了。除此之外,GET請求提交的數據還可能會造成Cross-site request frogery攻擊
3、HTTP中的GET,POST,SOAP協議都是在HTTP上運行的
以上內容摘自?哪?如有雷同,不關我事。
以下內容是我在開發中對遇到的問題做的總結,能力一般,水平有限,如有錯誤,敬請指出。
0. 發出POST請求,獲取某接口中的數據。
需求簡述:?從指定的接口中獲取到數據并存儲,POST請求頭的header中需要加接口發布方提供的串碼,否則POST請求會被攔截,導致獲取不到數據。
核心代碼如下:一般在service層做處理
**使用IDEA,SpringBoot微服務架構,MongoDB數據庫。**
public List getDataFromURL(){
String result = "";//用來接收接口中的數據。
String url = "獲取數據的接口URL寫在這里";
/*
*此處引入了commons-httpclient的jar包,jar包依賴如下:
commons-httpclient
commons-httpclient
3.1
*/
HttpClient httpClient = new HttpClient();
PostMethod postMethod = new PostMethod(url);
try {
//設置header的名稱和值。
postMethod.setRequestHeader("headerKey","headerValue");
int statusCode = 0;//設置請求結果的狀態值,一般為200、404、500
try {
statusCode = httpClient.executeMethod(postMethod);
}catch (Exception e ){
e.printStackTrace();
}
if(statusCode == HttpStatus.SC_OK){
try {
result = postMethod.getResponseBodyAsString();
}catch (Exception e){
e.printStackTrace();
}
}else{
System.out.println("請求有誤,錯誤代碼:"+statusCode);
}
}catch (Exception e){
System.out.println(e.getMessage());
}finally {
//關閉HTTP連接,這兩行代碼一定要有。
postMethod.releaseConnection();
httpClient.getHttpConnectionManager().closeIdleConnections(0);
}
JSONObject jsonObject = new JSONObject(result);
JSONArray jsonArray = new JSONArray();
try {
//我需要的是接口中的“data”值,具體get什么看自己需求。
jsonArray = jsonObject.get("data");
}catch (Exception e){
System.out.println("獲取不到data,檢查串碼是否過期");
}
List list = new ArrayList<>();
for (int i = 0; i < jsonArray.length();i++){
Document document = new Document();
//這個截字符串的方法不錯。記住傳參一般都是“包頭不包尾”
String time = ((JSONObject)jsonArray.get(i)).getString("time").replace("T"," ").substring(0,19);
//獲取JSON數組中的數據,按需求數據格式轉換入庫數據的格式。
//這里就寫上你對接口中數據的處理吧,想要什么get什么,之后在return它。
}
return list;
}
1. 發出POST請求,將數據發送至某接口
需求簡述?: 某模塊發布出一個接口,規定了傳數據的格式,我需要把數據庫中的數據查出來,組合成為對方需求的格式并發出。
核心代碼如下:一般在service層做處理,查詢數據的過程不展示
**IDEA、SpringBoot、MongoDB**
//如果項目中多次使用到發數據至某接口的方法,可將此方法作為工具類,設置合理的參數列表即可
public class SendDataToURL {
//參數列表:url--發送數據的目標地址。param--發送的內容,格式依據自身需求
public static Boolean sendPost(String url, String param){
OutputStreamWriter out = null;
BufferedReader in = null;
String result = "";
try {
URL realUrl = new URL(url);
HttpURLConnection conn = null;
conn = (HttpURLConnection) realUrl.openConnection();
// 發送POST請求必須設置如下兩行
conn.setDoOutput(true);
conn.setDoInput(true);
// 設置請求方式為POST方法
conn.setRequestMethod("POST");
// 設置通用的請求屬性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
//此處可以設置請求參數,若接口的header中有串碼可以在此設置。
conn.setRequestProperty("headerKey", "headerValue");
conn.connect();
// 獲取URLConnection對象對應的輸出流
out = new OutputStreamWriter(conn.getOutputStream(),"UTF-8");
// 發送請求參數,發送的數據在此處發送。
out.write(param);
// flush輸出流的緩沖
out.flush();
// 定義BufferedReader輸入流來讀取URL的響應
in = new BufferedReader(
new InputStreamReader(conn.getInputStream(), "UTF-8"));
String line ;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("發送 POST 請求出現異常!"+e);
e.printStackTrace();
}
//使用finally塊來關閉輸出流、輸入流
finally{
try{
if(out!=null){
out.close();
}
if(in!=null){
in.close();
}
}
catch(IOException ex){
ex.printStackTrace();
}
}
//result為請求結束后返回的response,可以讓接口發布方設置數據是否發送成功的標識,具體怎么返回還需要你們自己協商。
if(result.contains("SUCCESS")){
return true;
}else{
return false;
}
}
2.由頁面發起GET請求,之后POST數據至指定接口,接口方收到數據后返回響應信息,由service層做處理,再由controller返回響應信息至GET請求發起方。
需求簡述?: 頁面中的button發起了GET請求,controller中調用相關的處理方法,將數據以POST的形式發送至某接口中,接口發布方收到數據之后,返回響應信息(其中包括對接收狀態的標識),由返回信息判斷是否成功接收數據,之后再返回響應信息至GET請求發起方,展示是否成功發送數據。
controller層發布接口,供頁面發起GET請求用,返回值為String(也可為其他,視自身情況定)。
**IDEA、SpringBoot、MongoDB、RESTful**
@RestController//此注解包含了@ResponseBody和@Controller注解。
@RequestMapping(value = "/sendDataToURL")
public class TestController {
@RequestMapping(value = "/test" , method = RequestMethod.GET)
//使用@RequestParam注解獲取GET請求發起方request中的信息。
//如:http://localhost:8080/sendDataToURL/test?id=test
public String testSendData(@RequestParam("id") String id){
Boolean flag = 發送數據的方法,返回值可定義為boolean,可做響應信息的標識
logger.info(flag ? "成功" : "失敗";//打上日志,方便查看
return flag ? "true" : "false";
}
}
**在service層做對數據發送的處理,方法參照本文第1部分**
本文中還涉及到對JSON對象、JSON數組、Document對象、List集合等問題的處理,都屬于基本操作,注意字段取值時的拼寫問題即可,不做詳述。
本文系投稿作品,點擊閱讀原文即可閱讀原作者的博客,歡迎大家投稿!
始發于微信公眾號: Java知音