#javascript #ruby-on-rails #json #api
Вопрос:
У меня есть API rails, в который я пытаюсь отправить данные JSON с интерфейса react в этом формате:
{
"user" : {
"email": "daves@email.com"
"password": "dave123"
"password_confirmation": "dave123"
"subject": "david"
"teacher": "student"
"username": "mikey"
}
}
очевидно, что он вложен внутри «пользователя»,
но в настоящее время мой код просто отправляет его без участия пользователя, а API не нравится формат JSON
Signup.js:18 POST http://localhost:3001/api/users net::ERR_ABORTED 422 (Unprocessable Entity)
}
email: "daves@email.com"
password: "dave123"
password_confirmation: "dave123"
subject: "david"
teacher: "student"
username: "mikey"
}
Как я могу отправить JSON в API в правильном формате? вот javascript для страницы отправки входа в систему
import React from 'react'
import { useState } from 'react'
// import axios from 'axios'
export default function Signup() {
const [teacher, setUserType] = useState("student");
const [subject, setSubject] = useState(" ");
const [email, setEmail] = useState("email");
const [password, setPassword] = useState("password");
const [password_confirmation, setConfirmedPassword] = useState("confirm password");
const username = "mikey"
const handleSubmit = (e) => {
e.preventDefault();
const user = {teacher, subject, email, password, password_confirmation, username}
console.log(user)
fetch('http://localhost:3001/api/users', {
mode: 'no-cors',
method: 'POST',
headers: { "Content-Type": "application/json"},
body: JSON.stringify(user)
}).then(() => {
console.log(user)
})
}
return (
<div className="signup-form">
<form onSubmit={handleSubmit}>
<label>
<input
type="radio"
value={teacher}
onChange={(e) => setUserType(e.target.value)}
/>
Student
</label>
<label>
<input
type="radio"
value={teacher}
onChange={(e) => setUserType(e.target.value)}
/>
Tutor
</label>
<label>Subject</label>
<input
type="text"
required
placeholder=" "
onChange={(e) => setSubject(e.target.value)}
/><br/>
<label>Email address</label>
<input
type="text"
required
placeholder="email"
onChange={(e) => setEmail(e.target.value)}
/><br/>
<label>New password</label>
<input
type="text"
required
placeholder="choose password"
onChange={(e) => setPassword(e.target.value)}
/><br/>
<label>Confirm password</label>
<input
type="text"
required
placeholder="confirm password"
onChange={(e) => setConfirmedPassword(e.target.value)}
/>
<button>Submit</button>
</form>
</div>
);
}
Спасибо
чтобы добавить, я смог отправить запрос на отправку в postman, который возвращает:
{
"user": {
"id": 4,
"email": "testesr@testing.com",
"username": "fffmike",
"subject": null,
"teacher": null,
"token": "eyJhbGciOiJIUzI1NiJ9.eyJpZCI6NCwiZXhwIjoxNjM0MDYxOTkwfQ.8qLlB5wwPGSCsxtkzjuEIxw8PFbLKoM_fo9UllNsonQ"
}
}
но не через fetch
Комментарии:
1. Вопрос по вашему редактированию: Вы хотите сказать, что ваш API отвечает вложенными данными JSON, о которых, по-видимому, был ваш вопрос? Это не имеет значения; вместо этого вам следует указать, какой запрос вы отправили с почтальоном.
Ответ №1:
Попробуйте JSON.stringify({ user })
вместо JSON.stringify(user)
того, чтобы создавать вложенное поле.
Комментарии:
1. Я пробовал это, но все равно (422 (Необработанная сущность)) спасибо за ваш ответ
Ответ №2:
Прямо сейчас похоже, что пользователь неправильно отформатирован в вашей user
переменной. Поскольку ваша user
переменная передается непосредственно в качестве тела запроса на извлечение, вам нужно будет создать объект с нужным форматом перед запуском JSON.stringify
.
const handleSubmit = (e) => {
e.preventDefault();
const user = {user: {teacher, subject, email, password, password_confirmation, username}}
console.log(user)
fetch('http://localhost:3001/api/users', {
mode: 'no-cors',
method: 'POST',
headers: { "Content-Type": "application/json"},
body: JSON.stringify(user)
}).then(() => {
console.log(user)
})
}
Комментарии:
1. спасибо за ваш ответ. Я пробовал это, но я все еще получаю Регистрация.в JS:18 сообщение от localhost:3001/API-интерфейс/пользователи нетто::ERR_ABORTED 422 (Unprocessable лица) регистрации.в JS:24 {пользователь: {…}} пользователя: написать:: «michaelmcloughlin9@gmail.com» пароль: «michael3214» password_confirmation: «michael3214» тема: «искусство», учитель: «тема» имя пользователя: «майки» [[прототип]]: объекта