[英]sending data from ajax to spring controller: Required String parameter is not present
[英]Spring Boot REST - Required String parameter is not present
我无法将数据发送到 Spring Boot 服务器。 我与邮递员核对,一切都很好,但是我使用了 ReactJS 的 axios 库,出现错误
Required String parameter 'name' is not present.
addProduct = (e) => {
e.preventDefault();
var { productName, productPrice, productStatus } = this.state;
callApi('product/add', 'POST', {
name: productName,
price: productPrice,
status: productStatus
}).then(res => {
console.log(res);
});
}
@RestController
@RequestMapping(path = "/api/product")
public class ProductController {
@Autowired
private ProductRespository productRespository;
@GetMapping(path = "/all")
public @ResponseBody Iterable<Product> getAllProduct(){
return productRespository.findAll();
}
@PostMapping(path = "/add")
@ResponseBody
public String createProduct(@RequestParam String name, @RequestParam Integer price, @RequestParam String status){
Product product = new Product();
product.setName(name);
product.setPrice(price);
product.setStatus(status);
productRespository.save(product);
return "OK";
}
}
import axios from 'axios';
import * as Config from './../constants/Config';
export default function callApi(endpoint, method, body) {
return axios({
method: method,
url: `http://localhost:8000/api/${endpoint}`,
data: body,
headers: {
'Access-Control-Allow-Origin': '*'
}
}).catch(err => {
console.log(err);
});
}
我该如何解决?
你的休息服务需要名称、价格、状态作为请求参数,在春天这些默认情况下是强制性的。 但是在您的反应代码中,您不是将这些作为请求参数发送,而是将它们作为请求正文发送。
由于 name 是第一个参数,一旦它不可用,spring 就会抛出 'name' not available 异常,但是一旦你修复它,它就会抛出价格,然后是状态。 因此,将它们全部修复在一起。
您必须像下面那样更改控制器方法,这将提高代码效率并采用标准方式。
@PostMapping(path = "/add")
@ResponseBody
public String createProduct(@RequestBody Product product){
productRespository.save(product);
return "OK";
}
或者更改您的反应代码以在如下所示的请求中发送它们。 但是对于“POST”方法,不推荐这样做。 因为这会暴露 url 本身传递的信息。
addProduct = (e) => {
e.preventDefault();
var { productName, productPrice, productStatus } = this.state;
callApi('product/add?name=' + productName + '&price=' + productPrice + '&status=' + productStatus , 'POST', {}).then(res => {
console.log(res);
});
}
@RequestParam
注释从 url 获取其数据。 应该是这样的:
?name=myname&price=100&status=ok
如果您将数据作为请求正文中的 json 对象发送,则@RequestBody
注释就是您要查找的内容。 确保您还将axios
请求中的Content-Type
设置为application/json
axios.post('url', JSON.stringify({
"name": productName,
"price": productPrice,
"status": productStatus,
}) , { headers: { "Content-Type": "application/json" }
})
您需要将 add 方法的参数更改为单个@RequestBody Product
参数。 或者你应该在你的 Axios 请求中包含所有参数作为查询参数: product/add?name=myname&price=100&status=ok
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.