#json #laravel #http-headers
#json #laravel #http-заголовки
Вопрос:
По некоторым причинам я отправляю ответ JSON из моего помощника / библиотеки вместо контроллера, используя приведенный ниже код:
response()->json(
[
"status" => false,
"message" => "This product is out of stock",
],
200
)->send();
exit;
моя проблема в отсутствии заголовка промежуточного программного обеспечения, если этот ответ отправлен. Как прикрепить заголовок ко всем response()->json()->send();exit;
функциям?
Ниже приведен заголовок моего ответа контроллера по умолчанию):
Приведенный выше ответ содержит все заголовки из всего промежуточного программного обеспечения, а ниже — мой заголовок ответа от response()->json()->send();exit;
:
выше не показаны заголовки из промежуточного программного обеспечения.
Я знаю, что могу отправить заголовок вручную, добавив ->header('X-Header-One', 'Header Value')
подобный код ниже:
response()->json(
[
'status' => false,
'message' => 'This voucher is not for selected products',
]
)->header('X-Header-One', 'Header Value')->send();
exit;
Но у меня уже так много таких ответов, и я не хочу пытаться намочить свой код.
Комментарии:
1. почему бы вам не создать промежуточное программное обеспечение и не применить его там?
2. Промежуточное программное обеспечение не работает над этим, см. Мой скриншот выше
Ответ №1:
После некоторого изучения вы также можете создать макрос ответа
https://laravel.com/docs/8.x/responses#response-macros
<?php
namespace AppProviders;
use IlluminateSupportFacadesResponse;
use IlluminateSupportServiceProvider;
class ResponseMacroServiceProvider extends ServiceProvider
{
/**
* Register the application's response macros.
*
* @return void
*/
public function boot()
{
Response::macro('custom', function ($value) {
return Response::json($value)->headers();
});
}
}
Затем в вашем коде просто используйте
return response()->custom($data);
Ответ №2:
В вашем Controller.php
Добавьте функцию и называйте ее как хотите
НАПРИМЕР
public function MyCustomResponse()
{
...
}
Затем разрешите ему принимать нужные параметры, в вашем случае это массив и целое число (данные и статус)
public function MyCustomResponse(array $data, int $status)
{
...
}
Затем обработайте логику там
public function MyCustomResponse(array $data, int $status)
{
response()->json($data, $status)->header('X-Header-One', 'Header Value')->send();
}
Теперь, когда вы захотите его использовать, убедитесь, что вы расширяете контроллер, на котором вы разместили этот код, и просто выполните
return $this->myCustomResponse($data, 200);
Лучшим вариантом в зависимости от ваших потребностей является использование промежуточного программного обеспечения
public function handle($request, Closure $next)
{
$request->headers->set( ... );
return $next($request);
}
И применить к вашему маршруту
Комментарии:
1. спасибо, это хорошая идея, но сначала я постараюсь дождаться другой идеи.
Ответ №3:
Создайте промежуточное программное обеспечение SetHeader.php
затем
<?php
namespace AppHttpMiddleware;
use Closure;
class setHeader
{
/**
* Handle an incoming request.
*
* @param IlluminateHttpRequest $request
* @param Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$request->headers->set('X-Header-One', 'Header Value');
return $next($request);
}
}
таким образом, вы можете добавлять как можно больше заголовков и применять к тем маршрутам, которые вы хотите отправить
Комментарии:
1. Промежуточное программное обеспечение не работает с этим ответом, поэтому спросил, работает ли оно как в контроллере, проблема решена
2. это должно работать так, как я использую то же самое, и для меня это работает
3. Нет, может быть, вы используете
return response()
not like me без возврата, но ставите exit / die после этого response()-> json()-> send(); exit;,4. попробуйте мой код в своей модели, помощнике или библиотеке, и вы понимаете, что я имею в виду
5. я думаю, что в моем коде установлен заголовок
request
, а в вашем коде установлены заголовкиresponse
, потому что ваши проверяющие заголовки возвращаются с сервера, а мой код — при отправке запроса. на сервере мы изменяем заголовки, затем они передаются контроллеру с новыми заголовками
Ответ №4:
Что ж, ответ на этот вопрос уже дан, но я предлагаю использовать концепцию промежуточного программного обеспечения. Промежуточное программное обеспечение работает не только для запросов, но и для ответа.
Используя макрос ответа, мы должны изменить ссылку, чтобы использовать пользовательскую функцию вместо json.
Вот код промежуточного программного обеспечения.
SetResponseHeaders.php
<?php
namespace AppHttpMiddleware;
use Closure;
use IlluminateHttpRequest;
class SetResponseHeaders
{
/**
* Handle an incoming request.
*
* @param IlluminateHttpRequest $request
* @param Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
$response = $next($request);
$response->header('X-Header-One', 'XValue');
return $response;
}
}
и не забудьте зарегистрировать промежуточное программное обеспечение.
Http/Kernel.php
protected $middleware = [
// other middlewares
AppHttpMiddlewareSetResponseHeaders::class,
]
Особые указания: — Если вы используете концепцию CORS, то у вас есть cors.php файл в папке config. В моем случае я использую fruitcake/laravel-cors
package . поэтому вам нужно предоставить заголовок, иначе вы не получите значение.
cors.php
<?php
return [
/*
|--------------------------------------------------------------------------
| Cross-Origin Resource Sharing (CORS) Configuration
|--------------------------------------------------------------------------
|
| Here you may configure your settings for cross-origin resource sharing
| or "CORS". This determines what cross-origin operations may execute
| in web browsers. You are free to adjust these settings as needed.
|
| To learn more: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
|
*/
// other config
'exposed_headers' => ['X-Header-One'],
]