Nginx 模拟 Backbone 请求的 JSON 接口

更新日期: 2015-12-12 阅读次数: 13893 分类: Nginx

团队同步开发时,通常不能保证后台接口在开发初期可用。 所以,就需要前端自己模拟 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 文件

  • 一个是正常返回,文件名缀上 _ok
  • 一个是错误返回,文件名缀上 _error

每次 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;
}

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式