2013-02-02 40 views
5

मैं केकेपीएचपी के साथ जेएसओएनपी सामग्री की सेवा करना चाहता हूं और सोच रहा था कि ऐसा करने का सही तरीका क्या है।केकेपीएचपी के साथ JSONP की सेवा करने का उचित तरीका क्या है?

वर्तमान में मैं इस केकेपीएचपी guide का पालन करके स्वचालित रूप से JSON सामग्री की सेवा करने में सक्षम हूं।

उत्तर

4

मैं के रूप में अभी तक नहीं कैसे करने के लिए सही ढंग से वापसी JSONP CakePHP 2 का उपयोग की एक पूरी उदाहरण मिल गया है, तो मैं यह लिखने के लिए नीचे जा रहा हूँ। ओपी सही तरीके से पूछता है, लेकिन उसका जवाब अब 2.4 में उपलब्ध देशी विकल्पों का उपयोग नहीं करता है। उपयोग JSON (documentation)

  1. अपने दृश्य सेट अप स्वीकार करने के लिए /:

    • अपने routes.php कॉन्फ़िग फ़ाइल को Router::parseExtensions('json'); जोड़े 2.4+ के लिए, यह सही तरीका है, सीधे अपनी दस्तावेज़ीकरण से। इस केक बताता
    • केक यहाँ स्मार्ट हो जाता है का उपयोग करने की .json यूआरआई एक्सटेंशन
    • नियंत्रक आप जा रहे हैं घटकों की सूची को RequestHandler जोड़े स्वीकार करने के लिए, और अब आप सामान्य अनुरोध और JSON/XML आदि के लिए अलग अलग दृश्य प्रस्तुत करता है अनुरोध, जो आपको आवश्यकतानुसार उन परिणामों को वापस करने में लचीलापन की अनुमति देता है।
      • यूआरआई /controller/action.json (जो दिखाई प्रयोग करेंगे /view/controller/json/action.ctp में)
      • का उपयोग कर यूआरआई /controller/action (जो दिखाई प्रयोग करेंगे /view/controller/action.ctp में), या
      • का उपयोग कर: अब आप द्वारा अपने नियंत्रक में एक कार्रवाई का उपयोग करने के लिए सक्षम होना चाहिए
  2. आप उन विचारों को परिभाषित नहीं करना चाहती यदि IE आप किसी भी आगे की प्रक्रिया करने की ज़रूरत नहीं है, और प्रतिक्रिया जाने के लिए तैयार है, तो आप CakePHP बता विचारों पर ध्यान न दें और वापस जाने के लिए कर सकते हैं तुरंत _serialize का उपयोग कर डेटा। _serialize का उपयोग करके केक को सही प्रारूप (एक्सएमएल, जेएसओएन इत्यादि) में अपनी प्रतिक्रिया को प्रारूपित करने के लिए बताएगा, हेडर सेट करें और आपको कुछ और करने की आवश्यकता के बिना इसे वापस लौटाएं (documentation)। इस जादू का लाभ उठाने के लिए:

    • वे चर सेट करें जिन्हें आप वापस देखना चाहते हैं क्योंकि आप एक व्यू वेरिएबल i.e.$this->set('post', $post);
    • बताएँ केक एक्सएमएल, JSON आदि में क्रमानुसार करने $this->set('_serialize', array('posts')); बुला, जहां प्राचल तुम सिर्फ पिछली लाइन

में सेट दृश्य चर रहा है द्वारा और बस हो गया। केक द्वारा सभी शीर्षकों और प्रतिक्रियाओं को लिया जाएगा। यह सिर्फ JSONP (documentation) छोड़ देता है काम कर पाने के:

  1. केक को बताएँ $this->set('_jsonp', true); की स्थापना द्वारा अनुरोध एक JSONP अनुरोध पर विचार करने, और केक कॉलबैक फ़ंक्शन नाम पैरामीटर को खोजने के लिए जाना जाएगा, और उस कॉलबैक फ़ंक्शन नाम के साथ काम करने के लिए प्रतिक्रिया को प्रारूपित करें। सचमुच, यह निर्धारित करना कि एक पैरामीटर आपके लिए सभी काम करता है।

    public function getTheFirstPost() 
    
        $post = $this->Post->find('first'); 
    
        $this->set(array(
         'post' => $post,     <-- Set the post in the view 
         '_serialize' => array('post'), <-- Tell cake to use that post 
         '_jsonp' => true     <-- And wrap it in the callback function 
        ) 
    ); 
    

    और जे एस:

तो, आप .json अनुरोधों को स्वीकार करने का केक सेट कर लेते हैं यह मानते हुए कि, इस अपने ठेठ कार्रवाई JSONP के साथ काम करने जैसा दिखाई दे सकता है

$.ajax({ 
    url: "/controller/get-the-first-post.json", 
    context: document.body, 
    dataType: 'jsonp' 
}).done(function (data) { 
    console.log(data); 
}); 
5

ठीक है, मुझे इस site पर एक समाधान मिला। मूल रूप से आप बाद के बाद फ़िल्टर विधि को ओवरराइड करते हैं:

public function afterFilter() { 
    parent::afterFilter(); 

    if (empty($this->request->query['callback']) || $this->response->type() != 'application/json') { 
     return; 
    } 

    // jsonp response 
    App::uses('Sanitize', 'Utility'); 
    $callbackFuncName = Sanitize::clean($this->request->query['callback']); 
    $out = $this->response->body(); 
    $out = sprintf("%s(%s)", $callbackFuncName, $out); 
    $this->response->body($out); 
} 

मुझे आशा है कि यह किसी और की भी मदद करेगी।

+0

केक 2.4+ के रूप में, यह JSONP अनुरोधों को संभालने का सही या इष्टतम तरीका नहीं है। मैंने अपने दस्तावेज [नीचे] (http://stackoverflow.com/a/28963737/366529) के अनुसार इसे कैसे किया जाए इसके निर्देशों को लिखा है। – dKen

0

केकपीएचपी 2.4 और उसके बाद के लिए, आप इसके बजाय ऐसा कर सकते हैं।

http://book.cakephp.org/2.0/en/views/json-and-xml-views.html#jsonp-response

तो आप बस लिख सकते हैं:

$this->set('_jsonp', true); 

प्रासंगिक कार्रवाई में।

या आप बस लिख सकते हैं:

/** 
* 
* beforeRender method 
* 
* @return void 
*/ 
    public function beforeRender() { 
     parent::beforeRender(); 
     $this->set('_jsonp', true); 
    }