2011-10-27 30 views
7

जावास्क्रिप्ट के साथ काम करते समय जो आरईएसटी सेवाओं का व्यापक रूप से उपयोग करता है - जिसमें GET, PUT, POST, DELETES, आदि जैसे vocabs का उपयोग करना शामिल है; मुझे सर्वर की ओर नकल करना मुश्किल लगता है, इसलिए फ्रंट एंड डेवलपमेंट स्वतंत्र रूप से (बैक एंड के) पर जा सकता है।सर्वर पक्ष से एक जटिल आरईएसटी कॉल का नकल कैसे करें?

यह भी कभी कभी बहु-चरण डेटा पर कब्जा करने के लिए उपयोगी है, तो हम मदद कर सकते हैं बाकी भी को एक कड़ी में पुन: पेश (या सामने के छोर है कि इन जंजीरों से ट्रिगर कर रहे हैं से संबंधित कीड़े)

उपकरण क्या मैं कर सकते हैं रीस्ट कॉल मॉक करने के लिए उपयोग करें, esp स्टेटफुल? (यानी अगर मैं कुछ संसाधनों पर एक पुट करता हूं, तो मुझे उम्मीद है कि अगली बार इसे किसी भी तरह से बदलने के लिए)

मैंने SOAPUI 4.0.1 की कोशिश की और यह रीस्ट मॉकिंग निराशाजनक है। इसके अलावा, मेरी ज़रूरत एकल राज्य मजाक से परे है (जो कोई स्थिर। जेसन फ़ाइल के साथ कर सकता है)। मुझे राज्य संक्रमण प्रकार की चट्टानों की आवश्यकता है; कंटेंट-रेंज हेडर के साथ काम करना सबसे अच्छा होगा।

कोई भी?

उत्तर

2

मैं वास्तव में अपना खुद का जावा रीस्ट मॉक इंजन बनाना समाप्त कर दिया जो मूल रूप से किसी भी प्रतिक्रिया का नकल कर सकता है। जब तक आप एक संपूर्ण टेक्स्ट प्रतिक्रिया को अनुकरण करने वाली टेक्स्ट फ़ाइल को हैंडकाफ्ट या कट-पेस्ट कर सकते हैं, तो आप सेवा को नकल करने के लिए अपने समाधान का उपयोग कर सकते हैं।

package com.mockrest.debug; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.util.Arrays; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

import javax.servlet.GenericServlet; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 

/** 
* Servlet implementation class MockGridData 
*/ 
public class MockRest extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    /** 
    * @see HttpServlet#HttpServlet() 
    */ 
    public MockRest() { 
     super(); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public void service(ServletRequest req, ServletResponse res) 
      throws ServletException, IOException { 
     sub:{ 
      HttpServletRequest request = (HttpServletRequest)req; 
      HttpServletResponse response = (HttpServletResponse)res; 
      String setdata = request.getParameter("__setdata"); 
      if (setdata!=null && setdata.length()>0){ 
       System.err.println("Setting Data..."); 
       HttpSession sess = request.getSession(true); 
       String data = "/"+request.getParameter("__setdata"); 
       sess.setAttribute("data", data); 
       try{ 
        InputStream is = getServletContext().getResourceAsStream(data); 
        if (is!=null){ 
         is.close(); 
         response.getWriter().write("Successfully pointed next REST call to:"+data); 
        } 
        else{ 
         response.sendError(500, "Cannot find resource:"+data); 
        } 
       } 
       catch (IOException ioe){ 
        response.sendError(500, Arrays.deepToString(ioe.getStackTrace())); 
       } 

      } 
      else{ 
       System.err.println("Fetching Data..."); 
       HttpSession sess = request.getSession(false); 
       if (sess==null || sess.getAttribute("data")==null){ 
        response.sendError(500,"Session invalid or no Previous Data Set!"); 
       } 
       String rsrc = (String)sess.getAttribute("data"); 
       System.err.println("Resource Being used:"+rsrc); 
       InputStream is = getServletContext().getResourceAsStream(rsrc); 
       if (is!=null){ 
        String statusline = readLine(is); 
        Pattern statusPat = Pattern.compile("^HTTP/1.1 ([0-9]+) (.*)$"); 
        Matcher m = statusPat.matcher(statusline); 
        if (m!=null && m.matches()){ 
         int status = Integer.valueOf(m.group(1)); 
         response.setStatus(status, m.group(2)); 
        } 
        else{ 
         throw new ServletException("Bad input file: status line parsing failed, got this as status line:"+statusline); 
        } 
        String line; 
        Pattern httpHeaderPat = Pattern.compile("^([^:]+): (.*)$"); 
        while ((line=readLine(is))!=null){ 
         if (line.length()==0){ 
          // end of headers 
          break; 
         } 
         Matcher m2 = httpHeaderPat.matcher(line); 
         if (m2!=null && m2.matches()){ 
          response.setHeader(m2.group(1), m2.group(2)); 
         } 
        } 
        OutputStream os = response.getOutputStream(); 
        byte[] buf = new byte[1024]; 
        int size; 
        while ((size=is.read(buf))>0){ 
         os.write(buf, 0, size); 
        } 
        os.flush(); 
       } 
      } 
     } 
    } 

    private String readLine(InputStream is) throws IOException { 
     StringBuffer sb = new StringBuffer(); 
     char c; 
     while ((c=(char)is.read())!='\n'){ 
      sb.append(c); 
     } 
     if (sb.charAt(sb.length()-1) == '\r'){ 
      sb.deleteCharAt(sb.length()-1); 
     } 
     return sb.toString(); 
    } 

} 

यह कॉन्फ़िगर करने के लिए अपने WebContent फ़ोल्डर के अंदर पहले से बनाए गए प्रतिक्रिया फ़ाइलें रख:

यहाँ सर्वलेट है। मैं आमतौर पर .http एक्सटेंशन के साथ इन फ़ाइलों को समाप्त करता हूं।

एक उदाहरण init.http फ़ाइल नीचे है। मान लें कि हम एक फ़ोल्डर WebContent अंदर data बुलाया अंदर इस फाइल को रखा:

HTTP/1.1 200 OK 
Date: Wed, 26 Oct 2011 18:31:45 GMT 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
X-AspNet-Version: 4.0.30319 
Content-Range: items 0-1/2 
Content-Length: 385 
Cache-Control: private 
Content-Type: application/json 

[ 
    { 
    "id": "249F0", 
    "field1": " Global", 
    "displaystartdate": "2007-10-20", 
    "displayenddate": "2012-10-20", 
    "status": "Major Delay", 
    "children": true 
    }, 
    { 
    "id": "962581", 
    "field2": "Europe", 
    "displaystartdate": "2007-10-20", 
    "displayenddate": "2012-10-20", 
    "status": "Major Delay", 
    "children": true 
    } 
] 

हेडर चाहिए शरीर के साथ अलग एक खाली लाइन द्वारा (कोई रिक्त स्थान, नाडा)। Http से परिचित लोगों को यह पता चलेगा कि यह एक शुद्ध http प्रतिक्रिया है। यह उद्देश्य पर है।

आप इस उपकरण का उपयोग किसी भी http शीर्षलेख को अनुकरण करने के लिए कर सकते हैं जो आप चाहते हैं; यहां तक ​​कि विभिन्न सर्वर शीर्षलेख के साथ प्रतिक्रिया देने के लिए भी जा रहा है (मेरे उदाहरण में, मैंने आईआईएस 6.0 होने का दावा करते हुए प्रतिक्रिया अनुकरण की); या एक अलग HTTP स्थिति कोड, आदि

इसे अपने ब्राउज़र/जावास्क्रिप्ट से आमंत्रित करने के लिए; प्रथम प्रधानमंत्री इसके साथ:

http://yourserver/yourweb/MockGridData?__setdata=data/init.http 
फिर अपने जावास्क्रिप्ट में

या AJAX कॉल बाकी है, अगर यह

http://yourserver/yourweb/MockGridData 
कोई भी तरीका या पैरामीटर के साथ

को जाता है; यह उस HTTP प्रतिक्रिया को प्राप्त करेगा जिसे आपने पहले बनाया था; सामग्री-रेंज तक भी; कैश हेडर; इत्यादि। यदि आपको कुछ और लौटने के लिए बाद में AJAX कॉल की आवश्यकता है, तो बस __setdata से फिर से कॉल करें। मेरा सुझाव है कि आप अपने वेब ऐप में स्पष्ट राज्य संक्रमण करने के लिए कुछ बटन सेट अप करें।

मान लिया जाये कि सब कुछ सेटअप है, एक नकली बाकी श्रृंखला के लिए, एक डेवलपर कर सकते हैं:

  1. आह्वान

    http://yourserver/yourweb/MockGridData?__setdata=data/init.http 
    
  2. रन एक जावास्क्रिप्ट मॉड्यूल है कि फोन करने (जैसे कि, प्राप्त साथ में परिणाम होगा)

    http://yourserver/yourweb/MockGridData 
    
  3. क्लिक एक बटन है कि तब करता है:

    http://yourserver/yourweb/MockGridData?__setdata=data/step1.http 
    
  4. रन एक और जावास्क्रिप्ट कदम है कि फोन करने में परिणाम होगा (जैसे कि, PUT साथ)

    http://yourserver/yourweb/MockGridData 
    
  5. एक और बटन है कि तब होता है पर क्लिक करें:

    http://yourserver/yourweb/MockGridData?__setdata=data/step2.http 
    
  6. रन एक और जावास्क्रिप्ट कदम जिसके परिणामस्वरूप कॉलिंग (कहें, जीईटी के साथ)

    http://yourserver/yourweb/MockGridData 
    

    लेकिन इस बार # 4 से अलग परिणाम की उम्मीद है।

यह बाइनरी और gzipped प्रतिक्रियाओं के साथ भी काम करना चाहिए, लेकिन मैंने इसका परीक्षण नहीं किया है।

+0

समाधान पर बधाई। जब आप सक्षम होते हैं, तो कृपया अपने उत्तर को 'स्वीकृत' के रूप में चिह्नित करना सुनिश्चित करें ताकि अन्य लोग आपकी सफलता से सीख सकें। चीयर्स ~ –