当前位置: 首页 > 知识库问答 >
问题:

如何强制客户端代码按预期/发布使用API

白镜
2023-03-14

我想开发一个将由第三方使用的API,我们无法控制第三方如何使用该API。通过公共文档传达正确的API使用方式并不能保证API的正确使用。

是否有任何技术或设计模式可以迫使API使用者按预期使用API方法?

以下是API的两个使用示例,它有一个方法来发送状态:

>

  • 用法#1消费者可以通过将字符串数组传递给方法在单个调用中发送多个状态。这是API设计者的预期用途。

    用法#2消费者仍然推文多个状态,但一次一个状态,最终调用推文方法十次。这不是预期的用途,可能会导致性能问题。

    我正在寻找一种解决方案来强制/防止这种API的使用。

    API打包/交付为jar:

    package com.api;
    
    public class API {
        public API() {
            // TODO Auto-generated constructor stub
        }
    
        public void tweet(String [] statuses) {
            // TODO - very expensive db call to store statuses
    
            // open db connection
            // insert/update
            // close db connection
        }
    }
    

    客户端调用API:

    package com;
    
    import com.api.API;
    
    public class Example {
        public Example() {
            // TODO Auto-generated constructor stub
        }
    
        private static void client() {
            API api = new API();
    
            // API Usage #1 - WAS Expected
            String [] statuses1 = new String[10];
            for (int i = 0; i < 10; i++) {
                statuses1[i] = new String("[" + i + "] - statuses1");
            }
            // one call to process all 10 statuses -- RIGHT
            api.tweet(statuses1);
    
            // API Usage #2 - NOT Recommended
            String [] statuses2 = new String[1];
            for (int i = 0; i < 10; i++) {
                statuses2[i] = new String("[" + i + "] - statuses2");
    
                // ten calls to process all 10 statuses -- WRONG
                api.tweet(statuses2);
            }
        }
    }
    
  • 共有1个答案

    晁国发
    2023-03-14

    恕我直言,你应该相信你的客户会做正确的事情。但是也许你可以代替他们做批处理:

    在API中收集请求。自己推特。也许您可以聚合来自不同客户端的请求。也许您可以在更长的时间内聚合来自单个客户端的请求。

    这应该可以解决问题。如果没有,以下是更多的想法:

    也许您可以很容易地发现客户端连续多次调用您的方法并抛出异常来教他们艰难的方法。但是我发现最好专门处理这样的客户端,例如,通过聚合他们的调用(而来自更符合要求的客户端的调用会立即传递)。

    你写的

        // open db connection
        // insert/update
        // close db connection
    

    这通常是错误的。关闭连接意味着浪费大量时间,连接池是标准的解决方案。

     类似资料:
    • 我正在关注Spotify的客户端凭据授权流,但我的所有curl请求每次都返回。以下是Spotify的说明: 请求将在请求正文中包含参数: grant_type-设置为“client_credentials” 此 POST 请求的标头必须包含以下参数: < li >授权-包含客户端ID和客户端密钥的Base 64编码字符串。该字段必须具有以下格式:<代码>授权:基本 它们还包括一个curl请求示例:

    • 问题内容: 我通过调用post方法使用Spring3.0 restTemplate使用json webservice。 我们的应用程序已部署在WAS服务器中,并尝试通过使用TLS1.0创建套接字连接来连接生产者。但是,现在生产者仅支持TLS1.1和TLS1.2。 如何强制执行restTempate以使用TLS1.1或TLS 1.2。 通常,对于apache httpclient代码,创建自定义Pr

    • 问题内容: 我们目前正处于非公开Beta测试阶段,因此仍在进行相当快速的更改,尽管显然随着使用量的增加,我们将放慢这个过程。话虽这么说,我们遇到的一个问题是,在我们推出新JavaScript文件的更新后,客户端浏览器仍然使用文件的缓存版本,而他们看不到更新。显然,在技术支持电话上,我们可以简单地通知他们进行刷新以确保他们从服务器获取最新文件,但是最好在此之前进行处理。 我们当前的想法是将版本号简单

    • 我已经为rmi编程了一段时间,一个月后,我仍然被困在一个棘手的问题上。我想从服务器向客户端发送一个序列化对象,我想让客户端从服务器代码库下载这个对象的类。如果客户端的类路径中没有对象的类,我就无法让它工作。以下是我一直在做的: 我有一个要求一个到一个。也应该下载类ClientPlayer并动态加载它。 这是身份验证服务器,它应该创建一个对象(或),并将其返回给。(为了简洁起见,我省略了接口;无论如

    • 使用通用gRPC客户端 使用Python客户端 使用Java客户端 使用Scala客户端 使用Golang客户端 使用C++客户端

    • 故事是这样的,我有一个远程服务器和一个防火墙后面的客户端。客户端由netty实现,它将建立一个与远程服务器的保活连接。如果200秒内通道中没有消息传输,防火墙将重置连接到远程服务器端的连接,但客户端没有收到任何tcp数据包(例如RST包),因此客户端认为此连接是活的,而事实并非如此。那么如何在防火墙错误处理此保活连接之前强制关闭不寻常的连接呢?顺便说一句:我无法配置防火墙