मैं वास्तव में अपना खुद का जावा रीस्ट मॉक इंजन बनाना समाप्त कर दिया जो मूल रूप से किसी भी प्रतिक्रिया का नकल कर सकता है। जब तक आप एक संपूर्ण टेक्स्ट प्रतिक्रिया को अनुकरण करने वाली टेक्स्ट फ़ाइल को हैंडकाफ्ट या कट-पेस्ट कर सकते हैं, तो आप सेवा को नकल करने के लिए अपने समाधान का उपयोग कर सकते हैं।
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
से फिर से कॉल करें। मेरा सुझाव है कि आप अपने वेब ऐप में स्पष्ट राज्य संक्रमण करने के लिए कुछ बटन सेट अप करें।
मान लिया जाये कि सब कुछ सेटअप है, एक नकली बाकी श्रृंखला के लिए, एक डेवलपर कर सकते हैं:
आह्वान
http://yourserver/yourweb/MockGridData?__setdata=data/init.http
रन एक जावास्क्रिप्ट मॉड्यूल है कि फोन करने (जैसे कि, प्राप्त साथ में परिणाम होगा)
http://yourserver/yourweb/MockGridData
क्लिक एक बटन है कि तब करता है:
http://yourserver/yourweb/MockGridData?__setdata=data/step1.http
रन एक और जावास्क्रिप्ट कदम है कि फोन करने में परिणाम होगा (जैसे कि, PUT साथ)
http://yourserver/yourweb/MockGridData
एक और बटन है कि तब होता है पर क्लिक करें:
http://yourserver/yourweb/MockGridData?__setdata=data/step2.http
रन एक और जावास्क्रिप्ट कदम जिसके परिणामस्वरूप कॉलिंग (कहें, जीईटी के साथ)
http://yourserver/yourweb/MockGridData
लेकिन इस बार # 4 से अलग परिणाम की उम्मीद है।
यह बाइनरी और gzipped प्रतिक्रियाओं के साथ भी काम करना चाहिए, लेकिन मैंने इसका परीक्षण नहीं किया है।
समाधान पर बधाई। जब आप सक्षम होते हैं, तो कृपया अपने उत्तर को 'स्वीकृत' के रूप में चिह्नित करना सुनिश्चित करें ताकि अन्य लोग आपकी सफलता से सीख सकें। चीयर्स ~ –