Come posso accedere ai parametri della stringa di query per le richieste ho manualmente spedito in Laravel 4?

Sto scrivendo una semplice API, e la costruzione di una semplice applicazione web in cima a questa API.

Perché voglio “consumare mie API” direttamente, ho Googlato e trovato questa risposta su StackOverflow che risponde alla mia domanda iniziale perfettamente: Consumando la mia Laravel API

Ora, questo funziona alla grande, io sono in grado di accedere al mio API facendo qualcosa come:

$request = Request::create('/api/cars/'.$id, 'GET');
$instance = json_decode(Route::dispatch($request)->getContent());

Questo è grande! Ma, le mie API permette anche di aggiungere un optional campi parametro la stringa di query GET per specificare gli attributi specifici che devono essere restituiti, come questo:

http://cars.com/api/cars/1?fields=id,color

Ora il modo in cui ho effettivamente gestire questa API è qualcosa lungo le linee di questo:

public function show(Car $car)
{
     if(Input::has('fields'))
     {
          //Here I do some logic and basically return only fields requested
          ....
     ...
 }

Suppongo che avrei potuto fare qualcosa di simile come ho fatto con il parametro della stringa di query-approccio meno prima, qualcosa di simile a questo:

$request = Request::create('/api/cars/' . $id . '?fields=id,color', 'GET');
$instance = json_decode(Route::dispatch($request)->getContent());

MA non sembra che sia così. Lunga storia breve, dopo passo il codice sembra che il Request oggetto viene creato correttamente (e correttamente tira fuori il campi parametro e assegna id,colore) e il Percorso sembra essere spediti OK, ma nel mio API controller non so come accedere al campo parametro. Utilizzando Input::get('fields') (che è quello che io uso per la “normale” richieste) non restituisce nulla, e sono abbastanza certo che sia perché la statica Input riferimento o di scoping per la domanda iniziale, il entrato, NON la nuova richiesta che ho inviato “manualmente” dal di dentro l’applicazione stessa.

Così, la mia domanda è davvero come dovrei fare questo? Sto facendo qualcosa di sbagliato? Idealmente mi piacerebbe evitare di fare qualcosa di brutto o di speciale a mio API controller, mi piacerebbe essere in grado di utilizzare Input::get per l’internamente inviato richieste e non è necessario effettuare un secondo controllo , etc.



3 Replies
  1. 18

    Si siano corrette, che utilizza Input è in realtà fa riferimento la corrente richiesta e non appena creata richiesta. Il vostro contributo sarà disponibile su richiesta istanza stessa che si crea con Request::create().

    Se si utilizza (come dovrebbe essere) Illuminate\Http\Request per creare un’istanza di richiesta quindi è possibile utilizzare $request->input('key') o $request->query('key') per ottenere i parametri della stringa di query.

    Ora, il problema qui è che si potrebbe non avere la tua Illuminate\Http\Request istanza disponibili in rotta. Una soluzione qui (in modo che è possibile continuare a utilizzare il Input facciata) è fisicamente sostituire l’ingresso della richiesta corrente, poi passare di nuovo.

    //Store the original input of the request and then replace the input with your request instances input.
    $originalInput = Request::input();
    
    Request::replace($request->input());
    
    //Dispatch your request instance with the router.
    $response = Route::dispatch($request);
    
    //Replace the input again with the original request input.
    Request::replace($originalInput);

    Dovrebbe funzionare (in teoria) si dovrebbe comunque essere in grado di utilizzare la vostra richiesta originale di alimentazione prima e dopo il vostro API interno viene fatta richiesta.

    • Una cosa da tenere a mente è la possibilità di una richiesta interna di chiamare un altro interno richiesta. Potrebbe essere necessario mantenere una pila di richieste e conservare l’originale ingresso, poi pop l’ultima richiesta dallo stack e sostituire l’input di conseguenza.
    • Qualche modo per collegare le intestazioni di richiesta (per l’invio di una api pubblica il tasto con la richiesta, per esempio)?
  2. 2

    Io ero di fronte a questo problema e grazie a Jason grandi risposte sono stato in grado di farlo funzionare.

    Volevo solo aggiungere che ho scoperto che il Percorso anche bisogno di essere sostituito. Altrimenti Route::currentRouteName() tornerà inviato percorso seguito nello script.

    Maggiori dettagli per questo può essere trovato sul mio post del blog.

    Ho anche fatto alcune prove per l’accatastamento problema e chiamata interna API metodi più volte da dentro l’altro con questo approccio. Ha funzionato proprio bene! Tutte le richieste e i percorsi sono stati impostati correttamente.

    • Grazie per le info! Sì, ho finito la creazione di un modello molto semplice che non fa nulla, ma fondamentalmente gestisce lo scambio di questi bit di dati automaticamente prima che, dopo I “eseguire” la richiesta. Grazie ancora per le info!
    • Questo url restituisce un 404
  3. 0

    Se si desidera richiamare un API interno e passaggio di parametri tramite un array (invece di stringa di query), si può fare come questo:

    $request = Request::create("/api/cars", "GET", array(
       "id" => $id,
       "fields" => array("id","color")
    ));
    $originalInput = Request::input();//backup original input
    Request::replace($request->input());
    $car = json_decode(Route::dispatch($request)->getContent());//invoke API
    Request::replace($originalInput);//restore orginal input

    Rif: Laravel : la chiamata di una propria API

Lascia un commento