技術共有

Web バックエンド開発 -- リクエストへの応答

2024-07-12

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

目次

序文

聞く

単純なパラメータ

独自の手法

春の道

リクエスト後の処理が文字化けする

エンティティパラメータ

単純なエンティティパラメータ

複雑なエンティティパラメータ

編集

配列コレクションのパラメータ

配列パラメータ

編集

収集パラメータ

日付パラメータ

編集

Jsonパラメータ

編集

jsonデータを渡す

json配列

json オブジェクト (POJO)

jsonコレクション(POJO)

知らせ

パスパラメータ

リクエストマッピングパス

@リクエストマッピング

リクエストパラメータ

応答

@レスポンス本文

統一された対応結果


序文

リクエスト: リクエストデータの取得

応答: 応答データを設定します

BS アーキテクチャ ブラウザ/サーバー、ブラウザ/サーバー アーキテクチャ モード。クライアントはブラウザのみを必要とし、アプリケーション ロジックとデータはサーバーに保存されます (メンテナンスが簡単、平均的な経験

CS アーキテクチャ クライアント/サーバー、クライアント/サーバー アーキテクチャ モード (開発とメンテナンスは面倒だが体験は良い

聞く

単純なパラメータ

独自の手法

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. }

春の道

単純なパラメータ:パラメータ名は仮パラメータ変数名と同じです、仮パラメータの定義はパラメータを受け取ることを意味します

  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. }

ここでの postman の URL はすべてhttp://localhost:8080/SimpleParam?name=tom&age=10

上記は両方とも get リクエストです。post リクエストの場合は、postman に URL を入力するだけです。http://localhost:8080/シンプルパラメータ

リクエスト後の処理が文字化けする

投稿内に漢字が含まれる場合、背景に文字化けが表示されるため、設定でフィルターを設定してください。

Web コンテナにフィルタを追加し、文字セットを指定します。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. }

なお、この処理はpost用ですので、中国語でgetを渡しても文字化けが発生します。

メソッド パラメーター名がリクエスト パラメーター名と一致しない場合は、@RequestParam を使用してマッピングを完了できます。

  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. }

@PequestParam の required 属性のデフォルトは true です。これは、リクエスト パラメータを渡す必要があることを意味します。パラメータがオプションである場合 (つまり、渡すかどうかにかかわらず)、 required 属性は false に設定できます (この方法では、それを渡しても渡してもエラーは報告されません)

エンティティパラメータ

単純なエンティティパラメータ

リクエストパラメータ名は仮パラメータの属性名と同じで、それを受け取るためにPojoを定義するだけです。

  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. }

ここのURLはhttp://localhost:8080/SimpleParam1?name=cat&age=29

複雑なエンティティパラメータ

リクエストパラメータ名は、仮パラメータの属性名と同じです。、オブジェクトの階層関係に従って、ネストされた pojo 属性パラメーターを受け取ることができます。

  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. }

配列コレクションのパラメータ

配列パラメータ

リクエストパラメータ名が仮パラメータグループ名と同じであり、リクエストが複数存在します。、パラメータを受け取る配列型の仮パラメータを定義します

  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. }

収集パラメータ

リクエストパラメータ名は仮パラメータコレクション名と同じであり、リクエストパラメータは複数存在します。@リクエストパラメータバインディングパラメータの関係

  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. }

日付パラメータ

@DateTimeFormat アノテーションを使用して日付パラメータ形式の変換を完了する

  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:日期时间格式字符串

テストを取得:

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

Jsonパラメータ

json パラメータのキー名は、仮パラメータのオブジェクト属性名と同じです。Pojo 型の仮パラメータを定義することでパラメータを受け取ることができます。 @RequestBody 識別子を使用する必要があります。

  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这和前面的复杂实体参数一样

@requestbody を通じて json をユーザー エンティティ クラスにカプセル化します。

jsonデータを渡す

最初に座標をインポートします

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

Json データの自動変換のサポートを有効にする

  1. @Configuration
  2. @ComponentScan("com.itheima.controller")
  3. //开启json数据类型自动转换
  4. @EnableWebMvc
  5. public class SpringMvcConfig {
  6. }
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.   }
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. }

Get リクエストを行う場合:

  1. {
  2.    "name":"xixi",
  3.    "age":21,
  4.    "address":{
  5.        "provice":"taiyuan",
  6.        "city":"taiyuan"
  7.   }
  8. }
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. }

Get リクエストを行う場合:

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

パスパラメータ

リクエスト URL を通じてパラメータを直接渡します。パス パラメータを識別するには、{...} を使用します。パス パラメータを取得するには、@PathVariable を使用する必要があります。

パスパラメータ

  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 は次のとおりですhttp://localhost:8080/path/1

複数のパスパラメータ

  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 は次のとおりですhttp://localhost:8080/path/1/cat

リクエストマッピングパス

質問: 開発中に要求されたパスは異なるはずですが、同じパスがある場合、どちらを呼び出す必要があるかがわかりません。-----通常は経由します。モジュール名をリクエストパスのプレフィックスとして設定します。

@リクエストマッピング

メソッドアノテーションとクラスアノテーションです

SpringMVC コントローラーのメソッド定義の上に配置します。

コントローラーメソッドのリクエストパスを設定するために使用されます、クラスに現在のコントローラー メソッドを設定する場合、アクセス パスのプレフィックスを要求します

  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. }

プロパティ: 値 (デフォルト): リクエストのアクセス パス。またはアクセスパスプレフィックス

リクエストパラメータ

@RequestParam は、SpringMVC コントローラー メソッドのパラメーター定義の前に位置する正式なパラメーター アノテーションで、リクエスト パラメーターとプロセッサー メソッドのパラメーター間の関係をバインドするために使用されます。

パラメータ: required: 必須パラメータかどうか DefaultValue: パラメータのデフォルト値

応答

@レスポンス本文

メソッド アノテーションとクラス アノテーションです。

コントローラーのメソッド/クラスにあります

機能はメソッドの戻り値に直接応答します。戻り値の型がエンティティオブジェクト/コレクションの場合は、JSON形式の応答に変換されます。

@RestController=@Controller+@ResponseBody

  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. }

テストは郵便配達員に入力されますhttp://localhost:8080/リストアドレスそれだけです、他の同様のもの

外部に公開される各メソッドは機能インターフェースと呼ばれ(たとえば、上記のインターフェースは 3 つあります)、パスはそのアクセス経路になります。

課題としては、回答結果が異なり、最終的な結果分析が煩雑であるため、回答結果を統一する必要があることです。

統一された対応結果

  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. }