2017-01-24 19 views
9

मैं एक न्यूनतम (उदाहरण) है बाकी अंत बिंदु test/people.cfc किए बिना RestSetResponse के उत्पादन प्राप्त करें:HTTP अनुरोध

component 
    restpath = "test/people/" 
    rest  = true 
{ 
    remote void function create(
    required string first_name restargsource = "Form", 
    required string last_name restargsource = "Form" 
) 
    httpmethod = "POST" 
    restpath = "" 
    produces = "application/json" 
    { 
    // Simulate adding person to database. 
    ArrayAppend(
     Application.people, 
     { "first_name" = first_name, "last_name" = last_name } 
    ); 

    // Simulate getting people from database. 
    var people = Application.people; 

    restSetResponse({ 
     "status" = 201, 
     "content" = SerializeJSON(people) 
    }); 
    } 
} 

रूप here ध्यान दिया और ColdFusion documentation में:

नोट: ColdFusion ध्यान न दी फ़ंक्शन का रिटर्न वैल्यू और RestSetResponse() फ़ंक्शन का उपयोग करके प्रतिक्रिया सेट का उपयोग करता है।

तो void फ़ंक्शन के लिए वापसी प्रकार आरईएसटी फ़ंक्शन के लिए सही प्रतीत होता है।

अब, मैं जानता हूँ कि मैं इसे का उपयोग एक CFM पेज से कॉल कर सकते हैं:

httpService = new http(method = "POST", url = "https://localhost/rest/test/people"); 
httpService.addParam(name = "first_name", type = "formfield", value = "Alice"); 
httpService.addParam(name = "last_name", type = "formfield", value = "Adams"); 
result = httpService.send().getPrefix(); 

हालांकि, मैं एक HTTP अनुरोध के बिना समारोह कॉल करना चाहते हैं।

सबसे पहले, आरईएसटी सीएफसी आरईएसटी निर्देशिका के भीतर से सुलभ नहीं दिखते हैं। इसे कोल्डफ्यूजन व्यवस्थापक पैनल में रीस्ट सेवा के रूट पथ पर मैपिंग बनाकर हल किया जा सकता है।

मैं तो कर सकते हैं:

<cfscript> 
Application.people = []; 

people = new restmapping.test.People(); 

people.create("Alice", "Adams"); 

WriteDump(application.people); 
</cfscript> 

इस समारोह सीधे कॉल करता है और उत्पादन से पता चलता है कि यह व्यक्ति जोड़ा गया है। हालांकि, आरईएसटी समारोह से प्रतिक्रिया एक साथ में गायब हो गई है। क्या किसी को पता है कि प्रतिक्रिया के HTTP स्थिति कोड और सामग्री को पुनर्प्राप्त करना संभव है (न्यूनतम - अधिमानतः सभी HTTP शीर्षलेख)?

अपडेट - एकीकरण परीक्षण परिदृश्य:

यह वह जगह है एक यूज-केस (कई की) है, जहां एक HTTP अनुरोध के माध्यम से बाकी अंत बिंदु बुला दस्तक-ऑन प्रभाव है कि अंत लागू द्वारा कम किया जा सकता है एक घटक की विधि के रूप में सीधे बिंदु।

<cfscript> 
// Create an instance of the REST end-point component without 
// calling it via HTTP request. 
endPoint = new restfiles.test.TestRESTEndPoint(); 

transaction { 
    try { 
    // Call a method on the end-point without making a HTTP request. 
    endPoint.addValueToDatabase(1, 'abcd'); 
    assert(getRESTStatusCode(), 201); 
    assert(getRESTResponseText(), '{"id":1,"value":"abcd"}'); 
    // Call another method on the end-point without making a HTTP request. 
    endPoint.updateValueInDatabase(1, 'dcba'); 
    assert(getRESTStatusCode(), 200); 
    assert(getRESTResponseText(), '{"id":1,"value":"dcba"}'); 
    // Call a third method on the end-point without making a HTTP request. 
    endPoint.deleteValueInDatabase(1); 
    assert(getRESTStatusCode(), 204); 
    assert(getRESTResponseText(), ''); 
    } 
    catch (any e) 
    { 
    WriteDump(e); 
    } 
    finally 
    { 
    transaction action="rollback"; 
    } 
} 
</cfscript> 

एक HTTP अनुरोध के माध्यम से प्रत्येक बाकी समारोह कॉलिंग प्रत्येक अनुरोध के बाद डेटाबेस के लिए डेटा के लिए प्रतिबद्ध होगा - परीक्षण जहां डाटा बहुत जटिल प्राप्त कर सकते हैं किया गया है और अक्सर करने के लिए डेटाबेस फ़्लैश बैक करने की जरूरत में परिणाम के बीच की सफाई एक पिछला राज्य (जिसके परिणामस्वरूप एकीकरण परीक्षण फ्लैशबैक के दौरान किसी भी अन्य परीक्षण और अनुपलब्धता की अवधि के साथ समानांतर में चलाने में असमर्थ हैं)। बहुत से परमाणु HTTP अनुरोध किए बिना आरईएसटी एंड-पॉइंट्स को कॉल करने में सक्षम होने के बजाय और उन्हें एक ही लेनदेन में बंडल करें जिसे वापस घुमाया जा सकता है, इसका मतलब है कि परीक्षण एक उपयोगकर्ता के सत्र में किया जा सकता है।

तो, मैं HTTP स्थिति कोड और प्रतिक्रिया पाठ कैसे प्राप्त कर सकता हूं जो RestSetResponse() द्वारा सेट किया गया है जब मैं आरईएसटी घटक का उदाहरण बनाता हूं और सीधे आरईएसटी पथ का प्रतिनिधित्व करने वाले फ़ंक्शन को आमंत्रित करता हूं (HTTP अनुरोध का उपयोग किए बिना)?

+0

तो तुम एक HTTP अनुरोध कर के बिना, HTTP प्रतिसाद प्राप्त करना चाहते हैं? ऐसा नहीं लगता कि यह संभव है –

+0

@XavierL। नहीं, मैं प्रति HTTP प्रतिक्रिया नहीं चाहता - मैं 'RestSetResponse() 'फ़ंक्शन को कॉल करने के परिणाम/दुष्प्रभाव देखना चाहता हूं। उदाहरण के लिए, एक सीएफएम पेज में मैं 'GetPageContext() प्राप्त कर सकता हूं। GetCFOutput()। GetBuffer()। ToString() 'पृष्ठ के लिए वर्तमान (unflushed) आउटपुट प्राप्त करने के लिए, लेकिन मुझे कहां के समकक्ष समाधान के बारे में पता नहीं है आउटपुट 'RestSetResponse() 'के लिए निवास करेगा। – MT0

+0

मुझे अभी भी यकीन नहीं है कि आप क्या देख रहे हैं। यदि आप _you_ से 'RestSetResponse()' विधि का उपयोग कर रहे हैं, तो आउटपुट प्रतिक्रिया को सेट करने से पहले जो कुछ भी सेट किया गया हो, ओवरराइड कर रहा है। सही? –

उत्तर

0

@ MT0,

समाधान * शामिल होगी कुछ ही कदम:

  1. बदलें remote void function createremote struct function create
  2. में जोड़े var result = {"status" = 201, "content" = SerializeJSON(people)}
  3. बदलें अपनी restSetResponse(..) कॉल restSetResponse(result)
  4. -return result;
  5. जोड़े

* समाधान वर्तमान में काम नहीं करेगा, बी/सी कोल्डफ्यूजन टिकट CF-3546046 पूरी तरह से तय नहीं किया गया था। मैंने एडोब से इसे फिर से खोलने के लिए कहा है और इस समस्या को ठीक करने के लिए CF-4198298 दायर किया है, केवल अगर सीएफ -3546046 फिर से खोला नहीं गया है। कृपया सीएफ -3546046 पर मेरी सबसे हाल की टिप्पणी देखें, और टिकट के लिए वोट देने के लिए स्वतंत्र महसूस करें। एक बार या तो पूरी तरह से तय हो जाने के बाद, आपके कोड में उपर्युक्त सूचीबद्ध परिवर्तन इसे आरईएसटी के माध्यम से बुलाए जाने पर सही HTTP प्रतिक्रिया सेट करने की अनुमति देगा और सीधे बोले जाने पर फ़ंक्शन के रिटर्न वैरिएबल को वापस करने के लिए अनुमति देगा। नोट: चरण 2 में result संरचना में headers संरचना w/निर्दिष्ट भी कर सकते हैं, यदि आप सीधे कार्यवाही के दौरान शीर्षलेख वापस करना चाहते हैं।

धन्यवाद !, -Aaron Neff

+0

यदि आर्किटेक्चर को इस पैटर्न का पालन करने के लिए बदला गया था तो प्रत्येक आरईएसटी फ़ंक्शन में रिटर्न टाइप 'स्ट्रक्चर' होगा जिसमें HTTP स्टेटस कोड, हेडर और सामग्री शामिल होगी। इस मामले में, 'RestSetResponse()' फ़ंक्शन कॉल की आवश्यकता क्यों होगी? आरईएसटी संदर्भ से बुलाए जाने पर लौटाई गई संरचना का उपयोग करके इसे कोल्डफ्यूजन द्वारा पृष्ठभूमि में लागू किया जा सकता है। – MT0

+0

मैं @AdamCameron [2014 ब्लॉग पोस्ट] के निष्कर्षों से सहमत हूं (http://blog.adamcameron.me/2014/04/coldfusion-rest-services-and.html), कि, मेरे उदाहरण में, वापसी मूल्य 'लोगों' चर की सामग्री होनी चाहिए (संरचना को 'RestSetResponse() 'पर नहीं भेजा गया है) और उन मामलों में' शून्य 'प्रतिक्रिया की अनुमति दी जानी चाहिए जहां स्थिति कोड' 204 - कोई सामग्री नहीं है या '4 ?? 'लेकिन कोल्डफ्यूजन इस अनुमति नहीं देता है। मैं यह भी सोचूंगा कि HTTP स्थिति और शीर्षलेखों को '' पर एक समान विधि का उपयोग करके सेट किया जाना चाहिए (जो तब 'getPageContext()। GetResponse() ') के माध्यम से पहुंच की अनुमति देगा। – MT0

+0

निम्नलिखित RestSetResponse() दस्तावेज़ नोट (प्रति सीएफ -3546046 जोड़ा गया), इच्छित व्यवहार का वर्णन करता है: "नोट: कोल्डफ्यूजन फ़ंक्शन के रिटर्न वैल्यू को अनदेखा करता है और RestSetResponse() फ़ंक्शन का उपयोग करके प्रतिक्रिया सेट का उपयोग करता है।" एडोब ने इच्छित व्यवहार को दस्तावेज किया, लेकिन कभी भी इच्छित व्यवहार को लागू नहीं किया। –