亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot學習之Json數(shù)據(jù)交互的方法

 更新時間:2018年12月14日 10:42:04   作者:stillcoolme  
這篇文章主要介紹了SpringBoot學習之Json數(shù)據(jù)交互的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

JSON知識講解

JSON的定義

JSON(JavaScript Object Notation, JS 對象簡譜) 是一種輕量級的數(shù)據(jù)交換格式。它基于 ECMAScript (歐洲計算機協(xié)會制定的js規(guī)范)的一個子集,采用完全獨立于編程語言的文本格式來存儲和表示數(shù)據(jù)。簡潔和清晰的層次結(jié)構(gòu)使得 JSON 成為理想的數(shù)據(jù)交換語言。 易于人閱讀和編寫,同時也易于機器解析和生成,并有效地提升網(wǎng)絡傳輸效率。

解釋來自于百度百科,說簡單點。JSON就是一串字符串 只不過元素會使用特定的符號標注。

JSON的幾種常見格式

對象

{
"username": "清風一陣吹我心",
"password": "123456"
}

數(shù)組

[
"one",
"two",
"three"
]

對象數(shù)組

{
"student": [
"張三",
"李四",
"王五"
],
"teacher": [
"語文",
"數(shù)學",
"英語"
]
}

數(shù)組對象

[
{
"username": "張三",
"age": 18
},
{
"username": "李四",
"age": 20
}
]

復雜的格式

{
 "msg": "查詢成功",
 "code": 200,
 "data": {
  "provinces": [
   {
    "name": "重慶",
    "cities": [
     {
      "name": "重慶市",
      "district": [
       "江北區(qū)",
       "渝北區(qū)",
       "萬州區(qū)",
       "合川區(qū)"
      ]
     }
    ]
   },
   {
    "name": "北京",
    "cities": [
     {
      "name": "北京市",
      "district": [
       "海淀區(qū)",
       "昌平區(qū)",
       "朝陽區(qū)",
       "豐臺區(qū)"
      ]
     }
    ]
   }
  ]
 }
}

使用JSON的好處

  • 與XML相比,數(shù)據(jù)格式比較簡單, 易于讀寫
  • 格式都是壓縮的, 占用帶寬小
  • 便于服務器端的解析,支持多種語言。包括C,C#,Java,JavaScript, Perl,php,Python,Ruby等。

JSON的知識,就講到這里。

最近在弄監(jiān)控主機項目,對javaweb又再努力學習。實際的項目場景中,前后分離幾乎是所以項目的標配,全棧的時代的逐漸遠去,后端負責業(yè)務邏輯處理,前端負責數(shù)據(jù)展示成了一種固定的開發(fā)模式。像thymeleaf這種東西沒法實現(xiàn)前后端分離模板難學也只有寫java的才用吧,還是用js模板引擎接受json好。

1. Json報文

SpringBoot 默認會使用 Json 作為響應報文格式。首先,我們創(chuàng)建一個 UserController 用于處理前端的 Web 請求。

定義一個簡單的控制器,與通常返回 Url 的 Controller 不一樣的是,login() 使用了 @ResponseBody 注解,它表示此接口響應為純數(shù)據(jù),不帶任何界面展示,可以獲得標準Json。

@Controller
@RequestMapping("/user")
public class UserController {

 @RequestMapping("/login")
 @ResponseBody
 public RespEntity login(@RequestBody ReqUser reqUser) { //使用reqUser模型來接受,而不用User

  User user = new User();
  if(reqUser != null) {
   user.setName(reqUser.getName());
   user.setPassword(reqUser.getPassword());
  }

  return new RespEntity(RespCode.SUCCESS, user); //返回的響應實體具體看下節(jié)
 }
}

對于上面的代碼來說,還可以做進一步的優(yōu)化,由于所有的 Restful 接口都只是返回數(shù)據(jù),所以我們可以直接在類級別上添加 @ResponseBody 注解。而大多數(shù)情況下,@Controller 與 @ResponseBody 又會一起使用,所以我們使用 @RestController 注解來替換掉它們,從而更加簡潔地實現(xiàn)功能。

2. 接口規(guī)范

對于每一家公司來說,都會定義自己的數(shù)據(jù)規(guī)范,一個統(tǒng)一且標準的數(shù)據(jù)規(guī)范對于系統(tǒng)維護來說是非常重要的,也在很在程度上提升了開發(fā)效率。

2.1 響應報文規(guī)范

接口響應至少需要告訴使用方三項信息:狀態(tài)碼、描述、數(shù)據(jù)。其中,數(shù)據(jù)不是每個接口必須的,如果只是一個簡單修改的動作,可能就沒有必須返回數(shù)據(jù)了。下面我們定義一個 RespEntity類來封裝我們的響應報文model:

public class RespEntity {
 private int code;
 private String msg;
 private Object data;

 public RespEntity(RespCode respCode) {
  this.code = respCode.getCode();
  this.msg = respCode.getMsg();
 }

 public RespEntity(RespCode respCode, Object data) {
  this(respCode);
  this.data = data;
 }

 ... 
}

同時,定義一個枚舉類來維護我們的狀態(tài)碼:

public enum RespCode {

 SUCCESS(0, "請求成功"),
 WARN(-1, "網(wǎng)絡異常,請稍后重試");

 private int code;
 private String msg;

 RespCode(int code, String msg) {
  this.msg = msg;
 }

 public int getCode() {
  return code;
 }
 public String getMsg() {
  return msg;
 }
}

這樣,我們的響應數(shù)據(jù)規(guī)范已基本建立。

2.2 請求數(shù)據(jù)規(guī)范

響應報文格式我們已經(jīng)定義好了,那么請求數(shù)據(jù)我們?nèi)绾谓邮漳兀?br />

一般來說,請求與響應會使用相同的報文形式。如果響應為Json,那么請求也建議使用Json。

為登錄請求添加輸入?yún)?shù),首先,需要我們定義好用戶實體User類,直接在映射方法login() 使用該實體進行參數(shù)接收,并將接收到的參數(shù)直接返回,1.節(jié)代碼已實現(xiàn)。

調(diào)出Postman,填寫正確的Url,選擇POST方式發(fā)送請求,選擇Body,將 Content-Type 設置成 application/json,填入 Json 格式的請求數(shù)據(jù),點擊 Send 即可得到如下結(jié)果。


數(shù)據(jù)接收非常成功,但在上面的響應報文中,存在著了一個非常嚴重的問題,那就是用戶的密碼也隨同用戶信息一起返回給了客戶端,顯然這并不是一種正確的做法。

我們需要對其進行一次過濾,由于 SpringBoot 默認使用 Jackson 作為 Json 序列化工具,如果想要過濾掉響應中的某些字段,只需在過濾字段對應的 get 方法上加上 @JsonIgnore 注解即可。

但這樣又會引發(fā)另外一個問題,那就是請求中的字段也被過濾掉了,對于這種問題,可以采用抽離請求參數(shù)模型的方式進行處理,即自定義一套參數(shù)接收的 Model,比如,接收用戶登錄的會使用 ReqUser 來進行參數(shù)接收,這樣使得請求參數(shù)模型與數(shù)據(jù)庫映射實體完全分離,在一定程度上提升了系統(tǒng)的安全性。替換成 Model 對象后(1.節(jié)的代碼已經(jīng)替換好了),我們就可以在數(shù)據(jù)庫映射實體 User 上增加 @JsonIgnore 注解忽略該字段的序列化,而不影響請求參數(shù)的輸入。

3. 參數(shù)校驗

出于系統(tǒng)健壯性的考慮,我們需要對所有的參數(shù)進行必要性校驗,如:登錄請求時,如果沒有用戶名,程序應該立即駁回該請求。上面請求參數(shù)模型(Model)的抽象也使得我們對數(shù)據(jù)校驗更加方便,當然主要還是依賴于 SpringBoot 的 Validate 功能的強大支持。

3.1. 簡單參數(shù)校驗

對于登錄接口來說,用戶名與密碼都是必輸?shù)?,那么我們現(xiàn)在為其添加上對應的參數(shù)校驗,無需 if-else 判斷,簡單的幾個注解就可以幫助我們完成所有的工作。

public class LoginController {

 @RequestMapping("/login")
 @ResponseBody
 public RespEntity login(@RequestBody @Valid ReqUser reqUser) {

 }
}
----
public class ReqUser {
 @NotBlank(message = "用戶名不能為空")
 public String getName() {
  return name;
 }

 @NotBlank(message = "密碼不能為空")
 public String getPassword() {
  return password;
 }
 ...
}

我們?yōu)檎埱髤?shù)的 Model 對象ReqUser 加上了 @Valid 注解,并在 Model 類中對需要校驗字段的 get 方法上添加相應的校驗注解。效果如下:

3.2. 復雜參數(shù)校驗

正則表達式校驗

如果用戶的登錄名為手機號,那么就需要對登錄名的格式做進一步的校驗,下面使用正則表達式來校驗手機號的合法性。

@NotBlank(message = "用戶名不能為空")
@Pattern(
  regexp = "1(([38]\\d)|(5[^4&&\\d])|(4[579])|(7[0135678]))\\d{8}",
  message = "手機號格式不合法"
)
public String getUsername() {
 return username;
}

自定義校驗注解

在系統(tǒng)使用過程中,有很多地方需要對手機號的格式進行校驗,如:注冊、驗證碼發(fā)送等。

但校驗手機號的正則表達式又過于復雜,如果多處編寫,一旦運營商增加某個號段,對程序的維護人員來說就是一個噩耗。這時,可以使用自定義校驗注解來代替這些常用的校驗。

手機號校驗注解 Phone:

@Constraint(validatedBy = PhoneValidator.class)
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Phone {

 String message() default "手機號格式不合法";

 Class<?>[] groups() default {};

 Class<? extends Payload>[] payload() default {};

}

手機號校驗實現(xiàn)類 PhoneValidator:

public class PhoneValidator implements ConstraintValidator<Phone, String> {

 private Pattern pattern = Pattern.compile("1(([38]\\d)|(5[^4&&\\d])|(4[579])|(7[0135678]))\\d{8}");

 @Override
 public void initialize(Phone phone) {
 }

 @Override
 public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
  return pattern.matcher(value).matches();
 }
}

Model 上的使用:

@Phone
public String getUsername() {
 return username;
}

這樣的話,如果因為某些不可抗拒因素導致校驗規(guī)則的變動,只需要修改一處理即可,維護成本大大降低。

4. Xml 報文

大多數(shù)情況下,使用 Json 就可以滿足我們的需求了,但仍然存在某些特定的場景需要使用到 XML 形式的報文,如:微信公眾號開發(fā)。不過不用擔心,切換成 XML 報文也只需要做輕微的改動,添加相關(guān)依賴如下:"com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.8.8"

然后就可以開始進行測試了,此處借助一個模擬 HTTP 請求工具(Postman)來協(xié)助我們測試該接口:


在上面的測試范例里,我們指定了 Accept 為 text/xml,這樣 SpringBoot 就會返回 XML 形式的數(shù)據(jù)。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中將接口返回的字節(jié)串轉(zhuǎn)為文件詳解

    Java中將接口返回的字節(jié)串轉(zhuǎn)為文件詳解

    這篇文章主要給大家介紹了關(guān)于Java中將接口返回的字節(jié)串轉(zhuǎn)為文件的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2021-11-11
  • JVM調(diào)優(yōu)實戰(zhàn)

    JVM調(diào)優(yōu)實戰(zhàn)

    本文主要介紹了JVM調(diào)優(yōu)實戰(zhàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • Java實現(xiàn)堆排序(Heapsort)實例代碼

    Java實現(xiàn)堆排序(Heapsort)實例代碼

    這篇文章主要介紹了Java實現(xiàn)堆排序(Heapsort)實例代碼,有需要的朋友可以參考一下
    2013-12-12
  • Java使用RedisTemplate操作Redis遇到的坑

    Java使用RedisTemplate操作Redis遇到的坑

    這篇文章主要介紹了Java使用RedisTemplate操作Redis遇到的坑,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • SpringBoot+layui實現(xiàn)文件上傳功能

    SpringBoot+layui實現(xiàn)文件上傳功能

    Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發(fā)過程。這篇文章主要介紹了SpringBoot+layui實現(xiàn)文件上傳,需要的朋友可以參考下
    2018-09-09
  • 詳解如何在Spring Boot中實現(xiàn)容錯機制

    詳解如何在Spring Boot中實現(xiàn)容錯機制

    容錯機制是構(gòu)建健壯和可靠的應用程序的重要組成部分,它可以幫助應用程序在面對異?;蚬收蠒r保持穩(wěn)定運行,Spring Boot提供了多種機制來實現(xiàn)容錯,包括異常處理、斷路器、重試和降級等,本文將介紹如何在Spring Boot中實現(xiàn)這些容錯機制,需要的朋友可以參考下
    2023-10-10
  • Spring?Feign超時設置深入了解

    Spring?Feign超時設置深入了解

    Spring?Cloud中Feign客戶端是默認開啟支持Ribbon的,最重要的兩個超時就是連接超時ConnectTimeout和讀超時ReadTimeout,在默認情況下,也就是沒有任何配置下,F(xiàn)eign的超時時間會被Ribbon覆蓋,兩個超時時間都是1秒
    2023-03-03
  • Java在長字符串中查找短字符串的實現(xiàn)多種方法

    Java在長字符串中查找短字符串的實現(xiàn)多種方法

    這篇文章主要介紹了Java在長字符串中查找短字符串的實現(xiàn)多種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • springboot斷點上傳、續(xù)傳、秒傳實現(xiàn)方式

    springboot斷點上傳、續(xù)傳、秒傳實現(xiàn)方式

    這篇文章主要介紹了springboot斷點上傳、續(xù)傳、秒傳實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Linux系統(tǒng)下安裝和卸載JDK8的方式

    Linux系統(tǒng)下安裝和卸載JDK8的方式

    這篇文章主要介紹了Linux安裝和卸載JDK8,第一種是使用yum命令一鍵安裝,默認安裝目錄在/usr/lib/jvm第二種是手動安裝,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09

最新評論