Laravel Верните контроль звонящему и продолжайте работать - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть два API, которые должны общаться друг с другом. Первый отправляет вторые файлы, которые должны быть обработаны. Однако время обработки неизвестно и может занять некоторое время.

Решение, о котором я подумал, заключается в следующем: когда обработка готова, второй API отправляет запрос первому с результатом. Проблема в том, что все это время первый запрос API ожидает ответа, потому что я еще не вернул элемент управления, что приводит к тупику.

У меня вопрос, как я могу вернуть результат первому API (что-то вроде полученного: true / false) как можно скорее, продолжить обработку и отправить результат (из обработки) в отдельном запросе.

Я использую Laravel 5.2 и Guzzle для запросов.

1 Ответ

0 голосов
/ 17 сентября 2018

Во-первых, это подтверждение концепции, а не рабочий код, и может потребовать некоторой доработки.

Из вашего первого API вы должны позвонить второму API, чтобы он что-то обработал.

Второй API должен затем ответить, как только он получил данные (не обработанные один раз).

Первый API

use GuzzleHttp\Client;

public function callApiTwo(Request $request)
{
    $client = new Client()

    $data = [];


    $res = $client->post('http://apitwoexample.com', [
        'body' =>  json_encode($data)
    ]);

    if ($res->getStatus() !== 203) {
        // error in processing
    }

    $resData = json_decode($res->getBody()->getContents());
    $token   = $resData['token'];

    return response()->json([
        'success' => 'Data is being processed',
        'token'   => $token
    ], 202);
}

Второй API

Затем второй API должен получить данные (ссылки на файлы, изображения, данные и т. Д.) И отправить задание (как упомянуто в упомянутом @jonathon).

Затем вам потребуется какой-то идентификатор для process /job / record.A id или token в некотором роде.Он возвращается к первому API в своем ответе.

public function executeProcess(Request $request)
{
    // Perform logic 
    $token = str_rand(10);

    Job::dispatch('/job/which/needs/time/to/run', [
        'data'  => $data,
        'token' => $token
    ]);

    return response()->json([
        'success' => 'Data is being processed',
        'token'   => $token
    ], 202);
}

public function progressStatus(Request $request)
{
    $model = Model::whereToken($request->token)->first();

    return response()->json([
        'status' => $model->status
    ], 200);
}

Вы заметите метод progressStatus, который я привел в качестве примера для проверки процессов process / job / record по некоторому идентификатору.

Начиная с первого API, его можно запустить с помощью команды artisan или job, который помещается в очередь для повторного запуска (после задержки) в зависимости от того, подтвердил ли второй API процессзавершено.

Дайте мне знать, если это требует большей ясности.

...