Nginx 模拟 Backbone 请求的 JSON 接口

文章目录

    团队同步开发时,通常不能保证后台接口在开发初期可用。
    所以,就需要前端自己模拟 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 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式