2012-10-25 14 views
18

Symfony2 का उपयोग करके, मुझे HTTPS के आधार पर बाहरी API तक पहुंचने की आवश्यकता है।Symfony2 - बाहरी अनुरोध कैसे करें

मैं बाहरी यूआरआई कैसे कॉल कर सकता हूं और इसके साथ "खेलने" के जवाब का प्रबंधन कैसे कर सकता हूं। उदाहरण के लिए, सफलता या विफलता संदेश प्रस्तुत करने के लिए?

मैं की तरह कुछ में सोच रहा हूँ (ध्यान दें कि performRequest एक पूरी तरह से आविष्कार विधि है):

$response = $this -> performRequest("www.someapi.com?param1=A&param2=B"); 

if ($response -> getError() == 0){ 
    // Do something good 
}else{ 
    // Do something too bad 
} 

मैं बज़ और अन्य ग्राहकों के बारे में पढ रहा हूं। लेकिन मुझे लगता है कि Symfony2 इसे अपने आप करने में सक्षम होना चाहिए।

+0

किस तरह का अनुरोध? बस HTTP प्राप्त करें? –

+0

कोई भी GET या POST जानना अच्छा होगा;) – ElPiter

उत्तर

25

मैं कर्ल उपयोग करने का सुझाव चाहते हैं:

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'www.someapi.com?param1=A&param2=B'); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/json')); // Assuming you're requesting JSON 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

$response = curl_exec($ch); 

// If using JSON... 
$data = json_decode($response); 

नोट: अपने वेब सर्वर पर php php5-curl पुस्तकालय स्थापित होना चाहिए।

एपीआई अनुरोध मानना ​​JSON डेटा लौटा रहा है, this page उपयोगी हो सकता है।

यह सिमफ़ोनी 2 के लिए विशिष्ट किसी भी कोड का उपयोग नहीं करता है। एक बंडल भी हो सकता है जो आपके लिए इस प्रक्रिया को सरल बना सकता है, लेकिन अगर मुझे इसके बारे में पता नहीं है।

+2

बस यह ध्यान रखना चाहते हैं कि उदाहरण में 'सामग्री-प्रकार' शीर्षलेख का गलत उपयोग शामिल है। जब अनुरोध में उपयोग किया जाता है, तो यह शरीर के प्रकार को इंगित करता है (जिसका उपयोग आपके उदाहरण में नहीं किया जाता है)। यह इंगित करने के लिए कि आप किस प्रकार सर्वर को वापस करना चाहते हैं, आप 'स्वीकार करें' शीर्षलेख का उपयोग करेंगे, उदा। 'स्वीकार करें: एप्लिकेशन/जेसन' हेडर –

24

सिम्फनी के पास इसके लिए अंतर्निहित सेवा नहीं है, लेकिन यह निर्भरता इंजेक्शन ढांचे का उपयोग करके अपना खुद का निर्माण करने का एक सही अवसर है। आप यहां क्या कर सकते हैं बाहरी कॉल का प्रबंधन करने के लिए एक सेवा लिखना है। चलिए सेवा "http" कहते हैं।

सबसे पहले, एक performRequest() विधि के साथ एक वर्ग लिखें:

namespace MyBundle\Service; 

class Http 
{  
    public function performRequest($siteUrl) 
    { 
     // Code to make the external request goes here 
     // ...probably using cUrl 
    } 
} 

app/config/config.yml में एक सेवा के रूप में यह रजिस्टर:

services: 
    http: 
     class: MyBundle\Service\Http 

अब आप अपने नियंत्रक एक सेवा "http" कहा जाता है की पहुंच है। Symfony "कंटेनर" में इस वर्ग का एक उदाहरण का प्रबंधन करता है, और आप $this->get("http") द्वारा ही पहुंच सकते हैं:

class MyController 
{ 
    $response = $this->get("http")->performRequest("www.something.com"); 

    ... 
} 
10

https://github.com/sensio/SensioBuzzBundle होने के लिए आप के लिए क्या देख रहे है।

यह HTTP अनुरोध करने के लिए क्रिस वाल्स्मिथ buzz लाइब्रेरी लागू करता है।

मैं तुम्हें GitHub पृष्ठ पर दस्तावेज़ पढ़ दूँगा उपयोग सुंदर बुनियादी है:

$buzz = $this->container->get('buzz'); 

$response = $buzz->get('http://google.com'); 

echo $response->getContent(); 
3

Symfony अपने स्वयं के आराम के ग्राहक नहीं है, लेकिन जैसा कि आप पहले ही उल्लेख किया बंडलों के एक जोड़े हैं। यह एक मेरे एक प्राथमिकता है:

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'); 

आप के माध्यम से

$response = $restclient->get($url); 

अनुरोध भेजने और एक Symfony प्रतिक्रिया ऑब्जेक्ट मिलता है।

$restClient = $this->container->get('ci.restclient'); 
if ($restClient->get('http://www.yourUrl.com')->getStatusCode !== 200) { 
    // no error 
} else { 
    // error 
} 
12

बेस्ट ग्राहक है कि मैं जानता हूँ कि है: तो फिर तुम जैसे के माध्यम से

$httpCode = $response-> getStatusCode(); 

स्थिति कोड प्राप्त कर सकते हैं अपने कोड लगेगा http://docs.guzzlephp.org/en/latest/

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

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

// send an asynchronous request. 
$request = $client->createRequest('GET', 'http://httpbin.org', ['future' => true]); 
// callback 
$client->send($request)->then(function ($response) { 
    echo 'I completed! ' . $response; 
}); 

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

// json response 
$response = $client->get('http://httpbin.org/get'); 
$json = $response->json(); 

// extra methods 
$response = $client->delete('http://httpbin.org/delete'); 
$response = $client->head('http://httpbin.org/get'); 
$response = $client->options('http://httpbin.org/get'); 
$response = $client->patch('http://httpbin.org/patch'); 
$response = $client->post('http://httpbin.org/post'); 
$response = $client->put('http://httpbin.org/put'); 

अधिक जानकारी मिल सकती है: http://docs.guzzlephp.org/en/latest/index.html

+0

बस ध्यान दें कि गुज़ल को PHP> = 5.5.0 की आवश्यकता है, जो कि थोड़ा अधिक हालिया है कि सिम्फनी आवश्यकताएं (v5.3.3) :) –

+0

GuzzleBundle github पृष्ठ से: आवश्यकताएँ PHP 5.4 या ऊपर लेकिन अब Guzzle lib को PHP> = 5.5.0 की आवश्यकता है। मुझे लगता है कि यह मेरे जवाब के बाद बदल गया है। –

+0

हाँ, लेकिन यह अद्यतित प्रतीत नहीं होता है, मैंने अभी गोज़लबंडल भंडार पर इसे सही करने के लिए पुल-अनुरोध का प्रस्ताव दिया है। मुझे लगता है कि Guzzle और GuzzleBundle दोनों के लेखक अंततः उत्तर के साथ आते हैं :) +1 वैसे भी, मुझे इस उत्कृष्ट पुस्तकालय को नहीं पता था, इसके बारे में बात करने के लिए धन्यवाद! –