2012-05-16 22 views
13

भेज मैं अपने नियंत्रक अन्य यूआरएल से संपर्क करने से एक से एक HTTP अनुरोध बनाने के लिए कोशिश कर रहा हूँ, लक्ष्य अन्य यूआरएल संपर्क करने के लिए, और बस मेरा पेज में HTML जवाब मुद्रित करने के लिए जा रहा है। मैंने कोशिश की:Symfony2: एक HTTP अनुरोध



मेरे टेम्पलेट बस चर "नाम" प्रिंट कर रहा है।
अब जब मैं ऐसा कुछ भी नहीं दिया जाता है। ऐसा लगता है कि अनुरोध कभी नहीं भेजा जाता है, यही कारण है कि कुछ भी वापस नहीं किया जाता है।

मेरा प्रश्न है: कैसे मैं अनुरोध भेजने और प्रतिक्रिया की सामग्री मिलता है?

अग्रिम धन्यवाद।

उत्तर

18

EDIT: मैंने बज़ ब्राउज़र के लिए GremoBuzzBundle बनाया। यह SensioBuzzBundle जैसा है लेकिन इसमें कुछ अच्छे कॉन्फ़िगरेशन विकल्प हैं।

मैं Buzz browser और निर्भरता इंजेक्शन का उपयोग करने का सुझाव देते हैं। बज़ curl या file_get_contents के चारों ओर एक रैपर है। अपने deps फ़ाइल जोड़ने इन पंक्तियों को संपादित करें:

# 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'] 

पहले:

php bin/vendors install 

फिर दो सेवाओं (src/YourCompany/YourBundle/Resources/config/services.yml) जोड़ें:

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

तो वास्तव में पुस्तकालय डाउनलोड करने के लिए विक्रेताओं स्थापित सेवा क्लाइंट है (मैं file_get_contents पर curl पसंद करते हैं), बाद वाला ब्राउज़र ही है।

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

मुझे किस निर्भरता को संपादित करना है? क्या यह routing.yml या कुछ और है? मैं यहां थोड़ा खो गया हूं:/ वैसे भी उत्तर के लिए धन्यवाद, यह वास्तव में सहायक है! –

+0

पहले 'deps' फ़ाइल @GabrielTheron, तो' src/कंपनी/YourBundle/संसाधन/config/services.yml' (सेवाओं के लिए) और 'एप्लिकेशन/autoload.php'। – gremo

+0

जब मैं पृष्ठ लोड करने का प्रयास कर रहा हूं तो मुझे एक त्रुटि मिलती है। यह कहता है "" buzz.client.curl "" और "नेमस्पेस के लिए देखे गए" buzz.client.curl "के लिए कॉन्फ़िगरेशन लोड करने में कोई एक्सटेंशन नहीं है, कोई भी नहीं मिला"। कोई विचार जहां से आता है? –

8

क्यों नहीं कर्ल का उपयोग करें? PHP manual

$ch = curl_init("http://www.example.com/"); 

curl_setopt($ch, CURLOPT_FILE, $fp); 
curl_setopt($ch, CURLOPT_HEADER, 0); 

result = curl_exec($ch); 
curl_close($ch); 
+1

मैं इस पर गौर करेंगे, लेकिन यह की आवश्यकता नहीं है कि मैं एक फ़ाइल में लिखने? –

+0

नहीं, कर्ल का परिणाम एक स्ट्रिंग मान है। – Acyra

15

दो समस्याएं।

सबसे पहले, कि Symfony\Component\HttpFoundation\Request::create() का समुचित उपयोग है, जो एक स्थिर प्रारंभकर्ता/प्रकार के कारखाने है नहीं है। आपका कोड इस

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

जैसा दिखता है अब आपके पास उचित अनुरोध ऑब्जेक्ट है। हालांकि, यह अप्रासंगिक है जो आपकी दूसरी समस्या है: ऐसा नहीं है कि सिम्फनी के अनुरोध ऑब्जेक्ट को काम करने के लिए डिज़ाइन किया गया है। इसका उद्देश्य उन्हें ढांचे में वस्तुओं के रूप में प्रतिनिधित्व करने के लिए HTTP अनुरोध, अपने को क्रियान्वित करने के लिए नहीं है।

लंबी कहानी संक्षेप में, आप इसे उस तरह से नहीं कर सकते। शायद आप use cURL to scrape the page कर सकते हैं?

+1

आपके उत्तर के लिए धन्यवाद। मैं curl का उपयोग करने की कोशिश कर रहा हूँ लेकिन सिम्फनी इसे नहीं ढूंढ रहा है। मुझे अब हल करना होगा क्यों ... –

+0

क्या यह Symfony2 द्वारा स्वीकार किया जाता है? – ElPiter

2

:

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

तो फिर तुम सेवा और उपयोगकर्ता ब्राउज़र अपने नियंत्रक में कोड प्राप्त कर सकते हैं: अंतिम चरण autoloader (app/autoload.php) में कोड की एक पंक्ति जोड़ने के लिए है जाहिर है, आप सिम्फनी के अंतर्निहित HTTP क्लाइंट का उपयोग कर सकते हैं। देखें: http://api.symfony.com/2.0/Symfony/Component/HttpKernel.html

सिलेक्स (सिम्फनी के शीर्ष पर निर्मित) का उपयोग करके निम्नलिखित एक बहुत ही कच्चे कोडबेस है। यह बस एक नए 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); 

?>

तुम भी इकाई परीक्षण प्रलेखन के हिस्से के रूप Symfony2 के लिए एक HTTP ग्राहक की एक विस्तृत उदाहरण है। देखें: http://symfony.com/doc/current/book/testing.html

लेकिन (संपादित करें) ये ग्राहक आपके ऐप के लिए स्थानीय हैं। सिम्फनी 2 के ब्राउज़रकिट घटक के साथ यहां दी गई अवधारणाओं को बेहतर ढंग से कार्यान्वित किया गया है। सिम्फनी के भीतर एक हेडलेस ब्राउज़र।

, यहां तक ​​कि बेहतर बाहरी वेबसाइटों के अनुरोध के लिए Goutte का उपयोग करें। विवरण के लिए https://github.com/FriendsOfPHP/Goutte देखें।

3

https://github.com/CircleOfNice/CiRestClientBundle

कर्ल पुस्तकालय के आसान उपयोग के लिए अच्छा एपीआई और यह एक स्ट्रिंग परिणाम

$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

मैं GuzzleHttp क्लाइंट के प्रयोग की सलाह देंगे के बजाय एक सिम्फोनी प्रतिक्रिया लौटाता - सबसे अच्छा ग्राहक है कि मैं जानता हूँ कि: http://docs.guzzlephp.org/en/latest/

वहां पहले से ही अच्छा बंडल है कि यह Symfony2 परियोजना में एकीकृत करता है: https://github.com/8p/GuzzleBundle

फिर अपने नियंत्रक से आपको कॉल कर सकते हैं:

$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(); 

अधिक जानकारी पर पाया जा सकता: http://docs.guzzlephp.org/en/latest/index.html

+0

यह वास्तव में एक बहुत अच्छा बंडल है, मैं इसे एक आरईएसटी एपीआई पर प्लग करने के लिए उपयोग कर रहा हूं, एक आकर्षण की तरह काम करता है! –

संबंधित मुद्दे