【发布时间】:2021-11-21 14:26:40
【问题描述】:
对于使用后端的项目做出反应和工作相对较新。
基本上所有功能都相应地工作,但是,我有点不确定如何实现put 请求,该请求允许我只向后端发送特定值。
会发生什么:
当我向update 一家公司发送请求时,它要求我填写所有fields。如果我将字段留空,它会将它们作为空值发送。
E.G:
company 具有姓名、电子邮件、密码等字段。
我想更新 ONLY email 字段而不更改其他字段。
组件:
function UpdateCompany(props): JSX.Element {
const history = useHistory();
const [name , setName] = useState('');
const [email , setEmail] = useState('');
const [password , setPassword] = useState('');
const [skipCount, setSkipCount] = useState(true);
async function formData() {
try {
const response = await axios.put<CompanyModel>(globals.adminUrls.updateCompany + props.location.state.id, {
name: name,
email: email,
password: password
});
const updated = response.data;
store.dispatch(companyUpdatedAction(updated));
notify.success(SccMsg.COMPANY_UPDATED)
}
catch (err) {
notify.error(err);
}
}
const handleSubmit = (e) => {
e.preventDefault();
formData();
}
useEffect(() => {
if (skipCount) setSkipCount(false);
if (!skipCount) formData();
}, []);
return (
<div className="custom-field">
<h2>Update Company</h2>
<div>
<form onSubmit={handleSubmit} >
<label>Name</label>
<input type="text" name="name" onChange={(e)=>{setName(e.target.value)}}/>
<label>Email</label>
<input type="text" name="email" onChange={(e)=>{setEmail(e.target.value)}}/>
<label>Password</label>
<input type="text" name="password" onChange={(e)=>{setPassword(e.target.value)}}/>
<input type="submit" name="submit"/>
</form>
</div>
</div>
);
}
export default UpdateCompany;
希望我的问题很清楚。
谢谢。
后端控制器:
@PutMapping(value = "update/company/{id}")
@ResponseStatus(HttpStatus.NO_CONTENT)
@Override
public void updateCompany(@PathVariable int id, @RequestBody CompanyDto companyDto) throws DoesNotExistException, AlreadyExistsException {
adminService.updateCompany(id, companyDto);
后端服务:
public void updateCompany(@Valid int id, CompanyDto companyDto) throws DoesNotExistException, AlreadyExistsException {
Company companyDao = companyMapper.toDao(companyDto);
if (!compRepo.existsById(id))
throw new DoesNotExistException("Company does not exist");
companyDao.setId(id);
compRepo.saveAndFlush(companyDao);
【问题讨论】:
-
不是很清楚是什么问题
-
@GiorgiMoniava 抱歉,如果我不清楚,目前如果我填写表单字段并尝试仅更新
1参数,所有其他人将是null并相应更新,我想选择能够仅更新specific字段,而其余字段不转为null。希望我很清楚。 -
好吧,如果您只想更新电子邮件,那么您可以只发送电子邮件作为
PUT请求正文中的参数。我不太确定目前是什么阻碍了您。 -
@Salvino 我希望用户能够更新所有
3选项。但也可以选择仅更新选定字段而不更改其余字段。到目前为止,如果我不更新特定字段。它将以null发送,我正在努力避免这种情况。 -
是的,我明白了。所以它可以通过一个简单的
if条件来解决。如果任何属性值等于 null,请不要将其放在请求正文中。因此,如果电子邮件已填充,电子邮件将在请求正文中发送。如果填写了电子邮件和姓名,电子邮件和姓名将在请求正文中发送。
标签: reactjs axios react-hooks put