Berbagi teknologi

Pengembangan backend web--meminta respons

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Daftar isi

Kata pengantar

bertanya

parameter sederhana

metode asli

Cara musim semi

Pemrosesan permintaan posting kacau

Parameter entitas

Parameter entitas sederhana

Parameter entitas yang kompleks

Sunting

parameter pengumpulan array

Parameter susunan

Sunting

Parameter koleksi

parameter tanggal

Sunting

Parameter JSON

Sunting

Lewati data json

susunan json

objek json (POJO)

koleksi json (POJO)

Melihat

parameter jalur

Minta jalur pemetaan

@PemetaanPermintaan

Parameter permintaan

tanggapan

@TubuhRespon

Hasil respons terpadu


Kata pengantar

Permintaan: Dapatkan data permintaan

Respons: Mengatur data respons

Arsitektur BS Browser/Server, mode arsitektur browser/server, klien hanya memerlukan browser, dan logika aplikasi serta data disimpan di server (Mudah dirawat, pengalaman rata-rata

Arsitektur CS Klien/Server, mode arsitektur klien/server (Pengembangan dan pemeliharaan memang merepotkan, tapi pengalamannya bagus

bertanya

parameter sederhana

metode asli

Dapatkan secara manual melalui HttpServletRequest

  1. import jakarta.servlet.http.HttpServletRequest;
  2. import org.springframework.web.bind.annotation.RequestMapping;
  3. import org.springframework.web.bind.annotation.RestController;
  4. @RestController
  5. public class RequestController {
  6. @RequestMapping("/SimpleParam")
  7. public String SimpleParam(HttpServletRequest request){ //返回的字符串类型是String
  8. String name=request.getParameter("name");
  9. String age=request.getParameter("age"); //通过这个方法得到字符串类型的
  10. int age1=Integer.parseInt(age); //将年龄进行类型转换
  11. System.out.println(name+":"+age1); //设置返回格式
  12. return "OK";
  13. }
  14. }

Cara musim semi

Parameter sederhana:Nama parameter sama dengan nama variabel parameter formal, mendefinisikan parameter formal berarti menerima parameter

  1. @RestController
  2. public class RequestController {
  3. @RequestMapping("/SimpleParam")
  4. public String SimpleParam(String name,Integer age){
  5. System.out.println(name+":"+age);
  6. return "OK";
  7. }
  8. }

Perhatikan bahwa semua URL tukang pos ada di sinihttp://localhost:8080/SimpleParam?nama=tom&usia=10

Kedua hal di atas adalah permintaan get. Jika itu permintaan posting, Anda hanya perlu memasukkan URL di tukang pos.http://localhost:8080/SimpleParam

Pemrosesan permintaan posting kacau

Jika ada karakter Cina di postingan, karakter kacau akan muncul di latar belakang, jadi atur filter di konfigurasi.

Tambahkan filter ke wadah web dan tentukan kumpulan karakter. Filter karakter khusus disediakan dalam paket Spring-web

  1. public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
  2.    protected Class<?>[] getRootConfigClasses() {
  3.        return new Class[0];
  4.   }
  5.    protected Class<?>[] getServletConfigClasses() {
  6.        return new Class[]{SpringMvcConfig.class};
  7.   }
  8.    protected String[] getServletMappings() {
  9.        return new String[]{"/"};
  10.   }
  11.    //乱码处理
  12.    @Override
  13.    protected Filter[] getServletFilters() {
  14.        CharacterEncodingFilter filter = new CharacterEncodingFilter();
  15.        filter.setEncoding("UTF-8");
  16.        return new Filter[]{filter};//如果有多个过滤器,在这里用,隔开
  17.   }
  18. }

Perhatikan bahwa proses ini untuk posting. Jika get diteruskan dalam bahasa Mandarin, karakter yang kacau akan tetap muncul.

Jika nama parameter metode tidak cocok dengan nama parameter permintaan, Anda dapat menggunakan @RequestParam untuk menyelesaikan pemetaan.

  1. @RestController
  2. public class RequestController {
  3. @RequestMapping("/SimpleParam")
  4. public String SimpleParam(@RequestParam(name="name") String username, Integer age){ //引号中写的是请求参数名
  5. System.out.println(username+":"+age);
  6. return "OK";
  7. }
  8. }

Atribut yang diperlukan di @PequestParam defaultnya adalah true, yang berarti bahwa parameter permintaan harus diteruskan. Jika tidak diteruskan, kesalahan akan dilaporkan. Jika parameternya opsional (yaitu, dapat diteruskan atau tidak), maka atribut yang diperlukan dapat disetel ke false (Dengan cara ini, tidak ada kesalahan yang akan dilaporkan jika Anda meneruskannya atau tidak)

Parameter entitas

Parameter entitas sederhana

Nama parameter permintaan sama dengan nama atribut parameter formal, cukup tentukan Pojo untuk menerimanya.

  1. @RestController
  2. public class SimplePojo {
  3. @RequestMapping("/SimpleParam1")
  4. public String SimplePojo(user user) {
  5. System.out.println(user);
  6. return "yes";
  7. }
  8. }
  1. public class user {
  2. private String name;
  3. private Integer age;
  4. //加getter和setter方法toString
  5. }

Urlnya di sini adalahhttp://localhost:8080/SimpleParam1?nama=cat&usia=29

Parameter entitas yang kompleks

Nama parameter permintaan sama dengan nama atribut parameter formal., Anda dapat menerima parameter atribut pojo bersarang sesuai dengan hubungan hierarki objek.

  1. public class user {
  2. private String name;
  3. private Integer age;
  4. private Address address;
  5. //加getter和setter和toString
  6. }
  1. public class Address {
  2. private String province;
  3. private String city;
  4. //加getter和setter还有toString
  5. }
  1. @RestController
  2. public class SimplePojo {
  3. @RequestMapping("/ComplexParam1")
  4. public String ComplexParam(user user) {
  5. System.out.println(user);
  6. return "yes";
  7. }
  8. }

parameter pengumpulan array

Parameter susunan

Nama parameter permintaan sama dengan nama grup parameter formal dan terdapat beberapa permintaan., tentukan parameter formal tipe array untuk menerima parameter

  1. @RestController
  2. public class SimplePojo {
  3. @RequestMapping("/arrayParam")
  4. public String ArrayParam(String[] hobby) {//在这里建立一个数组,然后后面的名称和传入参数相同
  5. System.out.println(Arrays.toString(hobby));
  6. return "yes";
  7. }
  8. }

Parameter koleksi

Nama parameter permintaan sama dengan nama kumpulan parameter formal dan terdapat beberapa parameter permintaan.@PermintaanParamHubungan parameter yang mengikat

  1. @RestController
  2. public class SimplePojo {
  3. @RequestMapping("/listParam")
  4. public String ArrayParam(@RequestParam List<String> hobby) {
  5. System.out.println(hobby);
  6. return "yes";
  7. }
  8. }

parameter tanggal

Gunakan anotasi @DateTimeFormat untuk menyelesaikan konversi format parameter tanggal

  1. @RestController
  2. public class SimplePojo {
  3. @RequestMapping("/dateParam")
  4. public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")LocalDateTime updateTime) {
  5. System.out.println(updateTime);
  6. return "yes";
  7. }
  8. }

  1. //日期参数    
  2. //使用@DateTimeFormat注解设置日期类型数据格式,默认格式yyyy/MM/dd   @RequestMapping("/dataParam")    
  3. @ResponseBody    
  4. public String dataParam(Date date,@DateTimeFormat(pattern="yyyy-MM-dd") Date date1, @DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date2){        
  5. System.out.println("参数传递 date ==> "+date);        
  6. System.out.println("参数传递 date1(yyyy-MM-dd) ==> "+date1);        
  7. System.out.println("参数传递 date2(yyyy/MM/dd HH:mm:ss) ==> "+date2);        
  8. return "{'module':'data param'}";   }
  9. }
  10. //@DateTimeFormat是形参注解,用在SpringMVC控制器方法形参前面,用于设定日期时间型数据格式//属性:pattern:日期时间格式字符串

Dapatkan tes:

http://localhost:8080/springmvc_04_request_param/dataParam?tanggal=2088/08/08&date1=2088-08-18&date2=2088/08/28 8:08:08

Parameter JSON

Nama kunci parameter json sama dengan nama atribut objek parameter formal. Anda dapat menerima parameter dengan menentukan parameter formal tipe Pojo.

  1. @RestController
  2. public class SimplePojo {
  3. @RequestMapping("/jsonParam")
  4. public String jsonParam(@RequestBody user user) {
  5. System.out.println(user);
  6. return "yes";
  7. }
  8. }
  9. //user这和前面的复杂实体参数一样

Enkapsulasi json ke dalam kelas entitas pengguna melalui @requestbody

Lewati data json

Impor koordinat terlebih dahulu

  1. <dependency>
  2.  <groupId>com.fasterxml.jackson.core</groupId>
  3.  <artifactId>jackson-databind</artifactId>
  4.  <version>2.9.0</version>
  5. </dependency>

Aktifkan dukungan untuk konversi otomatis data Json

  1. @Configuration
  2. @ComponentScan("com.itheima.controller")
  3. //开启json数据类型自动转换
  4. @EnableWebMvc
  5. public class SpringMvcConfig {
  6. }
susunan json
   
  1. //集合参数:json格式
  2.    //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
  3.    //2.使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据
  4. //它用来将请求体所包含的数据传递给请求参数,此注解一个处理器方法只能使用一次
  5.    @RequestMapping("/listParamForJson")
  6.    @ResponseBody
  7.    public String listParamForJson(@RequestBody List<String> likes){
  8.        System.out.println("list common(json)参数传递 list ==> "+likes);
  9.        return "{'module':'list common for json param'}";
  10.   }
objek json (POJO)
  1. //POJO参数:json格式
  2. //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
  3. //2.使用@RequestBody注解将外部传递的json数据映射到形参的实体类对象中,要求属性名称一一对应
  4. @RequestMapping("/pojoParamForJson")
  5. @ResponseBody
  6. public String pojoParamForJson(@RequestBody User user){
  7.    System.out.println("pojo(json)参数传递 user ==> "+user);
  8.    return "{'module':'pojo for json param'}";
  9. }

Saat membuat permintaan Dapatkan:

  1. {
  2.    "name":"xixi",
  3.    "age":21,
  4.    "address":{
  5.        "provice":"taiyuan",
  6.        "city":"taiyuan"
  7.   }
  8. }
koleksi json (POJO)
  1. //集合参数:json格式
  2. //1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
  3. //2.使用@RequestBody注解将外部传递的json数组数据映射到形参的保存实体类对象的集合对象中,要求属性名称一一对应
  4. @RequestMapping("/listPojoParamForJson")
  5. @ResponseBody
  6. public String listPojoParamForJson(@RequestBody List<User> list){
  7.    System.out.println("list pojo(json)参数传递 list ==> "+list);
  8.    return "{'module':'list pojo for json param'}";
  9. }

Saat membuat permintaan Dapatkan:

  1. [{"name":"xixi","age":12},
  2. {"name":"haha","age":21}
  3. ]
Melihat

parameter jalur

Lewati parameter secara langsung melalui url permintaan. Gunakan {...} untuk mengidentifikasi parameter jalur. Anda perlu menggunakan @PathVariable untuk mendapatkan parameter jalur.

parameter jalur

  1. @RestController
  2. public class SimplePojo {
  3. @RequestMapping("/path/{id}")
  4. public String pathParam(@PathVariable Integer id) {
  5. System.out.println(id);
  6. return "yes";
  7. }
  8. }

Url yang diuji oleh tukang pos adalahhttp://localhost:8080/jalur/1

Beberapa parameter jalur

  1. @RestController
  2. public class SimplePojo {
  3. @RequestMapping("/path/{id}/{name}")
  4. public String pathParam(@PathVariable Integer id ,@PathVariable String name) {
  5. System.out.println(id+":"+name);
  6. return "yes";
  7. }
  8. }

Url yang diuji oleh tukang pos adalahhttp://localhost:8080/jalur/1/kucing

Minta jalur pemetaan

Pertanyaan: Jalur yang diminta selama pengembangan harus berbeda, tetapi jika ada jalur yang sama, kesalahan akan dilaporkan. Saya tidak tahu jalur mana yang harus dipanggil----------biasanya melaluiTetapkan nama modul sebagai awalan pada jalur permintaan

@PemetaanPermintaan

Ini adalah anotasi metode dan anotasi kelas

Tempatkan di atas definisi metode pengontrol SpringMVC

Digunakan untuk mengatur jalur permintaan metode pengontrol, jika menyetel metode pengontrol saat ini di kelas, minta awalan jalur akses

  1. @Controller
  2. //设置模块名作为请求路径的前缀
  3. @RequestMapping("/user")
  4. public class UserController {
  5.    //请求路径映射
  6.    @RequestMapping("/save")
  7.    @ResponseBody
  8.    public String save(){
  9.        System.out.println("user save ...");
  10.        return "{'module':'user save'}";
  11.   }
  12.    //请求路径映射
  13.    @RequestMapping("/delete")
  14.    @ResponseBody
  15.    public String delete(){
  16.        System.out.println("user delete ...");
  17.        return "{'module':'user delete'}";
  18.   }
  19. }

Properti: nilai (default): Minta jalur akses.Atau awalan jalur akses

Parameter permintaan

@RequestParam adalah anotasi parameter formal, yang terletak di depan definisi parameter metode pengontrol SpringMVC, yang digunakan untuk mengikat hubungan antara parameter permintaan dan parameter metode prosesor.

Parameter: diperlukan: apakah itu merupakan parameter yang diperlukan DefaultValue: nilai default parameter

tanggapan

@TubuhRespon

Apakah anotasi metode dan anotasi kelas

Terletak pada metode/kelas pengontrol

Fungsinya adalahMerespon langsung nilai pengembalian metode. Jika tipe nilai kembalian adalah objek/koleksi entitas, maka akan diubah menjadi respons format JSON.

@RestController=@Pengendali+@BodyResponse

  1. @RestController
  2. public class ResponseController {
  3. @RequestMapping("/hello")
  4. public String hello(){
  5. System.out.println("hello world");
  6. return "hello world~";
  7. }
  8. @RequestMapping("/getAddr")
  9. public Address getAddr(){
  10. Address addr=new Address();
  11. addr.setProvince("山西");
  12. addr.setCity("太原");
  13. return addr;
  14. }
  15. @RequestMapping("/listAddr")
  16. public List<Address> ListAddr(){
  17. List<Address> list=new ArrayList<>();
  18. Address addr=new Address();
  19. addr.setProvince("山西");
  20. addr.setCity("太原");
  21. Address addr2=new Address();
  22. addr2.setProvince("山");
  23. addr2.setCity("太");
  24. list.add(addr);
  25. list.add(addr2);
  26. return list;
  27. }
  28. }

Tes dimasukkan ke tukang poshttp://localhost:8080/daftarAddrItu saja, lainnya yang serupa

Setiap metode yang diekspos ke luar disebut antarmuka fungsional (misalnya, ada tiga antarmuka di atas), dan jalurnya adalah jalur aksesnya.

Permasalahan yang dihadapi adalah hasil responnya berbeda-beda, dan analisa akhir hasil lebih merepotkan, sehingga hasil respon perlu disatukan.

Hasil respons terpadu

  1. public class Result {
  2. private Integer code;
  3. private String msg;
  4. private Object data;
  5. public Result(){
  6. }
  7. public Result(Integer code,String msg,Object data){
  8. this.code=code;
  9. this.msg=msg;
  10. this.data=data;
  11. }
  12. public Integer getCode() {
  13. return code;
  14. }
  15. public void setCode(Integer code) {
  16. this.code = code;
  17. }
  18. public String getMsg() {
  19. return msg;
  20. }
  21. public void setMsg(String msg) {
  22. this.msg = msg;
  23. }
  24. public Object getData() {
  25. return data;
  26. }
  27. public void setData(Object data) {
  28. this.data = data;
  29. }
  30. public static Result success(Object data){
  31. return new Result(1,"success",data);
  32. }
  33. public static Result success(){
  34. return new Result(1,"success",null);
  35. }
  36. public static Result error(String msg){
  37. return new Result(0,msg,null);
  38. }
  39. @Override
  40. public String toString() {
  41. return "Result{" +
  42. "code=" + code +
  43. ", msg='" + msg + ''' +
  44. ", data=" + data +
  45. '}';
  46. }
  47. }
  1. @RestController
  2. public class ResponseController {
  3. @RequestMapping("/hello")
  4. public Result hello(){
  5. System.out.println("hello world");
  6. //return new Result(1,"success","hello world");
  7. return Result.success("hello world~");//需要给前端传送数据
  8. }
  9. @RequestMapping("/getAddr")
  10. public Result getAddr(){
  11. Address addr=new Address();
  12. addr.setProvince("山西");
  13. addr.setCity("太原");
  14. return Result.success(addr);
  15. }
  16. @RequestMapping("/listAddr")
  17. public Result ListAddr(){
  18. List<Address> list=new ArrayList<>();
  19. Address addr=new Address();
  20. addr.setProvince("山西");
  21. addr.setCity("太原");
  22. Address addr2=new Address();
  23. addr2.setProvince("山");
  24. addr2.setCity("太");
  25. list.add(addr);
  26. list.add(addr2);
  27. return Result.success(list);
  28. }
  29. }