查询适用于多个版本结构的系统?

时间:2012-06-04 13:10:05

标签: php api versioning

我正在SOAP中开发API PHP。此API应该能够处理多个接口版本。为此,我正在对数据结构进行版本控制,如:

  • StructV1User
  • StructV1Group

......过了一段时间......

  • StructV2User
  • StructV2Group

新数据结构不会覆盖旧数据结构。多个API接口版本应该同时工作。

API接口的第一个版本中,操作如下:

User userGet(int id)

它返回一个具有结构的对象:

User {
    int id;
    string username;
    int created;
    int updated;
}

假设在一段时间后从结构中删除了一些属性并添加了其他属性(在此示例中操作签名不会更改):

User {
    int id;
    string username;
    int updated;
    bool admin;
}

因此,如果数据库发生更改且字段created不再存在,则应为null。旧客户端应检查空值。

备注:

  • API interface
  • 会有多个版本
  • 数据库随时间的变化
  • 每个版本都有自己的URL,自己的WSDL和自己的proxy class

如何创建适用于多个版本结构的查询系统?

有没有任何已知方法?

2 个答案:

答案 0 :(得分:0)

我的第一种方法是传递为每一行调用的callback函数,并根据需要转换数据:

以下是切入点:

function userGet($id){
    return UserModel::getUserById($id, 'myCallback'); /* Query system */
}

...并在回调中:

function myCallback($dbRow){
    $row = new StructV1User;
    $row->id = (int) $dbRow['id'];
    $row->username = (string) $dbRow['username'];
    $row->created = (int) $dbRow['created'];
    $row->updated = (int) $dbRow['updated'];
    return $row;
}

...以及API的第二个版本:

function userGet($id){
    return UserModel::getUserById($id, 'my2ndCallback'); /* Query system */
}

...并在回调中:

function my2ndCallback($dbRow){
    $row = new StructV2User;
    $row->id = (int) $dbRow['id'];
    $row->username = (string) $dbRow['username'];
    $row->updated = (int) $dbRow['updated'];
    $row->admin = (boolean) $dbRow['admin'];
    return $row;
}

答案 1 :(得分:0)

因为你的肥皂Api不能在更新结构时给它们一个全新的URL吗?