Я использую L5-Форс 5.7. * Упаковка (обертка Форс-PHP) и попробовал описать Laravel REST API. Итак, мой код такой:
/**
* @OA\Post(path="/subscribers",
* @OA\RequestBody(
* @OA\MediaType(
* mediaType="application/json",
* @OA\Schema(
* type="object",
* @OA\Property(property="email", type="string")
* )
* )
* ),
* @OA\Response(response=201,description="Successful created"),
* @OA\Response(response=422, description="Error: Unprocessable Entity")
* )
*/
public function publicStore(SaveSubscriber $request)
{
$subscriber = Subscriber::create($request->all());
return new SubscriberResource($subscriber);
}
Но когда я пытаюсь отправить запрос через панель Swagger, я получаю код:
curl -X POST "https://examile.com/api/subscribers" -H "accept: */*" -H "Content-Type: application/json" -H "X-CSRF-TOKEN: " -d "{\"email\":\"bademail\"}"
Как видите, accept — это не application / json, и Laravel не идентифицирует это как AJAX-запрос. Поэтому, когда я отправляю неверные данные и ожидаю получить 422 с ошибками в реальном времени, я получаю 200 кодов с ошибками в «сеансе». Запрос (XHR) через панель swagger также обрабатывается некорректно, код CURL просто для наглядности.
Также я обнаружил, что в предыдущей версии использовалось что-то вроде:
* @SWG\Post(
* ...
* consumes={"multipart/form-data"},
* produces={"text/plain, application/json"},
* ...)
Но сейчас это уже устарело.
Итак, как получить код 422 без перенаправления, если проверка не удалась? Или, может быть, добавить заголовок «XMLHttpRequest»? Что здесь лучше всего делать?
Ответ (ы) не указали mimetype.
@OA\Response(response=201, description="Successful created"),
Если вы укажете ответ json, swagger-ui отправит Accept: application/json
заголовок.
PS. Поскольку JSON является настолько распространенным, Swagger-PHP имеет @OA\JsonContent
сокращенно, это работает для ответа:
@OA\Response(response=201, description="Successful created", @OA\JsonContent()),
и запрашивающий орган:
@OA\RequestBody(
@OA\JsonContent(
type="object",
@OA\Property(property="email", type="string")
)
),
Других решений пока нет …