2012-05-16 24 views
13

Sto provando a fare una richiesta HTTP da uno dei miei controller per contattare un altro URL, l'obiettivo è quello di contattare un altro URL e semplicemente stampare la risposta HTML nella mia pagina. ho provato:Symfony2: invia una richiesta HTTP



Il mio modello è semplicemente stampando il "nome" variabile.
Ora, quando lo faccio, non viene restituito nulla. Mi sembra che la richiesta non sia mai stata inviata, motivo per cui non viene restituito nulla.

La mia domanda è: come posso inviare la richiesta e ottenere il contenuto della risposta?

Grazie in anticipo.

risposta

18

MODIFICA: Ho creato un GremoBuzzBundle per il browser Buzz. È simile a SensioBuzzBundle ma ha alcune buone opzioni di configurazione.

Vorrei suggerire di utilizzare Buzz browser e l'iniezione delle dipendenze. Buzz è un wrapper su cURL o file_get_contents. Modifica i tuoi deps di file aggiungendo queste righe:

[Buzz] 
    git=https://github.com/kriswallsmith/Buzz.git 
    target=/buzz 

Quindi installare fornitori per scaricare in realtà la libreria:

php bin/vendors install 

Quindi aggiungere due servizi (src/YourCompany/YourBundle/Resources/config/services.yml):

# cURL client for Buzz 
buzz.client.curl: 
    class: Buzz\Client\Curl 
    public: false 
    calls: 
    - [setVerifyPeer, [false]] 

# Buzz browser 
buzz.browser: 
    class:  Buzz\Browser 
    arguments: ['@buzz.client.curl'] 

La prima il servizio è client (preferisco cURL su file_get_contents), quest'ultimo è il browser stesso.L'ultimo passo è quello di aggiungere una riga di codice nel caricatore automatico (app/autoload.php):

$loader->registerNamespaces(array(
    'Buzz' => __DIR__.'/../vendor/buzz/lib', 
)); 

allora si può ottenere il servizio e l'utente del browser nel controller codice:

$browser = $this->get('buzz.browser'); 
$response = $browser->get('http://www.google.com'); 
+1

Quale dipendenza dovrei modificare? È il routing.yml o qualcos'altro? Sono un po 'perso qui:/ Grazie comunque per la risposta, è davvero d'aiuto! –

+0

@GabrielTheron prima il file 'deps', quindi' src/Company/YourBundle/Resources/config/services.yml' (per i servizi) e 'app/autoload.php'. – gremo

+0

Viene visualizzato un errore quando sto provando a caricare la pagina. Dice "Non c'è un'estensione in grado di caricare la configurazione per" buzz.client.curl "" e "Cerca spazio dei nomi" buzz.client.curl ", non trovato nessuno". Qualche idea da dove viene? –

8

Perché non utilizzare arricciatura? Da PHP manual

+1

guarderò in esso, ma non lo considera necessario che scrivo in un file? –

+0

No, il risultato di curl è un valore stringa. – Acyra

15

Due problemi.

Prima di tutto, non è l'uso corretto di Symfony\Component\HttpFoundation\Request::create(), che è un inizializzatore statico/fabbrica di ordinamenti. Il tuo codice dovrebbe apparire come questo

$r = Request::create('http://www.google.com', 'GET'); 

Ora hai un oggetto Richiesta corretto. Tuttavia, questo è irrilevante che è il tuo secondo problema: non è così che l'oggetto di richiesta di Symfony è progettato per funzionare. Il suo scopo non è per esecuzione di richieste HTTP, è per che rappresenta come oggetti nel framework.

Per farla breve, non puoi farlo in quel modo. Forse puoi use cURL to scrape the page che vuoi?

+1

Grazie per la risposta. Sto cercando di usare cURL ma Symfony non lo trova. Dovrò chiarire perché ora ... –

+0

È accettato da Symfony2? – ElPiter

2

Apparentemente, è possibile utilizzare il client HTTP integrato di Symfony. Vedi: http://api.symfony.com/2.0/Symfony/Component/HttpKernel.html

Quanto segue è un codebase molto approssimativo, che utilizza Silex (costruito su Symfony). Semplicemente crea un'istanza di un nuovo client HTTP.

<?php 
require_once __DIR__ . '/silex/vendor/autoload.php'; 

use Symfony\Component\EventDispatcher\EventDispatcher; 
use Symfony\Component\HttpKernel\Controller\ControllerResolver; 
use Symfony\Component\HttpKernel\HttpKernel; 
use Symfony\Component\HttpKernel\Client; 
//use Symfony\Component\HttpFoundation\Response; 

$dispatcher = new EventDispatcher(); 
$resolver = new ControllerResolver(); 
$kernel = new HttpKernel($dispatcher, $resolver); 

$client = new Client($kernel); 
var_dump($client); 

?>

Hai anche un esempio dettagliato di un client HTTP per Symfony2 come parte della documentazione unit testing. Vedi: http://symfony.com/doc/current/book/testing.html

MA (modifica) questi client sono locali alla tua app. I concetti illustrati qui sono meglio implementati con il componente BrowserKit di Symfony2. Un browser senza testa all'interno di Symfony.

Meglio ancora, utilizzare Goutte per richieste a siti Web esterni. Vedi https://github.com/FriendsOfPHP/Goutte per i dettagli.

3

https://github.com/CircleOfNice/CiRestClientBundle

Nizza API per l'uso facile della biblioteca curl e restituisce una risposta di symfony al posto del risultato stringa

$restClient = $this->container->get('ci.restclient'); 

$restClient->get('http://www.someUrl.com'); 
$restClient->post('http://www.someUrl.com', 'somePayload'); 
$restClient->put('http://www.someUrl.com', 'somePayload'); 
$restClient->delete('http://www.someUrl.com'); 
$restClient->patch('http://www.someUrl.com', 'somePayload'); 

$restClient->head('http://www.someUrl.com'); 
$restClient->options('http://www.someUrl.com', 'somePayload'); 
$restClient->trace('http://www.someUrl.com'); 
$restClient->connect('http://www.someUrl.com'); 
6

ti consiglierei di utilizzare GuzzleHttp cliente - miglior cliente che conosco: http://docs.guzzlephp.org/en/latest/

C'è già bello bundle che integra nel progetto Symfony2: https://github.com/8p/GuzzleBundle

Poi dal controller è possibile chiamare:

$client = $this->get('guzzle.client'); 

// GET request with parameters 
$response = $client->get('http://httpbin.org/get', [ 
    'headers' => ['X-Foo-Header' => 'value'], 
    'query' => ['foo' => 'bar'] 
]); 
$code = $response->getStatusCode(); 
$body = $response->getBody(); 

Maggiori informazioni si possono trovare sul: http://docs.guzzlephp.org/en/latest/index.html

+0

Questo è davvero un ottimo pacchetto, l'ho usato per collegarlo a una API REST, funziona come un incantesimo! –

Problemi correlati