#javascript #reactjs #react-redux #react-hooks #react-router
Вопрос:
Вот мой код React JS:
class App extends React.Component{
constructor(props){
super(props);
this.state = {
person: {
id: 0,
name: "name",
email: "email"
}
}
}
handleChange = (event) =>{
const {name, value} = event.target;
//setting the state
this.setState({person: { ...this.state.person, [name]: value }});
}
handleFormSubmission = (event) =>{
event.preventDefault();
}
someFunction = () =>{
let apiCall;
let personState = JSON.stringify(this.state.person);
apiCall = await axios.put(`http://localhost:8000/api/people/update/${this.state.person.id}/`, {personState}, {headers:{token: this.props.token}});
}
render() {
return (
<form id="parent-container" onSubmit={this.handleFormSubmission}>
<input type=text" value={this.state.person.name} name="personName" onChange={this.handleChange}
<input type=text" value={this.state.person.name} name="personName" onChange={this.handleChange}
<button type="submit" onClick={() => this.someFunction()}>Submit</button>
</form>
);
}
}
export default App;
Изучив запрос в Google Chrome, вот что я нашел:
Заголовки:
General:
Request URL: http://localhost:8000/api/people/update/0/
Request Method: PUT
Status Code: 400 Bad Request
Remote Address: 127.0.0.1:8000
Referrer Policy: strict-origin-when-cross-origin
Response Headers:
Access-Control-Allow-Origin: http://localhost:3000
Allow: PUT, PATCH, OPTIONS
Content-Length: 598
Content-Type: application/json
Date: Fri, 10 Sep 2021 23:08:55 GMT
Server: WSGIServer/0.2 CPython/3.8.1
Vary: Accept, Cookie, Origin
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Request Headers:
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Accesstoken: someAccessToken
Connection: keep-alive
Content-Length: 503
Content-Type: application/json;charset=UTF-8
Host: localhost:8000
Origin: http://localhost:3000
Referer: http://localhost:3000/
sec-ch-ua: "Google Chrome";v="93", " Not;A Brand";v="99", "Chromium";v="93"
sec-ch-ua-mobile: ?1
sec-ch-ua-platform: "Android"
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Mobile Safari/537.36
Request Payload:
person: "{"id":6,"name":"some person","email":"aaa@email.com"}"
Вкладка «Ответ»:
{
"name":["This field is required."],
"email":["This field is required."],
}
Конечная точка:
ПОЛОЖИТЬ http://localhost:8000/api/persons/update/6/ 400 (Плохой запрос)
Из того, что я вижу выше, следует, что он не передает данные с интерфейса в REST API с помощью запроса Axios PUT. Даже несмотря на то, что при использовании Postman для отправки данных и отправки запроса api это работает. Это происходит только с запросами PUT и POST, но запросы GET работают отлично.
в чем проблема, почему он не передает отправку данных из React в REST API в запросе Axios ?
Комментарии:
1. Работает ли это, когда вы пропускаете
JSON.stringify()
и отправляете состояние напрямую:await axios.put('myurl', this.state.person, {headers...})
?
Ответ №1:
Вы устанавливаете свое состояние как
this.setState({person: { ...this.state.person, [name]: value }});
которые делают вас name
ключом в государстве.
Например, если пользователь введет john
имя, ваше состояние будет выглядеть так:
{
john: 'something i don't know',
email: 'sth'
}
Подробнее читайте здесь Вычисленные имена свойств
Измените эту строку на
this.setState({person: { ...this.state.person, name: value }});
Ответ №2:
Таким образом, проблема заключалась в том, что я передавал объект в аргумент данных запроса Axios, он не должен быть заключен в фигурные скобки объекта {}.
Вот как это должно быть передано в Axios:
apiCall = await axios.put(`http://localhost:8000/api/people/update/${this.state.person.id}/`, this.state.person, {headers:{token: this.props.token}});