javascript - 如何对 REST API 中特定模型的所有字段使用一个更新函数?
问题描述
我正在为一个项目使用 Django REST Framework 和 React。我有一个 API 路由/api/account/user/
,它接受 GET 和 POST 请求(RetrieveUpdateAPIView)。现在,在我的 React 前端,我的操作文件中有这个函数,我想用它来更新用户数据:
export const updateUser = (email, name, company, phoneVerified, idVerified) => {
return (dispatch, getState) => {
const token = getState().auth.token
let headers = {
'Content-Type': 'application/json'
}
if (token) {
headers['Authorization'] = `Token ${token}`
}
let body = JSON.stringify({email, name, company, phoneVerified, idVerified})
return fetch('//localhost:8000/api/account/user/', {headers, body, method: 'POST'})
.then(res => {
if (res.status < 500) {
return res.json().then(data => {
return {status: res.status, data}
})
}
else {
console.log('Server error.')
}
})
.then(res => {
console.log(res)
if (res.status === 200) {
dispatch({type: 'USER_UPDATE_SUCCESSFUL', data: res.data})
return res.data
}
else if (res.status === 403 || res.status === 401) {
dispatch({type: 'USER_UPDATE_FAILED', data: res.data})
return res.data
}
else {
dispatch({type: 'USER_UPDATE_FAILED', data: res.data})
return res.data
}
})
}
}
如果我传递所有参数(email, name, company, phoneVerified, idVerified)
,则此功能有效,但例如,如果我只想更新phoneVerified
按钮单击事件,如何仅传递该参数?目前我正在这样做:
updateUser: (phoneVerified) => dispatch(auth.updateUser(phoneVerified))
但服务器响应是This field may not be null
. 对此的任何帮助将不胜感激。
解决方案
这不是 React 的问题,而是你在后端代码中的处理方式。
您在 rest API 中使用 HTTP POST 方法,默认情况下它用于创建一条记录
您应该为您的端点实现其他 HTTP 方法处理,它是 PUT 方法,但是使用 PUT,您仍然需要发送具有更新属性的整个对象来更新它(通常,应该使用 PUT 来完全更新记录)
另一种 HTTP 方法更适合您的情况,它是 PATCH 方法,就像 PUT 一样,但您可以将更新的属性发送到带有记录 id 的服务器(PATCH 应该用于部分更新记录)。
对于这两种情况,只是应该,而不是必须,因为它是 HTTP 的标准约定,它不受限制。即使您仍然可以使用 GET 方法创建记录。
推荐阅读
- arduino - 如何在没有运动时阻止 PIR 传感器发送高输出
- python - 蜘蛛完成后返回scrapy项目
- javascript - 如何过滤深层嵌套数据?- Javascript JSON
- vue.js - 100% 动态多租户 VueJS/.NetCore 应用程序中的 SSR(内容、组件等)
- java - 将图像/文件上传到服务器时使用 MultipartBody.Builder 的问题
- javascript - 如何使用 Google Apps 脚本将视频上传到 YouTube?
- node.js - 找不到模块'C:\Users\[...]\npm\node_modules\npm\node_modules\read-package-json\read-json.js'
- reactjs - NextsJS & Auth0 保护页面路由
- javascript - 正则表达式验证在 sonarqube 上失败
- ffmpeg - 尽管重新采样音频过滤器,但 Ffmpeg 对 ts 和 m3u8 文件的切割不准确