為了以后節約時間,記錄下模擬報文的實現
模擬報文思路:就是后台把接口數據先寫在文檔里面寫死,接口地址不變,在每個接口里面控制是訪問的模擬報文還是數據庫里面的數據,
對於前端來說所有都是不變的,就是說我們如果把一個接口從模擬報文數據切換到數據庫相關的數據,對於前端來說沒有任何的影響
基於的技術平台: spring boot1.5.3 + maven + jdk1.8_112 (不過我覺得沒什么關系)
1.寫一個模擬報文處理的類Message,也可以寫完后封裝成jar包后面方便用
public class Message {
private final Logger logger = Logger.getLogger(getClass());
public String sendMessage(HttpServletRequest request, Object inputContent){
//得到URI
String uri = request.getRequestURI();
//獲取request的json數據,取出所有的鍵
String requestContent = JSON.toJSONString(inputContent);
JSONObject jsonObject = JSON.parseObject(requestContent);
Set set = jsonObject.keySet();
//讀取事先寫在request的txt內容
String fileRequestPath = "message" + uri +".json";
String fileContent="";
try{
File file = new File(fileRequestPath);
fileContent=txt2String(file);
}catch (Exception e){
return "請求接口地址錯誤或文件內部數據不是json";
}
logger.info(fileContent);
//獲取txt的json數據,取出所有的鍵
JSONObject jsonFile = JSON.parseObject(fileContent);
Set setFile = jsonFile.keySet();
//比較輸入的鍵是不是合乎規范
boolean check = isSetEqual(set,setFile);
if(check){
//如果輸入的格式和字段都正確,返回寫好的txt報文json格式數據
String fileResponsePath = "message" + uri +"Response"+".json";
String rightFile = "";
try{
File fileResponse = new File(fileResponsePath);
rightFile=txt2String(fileResponse);
}catch (Exception e){
return "響應報文地址錯誤或文件內部數據不是json";
}
JSONObject rightResponse = JSON.parseObject(rightFile);
return rightResponse.toString();
}else {
//如果輸入的格式或字段不正確,返回寫好的錯誤數據
String fileResponsePath = "message/error/requestError.json";
String errorFile = "";
try{
File fileResponse = new File(fileResponsePath);
errorFile=txt2String(fileResponse);
}catch (Exception e){
return "響應報文地址錯誤或文件內部數據不是json";
}
JSONObject errorResponse = JSON.parseObject(errorFile);
return errorResponse.toString();
}
}
//讀取txt文件的內容,輸出String格式
public String txt2String(File file){
StringBuilder result = new StringBuilder();
try{
BufferedReader br = new BufferedReader(new FileReader(file));//構造一個BufferedReader類來讀取文件
String s = null;
while((s = br.readLine())!=null){//使用readLine方法,一次讀一行
result.append(System.lineSeparator()+s);
}
br.close();
}catch(Exception e){
e.printStackTrace();
}
return result.toString();
}
//獲取request請求的內容
public String readRequestBody(HttpServletRequest request){
InputStream inputStream = null;
BufferedInputStream buf = null;
StringBuffer requestJsonBuffer = null;
try {
inputStream = request.getInputStream();
buf = new BufferedInputStream(inputStream);
byte[] buffer = new byte[1024];
requestJsonBuffer = new StringBuffer();
int a = 0;
while ((a = buf.read(buffer)) != -1){
requestJsonBuffer.append(new String(buffer, 0, a, "UTF-8"));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//關閉連接
if (null != buf){
try {
buf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != inputStream){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null == requestJsonBuffer ? null : requestJsonBuffer.toString();
}
//用來比較兩個Set是否相等,用來比較request內容的鍵是不是一樣的
public boolean isSetEqual(Set set1, Set set2) {
if (set1 == null && set2 == null) {
return true; // Both are null
}
if (set1 == null || set2 == null || set1.size() != set2.size()
|| set1.size() == 0 || set2.size() == 0) {
return false;
}
Iterator ite2 = set2.iterator();
boolean isFullEqual = true;
while (ite2.hasNext()) {
if (!set1.contains(ite2.next())) {
isFullEqual = false;
}
}
return isFullEqual;
}
}
Meaasge類的原理:寫一個request相關的文檔,一個response相關的文檔,調用接口的時候拿請求的數據和request里面的數據進行比較,如果參數都對,
我們就返回response中的內容,如果參數有問題,我們就返回特地的錯誤信息
2.在跟目錄下新建message目錄,message目錄下新建test和error文件,兩個文件夾下面再建具體的request和response的json文件
(目錄和文件名字可以自己定,不過要跟message中對應好)
3.在具體的接口中使用模擬報文
在類的前面聲明
@Autowired
private HttpServletRequest request;
然后在接口中寫:
一句話調用Message類的sendMessage函數就可以實現模擬報文了,后面我們要改過來改下return就可以了,對於前端來說是感覺不到任何改變的,可以加快項目的開發