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