Я испытываю серьезное беспокойство.Я разрабатываю API с Symfony 3. Этот API запрашивается на лицевой стороне с React.Используемая задняя сторона сервера (API) - http://127.0.0.1:8000.. Используемый на лицевой стороне сервер - http://localhost:3000.
. Когда я вызываю API с передней стороны, у меня возникают две ошибки: - Метод 405Не разрешено - Доступ к XMLHttpRequest по адресу http://127.0.0.1:8000/users/email/settings' от источника http://localhost:3000' заблокирован: Политика CORS: Ответ на предпечатную проверку: заголовок «Access-Control-Allow-Origin» отсутствует.запрашиваемый ресурс.
Однако я указал правильный метод (патч) и настроил заголовок из API:
Вот подробный код:
API(обратно с Symfony)
/**
* @Route("/users/email/settings", methods={"PATCH"})
* @param Request $request
* @param FlashMessage $flashMessage
*/
public function usersEmailEditAction(Request $request, FlashMessage $flashMessage)
{
if($request->getContent())
{
$data = json_decode($request->getContent(), true);
$em = $this->getDoctrine()->getManager();
$user = $this->get('security.token_storage')->getToken()->getUser();
$editUser = $em->getRepository(User::class)->find($user->getId());
if (!$editUser) {
return $flashMessage->messageError("USER_NOT_FOUND", 1);
}
if (!$data['password']) {
return $flashMessage->messageError("PASSWORD_NOT_FOUND", 1);
}
if (!filter_var($data['email'], FILTER_VALIDATE_EMAIL)) {
return $flashMessage->messageError("INVALID_EMAIL", 1, "format email invalid");
}
if (!filter_var($data['confirmEmail'], FILTER_VALIDATE_EMAIL)) {
return $flashMessage->messageError("INVALID_EMAIL", 1, "format email invalid");
}
if ($data['email'] != $data['confirmEmail']) {
return $flashMessage->messageError("NO_MATCHING_EMAIL", 1, "les emails sont différents");
}
// on vérifie le mot de passe
$encoder = $this->get('security.password_encoder');
$isPasswordValid = $encoder->isPasswordValid($user, $data['password']);
// Le mot de passe n'est pas correct
if (!$isPasswordValid) {
return $flashMessage->messageError("INCORRECT_PASSWORD", 1);
}
$editUser->setEmail($data['email']);
$editUser->setUpdatedAt(new \DateTime());
$em->flush();
return $flashMessage->messageSuccess("EMAIL_UPDATED_SUCCESSFULLY", 0);
}else {
return $flashMessage->messageWarning("NOTHING_UPDATED", 2);
}
}
возврат $ flashMessage
public function messageSuccessAction($message, $code, $desc = null)
{
$response = new Response();
$response->setContent(json_encode([
'error' => $code,
'message' => $message
]));
$response->headers->set('Content-Type', 'application/json');
$response->headers->set('Access-Control-Allow-Origin', 'http://localhost:3000');
$response->headers->set('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, PATCH, OPTIONS');
return $response;
//return new JsonResponse(array("error" => $code, "message" => $message));
}
public function messageErrorAction($message, $code, $desc = null)
{
$response = new Response();
$response->setContent(json_encode([
'error' => $code,
'message' => $message
]));
$response->headers->set('Content-Type', 'application/json');
$response->headers->set('Access-Control-Allow-Origin', 'http://localhost:3000');
$response->headers->set('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, PATCH, OPTIONS');
return $response;
//return new JsonResponse(array("error" => $code, "message" => $message));
}
public function messageWarningAction($message, $code, $desc = null)
{
$response = new Response();
$response->setContent(json_encode([
'error' => $code,
'message' => $message
]));
$response->headers->set('Content-Type', 'application/json');
$response->headers->set('Access-Control-Allow-Origin', 'http://localhost:3000');
$response->headers->set('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, PATCH, OPTIONS');
return $response;
//return new JsonResponse(array("error" => $code, "message" => $message));
}
Запрос API с фронта (используйте Axios)
requestAPI = (myPassword, newEmail, confirmEmail) => {
axios.patch('http://127.0.0.1:8000/users/email/settings', {
crossdomain: true,
password: myPassword,
email: newEmail,
confirmEmail: confirmEmail
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
}
Я тоже пробовал без междомена, но ничего.
У вас есть идеи?Спасибо за вашу помощь