Я реализую API с использованием инфраструктуры Lumen, и мне тяжело с одним неприятным маршрутом. Все мои другие маршруты работают отлично, но этот маршрут продолжает выдавать ошибку 405, даже если используемый метод разрешен. Хуже всего то, что он не всегда выдает эту ошибку, но это делает для 90% моих запросов.
Упрощенное определение маршрута (на самом деле оно вложено в несколько групп, которые вы можете увидеть ниже):
$router->post('v1/monitoring/executions/{execution_id}/calls/{call_id}/events', 'EventController@createEvent');
Однако всякий раз, когда я публикую что-то, я получаю 405 Method not Allowed
исключение. Проверка журналов Apache действительно показывает, что был получен запрос POST:
[08 / Nov / 2017: 08: 05: 32 +0000] «POST / v1 / мониторинг / казни / 1 / звонки / 1 / события HTTP / 1.1» 405 49 «-» «PostmanRuntime / 6.4.1»
Полный путь к этому маршруту в моем файле маршрутизации:
$router->group(['prefix' => 'v1'], function () use ($router) {
$router->group(['prefix' => 'monitoring/executions', 'namespace' => 'Monitoring', 'middleware' => 'integration_token'], function () use ($router) {
// POST and PUT requests for executions
$router->group(['prefix' => '{execution_id}/calls'], function () use ($router) {
// POST and PUT routes for calls
$router->group(['prefix' => '{call_id}/events'], function () use ($router) {
$router->post('/', 'EventController@createEvent');
$router->put('{event_id}', 'Eventcontroller@updateEvent');
});
});
});
});
integration_token
middleware также не возвращает ошибок 405:
public function handle($request, Closure $next)
{
$headers = $request->headers->all();
if (!isset($headers['x-integration-token'])) {
abort(400, "X-Integration-Token header is required");
}
$token = $headers['x-integration-token'][0];
$pattern = '/^[A-Za-z0-9]{32}$/';
$pattern_matches = preg_match($pattern, $token);
if (!$pattern_matches) {
abort(400, "Malformed X-Integration-Token header");
}
try {
$integration = Integration::where(['access_token' => $token])->firstOrFail();
$integration_id = $integration->id;
$request->attributes->set('integration_id', $integration_id);
} catch (\Exception $e) {
abort(403, "Incorrect access token: $token");
}return $next($request);
}
Также не контроллер:
Пространство имен App \ Http \ Controllers \ Monitoring;
use App\Call;
use App\Event;
use App\Execution;
use App\Http\Controllers\Controller;
use App\Libraries\Helpers;
use Illuminate\Http\Request;
class EventController extends Controller
{
public function createEvent(Request $request, $execution_id, $call_id) {
$input = $request->all();
$input['execution_id'] = $execution_id;
$input['call_id'] = $call_id;
$input['time_string'] = Helpers::getTimestampTz();
$input['time'] = Helpers::getMicroTime();
Helpers::validateRequiredFields(Event::class, $input);
// Verify execution and call exist
Execution::findOrFail($execution_id);
Call::findOrFail($call_id);
$event = Event::create($input);
return response()->json($event)->setStatusCode(201);
}
// Other methods
}
Я, честно говоря, понятия не имею, что может быть причиной этой проблемы, но это сводит меня с ума! Любая помощь в решении этой проблемы будет очень признательна.
Задача ещё не решена.
Других решений пока нет …