// ${name: restApi}
// ${title: web.rest 请求过程}
   
import console; 
import web.rest.client
   
var http = web.rest.client()
var api = http.api("http://eu.httpbin.org/api/{program}/{lang}"); 
console.varDump(api)
   
// 下面把一次请求 api.language.aardo.get() 分开来看
   
var language = api["language"] 
console.varDump(language)
/*
在 api 表中找 language,就会触发 _get 元方法
api 中成员都是_下划线开头的只读成员,所以为了继续向下传递
就返回一个经过数据处理,具有同样数据结构带有同一个元表_meta的新表
   
api成员只读 保证了定义一次,就不能修改,可以多次重复调用
例如:api.language.python() ...
   
不是 _defaultMethod 表定义的请求方法 就处理 url模板
然后 
    return new api{
        _urlTemplate = urlTemplate;
        ...
        @_meta
    }
*/
   
var aardio = language["aardio"]
console.varDump(aardio)
   
/*
_defaultMethod = { head = "HEAD";get = "GET"; post = "POST"; put = "PUT"; delete = "DELETE"; patch ="PATCH"} ;
if( _defaultMethod[k] ) {
    ... return new api{
        _httpMethod = _defaultMethod[k];
        ...
        @_meta
    }
}
*/
var get = aardio["get"]  
console.varDump(get)
   
console.log( get() ) // 最后调用 元方法 _call 发起请求
   
/*
到这里 我们一次请求的工作就完成了!
下面第三个参数 开始处理返回值!
返回值 肯定要在请求之后才能处理
145行 request函数中处理
...
//owner[["_partten"]] api中第三个参数  ret 请求返回的原始数据
if( owner[["_partten"]] && ret ){  
        var tp = type( owner._partten);  // 判断参数3 类型 根据不同类型分别处理
        if( tp == "table"){
            return ..string.map(ret,owner._partten);
        }
        elseif( tp == "function"){
            return owner._partten(ret);
        }
           
        ret = ..string.match(ret,owner._partten);
        if(!ret) return null,"服务器返回的数据中未找到匹配的部分"
    }
    // 参数3 为空就调用函数 parseResponseResult 处理
    return this.parseResponseResult(ret);
}
*/
   
console.pause();

// https://suiang.cn/aardio/code/restApi