2012-01-18 4 views
10

मैं एक वेबसाइट बनाना चाहता हूं और बाद की तारीख में मोबाइल ऐप बनाउंगा।ज़ेंड फ्रेमवर्क - एक एपीआई कैसे बनाएं जो बाहरी और आंतरिक दोनों के लिए सुलभ हो?

मैं वेब साइट और ऐप दोनों के समान स्तर के डेटा (यानी पुस्तकों की एक सूची) प्रदान करने में सक्षम होना चाहता हूं। मैं इसके लिए एक एपीआई का उपयोग करना चाहता हूं लेकिन ऑनलाइन किसी भी उदाहरण या सभ्य लेख खोजने के लिए संघर्ष कर रहा हूं।

तो मुझे लगता है कि मेरे सवाल है, अगर मैं HTTP पर एक मोबाइल एप्लिकेशन द्वारा एक JSON 'endpoint' सुलभ बनाने के लिए थी (उदा http://www.mysite.com/api/v1.0/json) कैसे एक ही कार्यक्षमता आंतरिक रूप से मेरी Zend आवेदन से उपयोग करते हैं?

+0

क्या तुम यहाँ का उपयोग कर खत्म किया? मैं अभी इसी तरह की स्थिति में हूं। –

उत्तर

4

(जाहिर है मैं नहीं चाहता कि डाटाबेस संपर्क 'मॉडल' चरणों डुप्लिकेट करना चाहते हैं) के बाद से Zend वास्तव में RESTful नहीं है, दुर्भाग्य से, आपका सर्वश्रेष्ठ दांव JSON-RPC है।

आप एक नियंत्रक में कर सकते हैं, या आप बस अपने index.php के अलावा एक ajax.php कर सकते हैं इस आदमी की तरह भूमि के ऊपर कम करने के लिए किया था here

असल में, तुम सब करने की जरूरत है यह है:

$server = new Zend_Json_Server(); 
$server->setClass('My_Class_With_Public_Methods'); 
// I've found that a lot of clients only support 2.0 
$server->getRequest()->setVersion("2.0"); 
if ('GET' == $_SERVER['REQUEST_METHOD']) { 
    // Indicate the URL endpoint, and the JSON-RPC version used: 
    $server->setTarget('/ajax.php') 
      ->setEnvelope(Zend_Json_Server_Smd::ENV_JSONRPC_2); 

    // Grab the SMD 
    $smd = $server->getServiceMap(); 

    // Return the SMD to the client 
    header('Content-Type: application/json'); 
    echo $smd; 
    return; 
} 

$server->handle(); 

तो अपने लेआउट में कहीं:

$server = new Zend_Json_Server(); 
$server->setClass('My_Class_With_Public_Methods'); 
$smd = $server->getServiceMap(); 
?> 
<script> 
$(document).ready(function() { 
    rpc = jQuery.Zend.jsonrpc({ 
     url : <?=json_encode($this->baseUrl('/ajax'))?> 
     , smd : <?=$smd?> 
     , async : true 
    }); 
}); 
</script> 
उदाहरण के लिए

, यहाँ उस वर्ग है:

class My_Class_With_Public_Methods { 
    /** 
     * Be sure to properly phpdoc your methods, 
     * the rpc clients like it when you do 
     * 
     * @param float $param1 
     * @param float $param2 
     * @return float 
     */ 
    public function someMethodInThatClass ($param1, $param2) { 
     return $param1 + $param2; 
    } 
} 

तो आप बस की तरह तरीकों कॉल कर सकते हैं ताकि जावास्क्रिप्ट में:

rpc.someMethodInThatClass(first_param, second_param, { 
    // if async = true when you setup rpc, 
    // then the last param is an object w/ callbacks 
    'success' : function(data) { 

    } 
    'error' : function(data) { 

    } 
}); 

वहाँ नहीं एंड्रॉयड/iPhone के लिए अच्छी तरह से ज्ञात JSON-RPC पुस्तकालयों का एक बहुत कर रहे हैं - लेकिन मैं ने पाया है कि यह साथ काम करता है Android के लिए Zend_Json_Server:

http://software.dzhuvinov.com/json-rpc-2.0-base.html

और इस iPhone के लिए काम करता है:

http://www.dizzey.com/development/ios/calling-json-rpc-webservice-in-ios/

यहां से, जाहिर है, आप My_Class_With_Public_Methods का उपयोग उसी तरह कर सकते हैं जैसे जावास्क्रिप्ट/आपका मोबाइल ऐप करता है।

+0

मैं 'पुस्तकें' नियंत्रक की 'अनुक्रमणिका' कार्रवाई के भीतर से कुछ MethodInThatClass विधि को कैसे कॉल करूं - उदाहरण के लिए? – Sjwdavies

+1

हे, इसे कॉल करके? '$ myobj = नया My_Class_With_Public_Methods(); $ myobj-> someMethodInThatClass(); ' –

+0

धन्यवाद स्टीफन - हालांकि यह 'फैट कंट्रोलर' के साथ समाप्त नहीं होगा, उदाहरण के लिए 'My_Class_With_Public_Methods' बड़े पैमाने पर हो सकता है? मैं सोच रहा था कि मुझे इस नियंत्रक के माध्यम से डेटा के लिए डेटाबेस में प्रत्येक आंतरिक अनुरोध को निर्देशित करने की आवश्यकता होगी? या क्या मैं उन्हें सामान्य तरीके से निर्देशित करता हूं, फिर 'My_Class_With_Public_Methods' फ़ाइल लिखकर डेटा पुनर्प्राप्ति प्रक्रिया को 'खोलें' और चेरी डेटाबेस इंटरैक्शन को चुनकर मैं 'सार्वजनिक रूप से' पेश करना चाहता हूं? – Sjwdavies

1

मेरे दृष्टिकोण से, यह ज़ेंड फ्रेमवर्क प्रश्न से अधिक आर्किटेक्चर से संबंधित प्रश्न है।

जो आप खोज रहे हैं वह सेवा-ओरिएंटेड आर्किटेक्चर (एसओए) है।

एसओए के पीछे आधार सरल है, एक एकल एपीआई बनाएं, और सबकुछ इसके माध्यम से हो, चाहे वह आंतरिक रूप से या बाहरी रूप से हो। एसओए का एक लोकप्रिय समर्थक अमेज़ॅन है।

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

class HelloInstance { 
    public $hello; 
    public function __construct($hello) { $this->hello = $hello; } 
} 

class Hello { 
    public function getHello() { return new HelloInstance('world'); } 
} 

class FooInstance { 
    public $foo; 
    public function __construct($foo) { $this->foo = $foo; } 
} 

class Foo { 
    public function getFoo($value) { return new FooInstance($value); } 
} 

आप उन्हें आंतरिक रूप से उपयोग करना चाहते हैं, तो आप ऐसा चाहते हैं::

उदाहरण के अनुसार, आप इन है

$hello = new Hello; 
$helloInst = $hello->getHello(); 

$foo = new Foo; 
$fooInst = $foo->getFoo('bar'); 

अब तुम सिर्फ बाहर से इस एपीआई का पर्दाफाश करने के लिए एक प्रवेश द्वार की जरूरत है। यहाँ एक बहुत ही बुनियादी उदाहरण है:

include_once 'my_classes.php'; 

$class = $_GET['class']; 
$method = $_GET['method']; 

$obj = new $class; 
$return = $obj->$method(isset($_GET['value']) ? $_GET['value'] : null); 

header('Content-Type: application/json'); 
echo json_encode($return); 

आप एक ही दो कॉल मैंने पहले प्रदर्शन किया कर सकते हैं, और एक REST कॉल का उपयोग कर एक ही परिणाम मिलता है,:

http://my_server/my_gateway.php?class=Hello&method=getHello 
http://my_server/my_gateway.php?class=Foo&method=getFoo&value=bar 
+1

यह एक वास्तुशिल्प से एक अच्छा जवाब है दृष्टिकोण, लेकिन 1. आरईएसटी के रूप में आप जो वर्णन करते हैं वह वास्तव में सही नहीं है, यह एसओएपी के समान है। एसओएपी सभी ठीक और अच्छा है, लेकिन यह निश्चित रूप से * नहीं * रीस्टफुल है, और 2. ज़ेंड में एसओए बनाया गया है - यह आरईएसटी सर्वर बकवास है और रीस्टफुल नहीं है, लेकिन इसकी जेएसओएन/एक्सएमएल आरपीसी कार्यक्षमता सही है। आपका दृष्टिकोण बिल्कुल ठीक है - लेकिन यह किसी भी ज़ेंड के आंतरिक एसओए का लाभ नहीं लेता है। यह जरूरी नहीं है कि एक बुरी चीज है, मुझे लगता है, लेकिन सिर्फ सोचा कि मैं इसे इंगित करूंगा। –

+0

बस उत्सुक, यह कैसे सही नहीं है? – drew010

+0

@ स्टीफनजे। फुहरी: सिर्फ इसलिए कि आप दूरस्थ प्रक्रिया कॉल करते हैं इसका मतलब यह नहीं है कि यह रीस्टफुल नहीं हो सकता है। ओह और मैंने कभी नहीं कहा था कि उपर्युक्त रास्ते से अस्थिर था। और यह बिल्कुल SOAP की तरह नहीं है। – netcoder

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