Nginx 模拟 Backbone 请求的 JSON 接口

发布时间: 2015-12-12 20:45:34 作者: 大象笔记

团队同步开发时,通常不能保证后台接口在开发初期可用。 所以,就需要前端自己模拟 API 的返回应答。

记录一下我是如何用 Nginx 来模拟 JSON 接口的

例如,我前端要发送一个请求 POST /api/new-stock

需要后台返回 JSON

{
   'err_code': 0,
   'msg': 'OK'
}

只需要将这个 JSON 结果写入 new-stock 文件,然后置于目录 /home/zhongwei/work/someproject/api/ 下。 这是对应的 Nginx 配置文件

server {
	listen 80 default_server;
	listen [::]:80 default_server ipv6only=on;

	root /home/zhongwei/work/someproject/js/src;
	index index.html index.htm;

	server_name localhost;

	location /api/ {
	        # 强制 Nginx 返回 HTTP 头 Content-Type 为 application/json
		default_type application/json;
		# 所有模拟应答的 json 文件都置于该目录下,不要加文件名后缀
		alias /home/zhongwei/work/someproject/api/;
	}

	location / {
		# First attempt to serve request as file, then
		# as directory, then fall back to displaying a 404.
		try_files $uri $uri/ =404;
	}

        # To allow POST on static pages
	# 默认是不支持 POST 的, 会返回 405 错误。
        error_page  405     =200 $uri;
}

Backbone 处理应答的逻辑

例如下面 Backbone 代码

this.model.save(null, {
	success: function(model, response) {
		appView.router.navigate("someplace", {trigger: true, replace: false});
	},
	error: function(model, response) {
		that.showErrMsg('提交失败!');
	}
});

代码逻辑总是走的 error,即使应答是 200。

原因是,返回的不是合法的 JSON 格式,只要是不能被解析的 JSON 的格式,均被判定为 error。

我这里就犯了在 JSON 文件中写单引号的错误,参考 jQuery parseJSON 文档,json 串中只能使用双引号。

如何模拟一个 API 的多种不同返回呢

例如,同一个接口返回不同的 error code 呢?

目前采用了一个非常笨的做法,就是建立两个应答 JSON 文件

每次 cp 一个到对应的返回上

模拟慢接口和响应超时

使用 Nginx 的 echo_sleep

NginxHTTPEcho 的安装方法

$ ./configure --prefix=/opt/nginx \
        --add-module=/path/to/echo-nginx-module

模拟 502

location /api/ {
	default_type application/json;
	return 502;
}
我是一名山东烟台的开发者,联系作者