首页 > 解决方案 > 如何对 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. 对此的任何帮助将不胜感激。

标签: javascriptreactjsrest

解决方案


这不是 React 的问题,而是你在后端代码中的处理方式。

您在 rest API 中使用 HTTP POST 方法,默认情况下它用于创建一条记录

您应该为您的端点实现其他 HTTP 方法处理,它是 PUT 方法,但是使用 PUT,您仍然需要发送具有更新属性的整个对象来更新它(通常,应该使用 PUT 来完全更新记录

另一种 HTTP 方法更适合您的情况,它是 PATCH 方法,就像 PUT 一样,但您可以将更新的属性发送到带有记录 id 的服务器(PATCH 应该用于部分更新记录)。

对于这两种情况,只是应该,而不是必须,因为它是 HTTP 的标准约定,它不受限制。即使您仍然可以使用 GET 方法创建记录。


推荐阅读