簡體   English   中英

如何使用FETCH API將數據發送到Spring Boot方法

[英]How to send data to spring boot method using FETCH API

我正在探索fetch api,並希望將一些日期信息發送到spring boot方法,但是會引發400錯誤

JS代碼

let fetchConfig = {
            method : params.method || 'GET',
            body : params.body
        };
        return fetch(_url,fetchConfig).then(function (response) {
            if (!response.ok) {
                throw Error(response.statusText);
            }
            else {
                return response.json();
            }
        }).then(function (data) {
            return data;
        }).catch(function (error) {
            return error;
        })

彈簧啟動方法

@RequestMapping(value = "/validate",method = RequestMethod.POST,produces = MediaType.APPLICATION_JSON_VALUE)
    public  @ResponseBody ValidateUserModel validateUser(@RequestParam("userName") String userName, @RequestParam("password") String pass){
        System.out.println("--- test");
        ValidateUserModel validateUserModel = new ValidateUserModel();
        validateUserModel.setUserName("Test");
        validateUserModel.setPassWord("Test 2");
        return  validateUserModel;
    }

這就是fetchConfig樣子

body:{userName: "awdaw", password: "awdawd"}
method:"POST"
password:"test"
url:"test"
userName:"awdaw"
__proto__:Object

從Java類發送的值的預覽

error:"Bad Request"
exception:"org.springframework.web.bind.MissingServletRequestParameterException"
message:"Required String parameter 'userName' is not present"
path:"/validate"
status:400
timestamp:1504771336175

錯誤顯示Required String parameter 'userName' is not presentfetchConfig具有必需的密鑰

您的Java代碼期望請求參數,因此期望的URL應該類似於.../validate?username=<someValue>&password=<otherValue> ,但是您的js會將其發送到正文中(這是一個更好的選擇,發送用戶和作為URL一部分的密碼根本不安全)。

您可以將Java代碼更改為

@RequestMapping(value = "/validate",method = RequestMethod.POST,produces = MediaType.APPLICATION_JSON_VALUE)
public  @ResponseBody ValidateUserModel validateUser(@RequestBody User user){
    System.out.println("--- test");
    ValidateUserModel validateUserModel = new ValidateUserModel();
    validateUserModel.setUserName(user.getUserName());
    validateUserModel.setPassWord(user.getPassword());
    return validateUserModel;
}

其中User只是一個具有passworduserName作為屬性的bean。

嘗試使用@RequestBody批注。

@RequestMapping(value = "/validate",method = RequestMethod.POST,produces = MediaType.APPLICATION_JSON_VALUE)
public  @ResponseBody ValidateUserModel validateUser(@RequestBody User user){
    System.out.println("--- test");
    ValidateUserModel validateUserModel = new ValidateUserModel();
    validateUserModel.setUserName(user.getUserName());
    validateUserModel.setPassWord(user.getPassword());
    return validateUserModel;
}

該請求應如下所示:

  let data = {userName: "awdaw", password: "awdawd"};
    fetch{ url, {
      body: JSON.stringfy(data)
      method:"POST"
      headers: {
               "Content-Type": "application/json",
           },
     }).then(
            response =>  {
                return response.json();
            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM