您的 Web 服务版本控制最佳实践是什么?

2024-05-12

我们有 2 个独立的产品,需要通过 Web 服务相互通信。 支持 API 版本控制的最佳实践是什么?

I have 本文 http://www.ibm.com/developerworks/webservices/library/ws-version/从 2004 年开始,声称没有实际标准,只有最佳实践。还有更好的解决方案吗?如何解决 WS 版本控制问题?

问题描述

System A

Client

class SystemAClient{
    SystemBServiceStub systemB;
    public void consumeFromB(){
        SystemBObject bObject = systemB.getSomethingFromB(new SomethingFromBRequest("someKey"));

    }
}

Service

class SystemAService{
    public SystemAObject getSomethingFromA(SomethingFromARequest req){
        return new SystemAObjectFactory.getObject(req);
    }
}

可转让对象

版本1

class SystemAObject{
     Integer id;
     String name;
     ... // getters and setters etc;
}

版本2

class SystemAObject{
     Long id;
     String name;
     String description;
     ... // getters and setters etc;
}

请求对象

版本1

class SomethingFromARequest {
     Integer requestedId;
     ... // getters and setters etc;

}

版本2

class SomethingFromARequest {
     Long requestedId;
     ... // getters and setters etc;

}

System B

Client

class SystemBClient{
    SystemAServiceStub systemA;
    public void consumeFromA(){
        SystemAObject aObject = systemA.getSomethingFromA(new SomethingFromARequest(1));
        aObject.getDescription() // fail point
        // do something with it...
    }
}

Service

class SystemBService{
    public SystemBObject getSomethingFromB(SomethingFromBRequest req){
        return new SystemBObjectFactory.getObject(req);
    }
}

可转让对象

版本1

class SystemBObject{
     String key;
     Integer year;
     Integer month;
     Integer day;

     ... // getters and setters etc;
}

版本2

class SystemBObject{
     String key;
     BDate date;
     ... // getters and setters etc;
}

class BDate{
     Integer year;
     Integer month;
     Integer day;
     ... // getters and setters etc;

}

请求对象

版本1

class SomethingFromBRequest {
     String key;
     ... // getters and setters etc;
}

版本2

class SomethingFromBRequest {
     String key;
     BDate afterDate;
     BDate beforeDate;
     ... // getters and setters etc;
}

失败场景

If a System A client of 版本1打电话给System B service of 版本2它可能会失败:

  • 缺少方法SystemBObject (getYear(), getMonth(), getDay())
  • 未知类型BDate

If a System A client of 版本2打电话给System B service of 版本1它可能会失败:

  • 未知类型BDate on the SomethingFromBRequest(A客户端使用B版本1无法识别的较新的B请求对象)
  • 如果系统 A 客户端足够聪明,可以使用请求对象的版本 1,则它可能会因缺少方法而失败SystemBObject目的 (getDate())

If a System B client of 版本1打电话给System A service of 版本2它可能会失败:

  • 类型不匹配或溢出SystemAObject(回Long但预计Integer)

If a System B client of 版本2打电话给System A service of 版本1它可能会失败:

  • 类型不匹配或溢出SystemARequest(要求Long代替Integer)
  • 如果请求以某种方式通过,则会出现转换问题(存根是Long但该服务返回一个Integer不一定兼容所有 WS 实现)

可能的解决方案

  1. 推进版本时使用数字:例如SystemAObject1, SystemBRequest2等等,但这缺少一个用于匹配源/目标版本的 API
  2. 在签名中,传递 XML 而不是对象(哎呀,在 XML 中传递转义的 XML、双重序列化、反序列化/解析、解解析)
  3. 其他:例如Document/literal/WS-I 有补救措施吗?

我更喜欢 Salesforce.com 的版本控制方法。每个版本的 Web 服务都有一个不同的 URL,格式如下:

http://api.salesforce.com/{version}/{serviceName}

因此,您将拥有如下所示的 Web 服务 URL:

http://api.salesforce.com/14/Lead

http://api.salesforce.com/15/Lead

等等...

通过这种方法,您可以获得以下好处:

  1. 您始终知道您正在与哪个版本交谈。

  2. 保持向后兼容性。

  3. 您不必担心依赖性问题。每个版本都有完整的服务集。您只需确保不在调用之间混合版本(但这取决于服务的使用者,而不是作为开发人员的您)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

您的 Web 服务版本控制最佳实践是什么? 的相关文章

随机推荐