Nginx 模拟 Backbone 请求的 JSON 接口

更新日期: 2015-12-12 阅读次数: 8481 分类: 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 聊聊。 白天写程序,晚上哄熊孩子,可能回复有点慢,见谅。 查看更多联系方式

相关文章

爱评论不评论

近期节日

2020年05月31日 世界无烟日
2020年06月01日 六一儿童节
2020年06月05日 世界环境日
2020年06月05日 芒种
2020年06月06日 全国爱眼日
2020年06月11日 中国人口日
2020年06月20日 世界难民日
2020年06月21日 父亲节
2020年06月21日 夏至
2020年06月22日 中国儿童慈善活动日
2020年06月23日 国际奥林匹克日
2020年06月25日 全国土地日
查看更多节日