2013-05-16 8 views
9

मैं एक साधारण एपीआई लिख रहा हूं, और इस एपीआई के शीर्ष पर एक साधारण वेब एप्लिकेशन बना रहा हूं।मैं लैरवेल 4 में मैन्युअल रूप से प्रेषित अनुरोधों के लिए क्वेरी स्ट्रिंग पैरामीटर का उपयोग कैसे कर सकता हूं?

क्योंकि मैं "मेरे अपने एपीआई का उपभोग" करना चाहते हैं सीधे, मैं पहली बार Google पर और जो मेरे प्रारंभिक सवाल पूरी तरह से जवाब देती है StackOverflow पर इस जवाब मिला: अब Consuming my own Laravel API

, इस महान काम करता है, मैं उपयोग करने में सक्षम हूँ मेरी कुछ ऐसा करके एपीआई:

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

यह बहुत अच्छा है!

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

अब जिस तरह से मैं वास्तव में इस एपीआई में संभाल: लेकिन, मेरे API आपको एक वैकल्पिक क्षेत्रों इस जैसे विशिष्ट विशेषताओं है कि वापस आ जाना चाहिए, यह निर्दिष्ट करने के प्राप्त क्वेरी स्ट्रिंग पैरामीटर जोड़ने की अनुमति देता

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

मुझे लगता है के रूप में मैंने पहले, कुछ इस तरह क्वेरी स्ट्रिंग पैरामीटर कम दृष्टिकोण के साथ किया था मैं कुछ इसी तरह कर सकता है कि:

$request = Request::create('/api/cars/' . $id . '?fields=id,color', 'GET'); 
$instance = json_decode(Route::dispatch($request)->getContent()); 
इस की तर्ज पर कुछ है

लेकिन, ऐसा नहीं लगता है। लंबी कहानी संक्षेप में, कोड के माध्यम से कदम के बाद ऐसा लगता है कि Request वस्तु सही ढंग से बनाई गई है (और इसे सही ढंग क्षेत्रों पैरामीटर बाहर खींचती है और इसे करने के लिए आईडी, रंग प्रदान करती है), और मार्ग भेज दिया करने के लिए ठीक लगता है, लेकिन मेरे एपीआई नियंत्रक के भीतर ही मुझे नहीं पता कि फ़ील्ड पैरामीटर का उपयोग कैसे करें। Input::get('fields') का उपयोग करना (जो मैं "सामान्य" अनुरोधों के लिए उपयोग करता हूं) कुछ भी नहीं देता है, और मैं निश्चित रूप से निश्चित हूं क्योंकि स्थिर Input प्रारंभिक अनुरोध में संदर्भित या स्कॉइंग कर रहा है, नया अनुरोध मैंने "मैन्युअल रूप से" प्रेषित नहीं किया ऐप के भीतर ही।

तो, मेरा सवाल वास्तव में मुझे यह कैसे करना चाहिए? क्या मुझसे कुछ गलत हो रही है? आदर्श रूप में मैं अपने एपीआई नियंत्रक में कुछ भी बदसूरत या विशेष से बचना चाहता हूं, मैं इनपुट :: आंतरिक रूप से प्रेषित अनुरोधों के लिए प्राप्त करने के लिए सक्षम होना चाहता हूं और दूसरी जांच नहीं करना चाहता हूं, आदि

उत्तर

18

आप Input का उपयोग कर सही हैं, वास्तव में वर्तमान अनुरोध का संदर्भ दे रहे हैं न कि आपके नए बनाए गए अनुरोध पर। आपका इनपुट अनुरोध उदाहरण पर ही उपलब्ध होगा कि आप Request::create() के साथ तत्काल हैं।

यदि आप उपयोग कर रहे थे (के रूप में आप होना चाहिए) Illuminate\Http\Request आपके अनुरोध का दृष्टांत को तो आप $request->input('key') या $request->query('key') उपयोग कर सकते हैं क्वेरी स्ट्रिंग से मानकों को प्राप्त करने के लिए।

अब, समस्या यह है कि आपके पास मार्ग में आपके Illuminate\Http\Request उदाहरण उपलब्ध नहीं हो सकता है। यहां एक समाधान (ताकि आप Input मुखौटा का उपयोग जारी रख सकें) वर्तमान अनुरोध पर इनपुट को भौतिक रूप से प्रतिस्थापित करना है, फिर इसे वापस स्विच करें।

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

यह (सिद्धांत में) काम करना चाहिए और आप अभी भी पहले और बाद में अपने आंतरिक एपीआई अनुरोध किए जाने पर अपने मूल अनुरोध इनपुट का उपयोग करने में सक्षम होना चाहिए।

+0

एक बात ध्यान में रखना है यहां एक आंतरिक अनुरोध की संभावना है जो एक और आंतरिक अनुरोध बुला रही है। आपको अनुरोधों का ढेर रखने और मूल इनपुट को स्टोर करने की आवश्यकता हो सकती है, फिर स्टैक से अंतिम अनुरोध पॉप करें और तदनुसार इनपुट को प्रतिस्थापित करें। –

+0

हेडर को बनाए गए अनुरोध में संलग्न करने का कोई तरीका (उदाहरण के लिए अनुरोध के साथ सार्वजनिक एपीआई कुंजी भेजने के लिए)? जानकारी के लिए – whonoes

2

मैं भी इस मुद्दे का सामना कर रहा था और जेसन के महान उत्तरों के लिए धन्यवाद, मैं इसे काम करने में सक्षम था।

बस यह जोड़ना चाहता था कि मुझे पता चला कि मार्ग को भी बदलने की जरूरत है। अन्यथा Route::currentRouteName() बाद में स्क्रिप्ट में भेजे गए मार्ग को वापस कर देगा।

इसके लिए अधिक जानकारी मेरे blog post पर मिल सकती है।

मैंने स्टैकिंग मुद्दे के लिए कुछ परीक्षण भी किए और आंतरिक दृष्टिकोण को एक दूसरे के भीतर इस दृष्टिकोण के साथ बार-बार कहा। यह ठीक काम किया! सभी अनुरोध और मार्ग सही ढंग से सेट किए गए हैं।

+0

धन्यवाद! हाँ, मैंने एक बहुत ही सरल मॉडल तैयार किया है जो अनुरोध को "निष्पादित" करने के बाद, मूल रूप से पहले डेटा के इन बिट्स को स्वैप करने के लिए कुछ भी नहीं करता है। जानकारी के लिए फिर से धन्यवाद! –

+3

यह यूआरएल 404 – Tom

0

आप एक आंतरिक एपीआई आह्वान और एक सरणी (क्वेरी स्ट्रिंग के बजाय) के माध्यम से मानकों को पास करना चाहते हैं, तो आप इस तरह कर सकते हैं:

$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 

रेफरी: Laravel : calling your own API

+0

देता है अनुरोध :: प्रतिस्थापन मौजूद नहीं है – neoteknic

+0

@neoteknic कृपया इसे जांचें https://laravel.com/api/4.2/Illuminate/Http/Request.html – ThoQ

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

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