构建高效、灵活且有弹性的API客户端应用
立即解锁
发布时间: 2025-08-26 01:54:59 阅读量: 7 订阅数: 18 


RESTful Web API设计与实践精髓
### 构建高效、灵活且有弹性的API客户端应用
#### 1. 限制硬编码URL的使用
在开发API客户端应用时,硬编码URL是一个常见的问题。当服务的URL发生变化时,客户端代码也需要相应修改,这会带来很多不便。为了解决这个问题,我们可以采取以下措施:
- 服务端使用超媒体类型,这样客户端应用只需记住起始URL。
- 服务端提供远程配置文件,其中包含客户端所需的所有静态URL的命名变量。
如果无法从服务端获取这些信息,客户端应用开发者可以使用客户端配置文件,或者在代码中创建自己的客户端命名变量集合。
以下是一个简单的JavaScript示例代码:
```javascript
/* find-rel.js */
var startingURL = "http://service.example.org/";
var thisURL = "";
var link = {};
// using named URL variables
const http = new XMLHttpRequest();
// Send a request
http.open("GET", serviceURLs.list);
http.send();
// handle responses
http.onload = function() {
switch (http.responseURL) {
case startingURL:
link = findREL("list");
if(link.href) {
thisURL = link.href;
...
}
...
break;
...
}
}
```
不过,依赖客户端配置文件并非理想的解决方案。服务URL的变化需要传达给客户端开发者,以便更新客户端信息,这可能导致服务变化和客户端变化之间存在延迟。虽然可以设置客户端监控变化,但这会增加额外的工作,并且只能缩短客户端应用对未宣布变化的反应时间。
#### 2. 使客户端具备HTTP感知能力
有时候,服务提供的辅助库、包装器或API软件开发工具包(SDK)可能会让客户端应用解决问题变得更困难。为了确保客户端应用能够绕过这些辅助库或SDK的限制,我们需要让客户端应用具备“协议感知”能力,即能够直接使用HTTP协议与服务进行通信。
即使客户端应用使用了SDK和辅助库,也应该确保它知道如何直接“说HTTP”。这样可以确保应用能够以服务原作者在初始版本中未考虑到的方式使用服务。
以下是一个简单的客户端JavaScript HTTP调用辅助库示例:
```javascript
var ajax = {
// setup code here...
/***********************************************************
*** PUBLIC METHODS ***
args = {url:string, headers:{}, queryString:{}, body:{},
callback:function, context:string}
***********************************************************/
httpGet: function(args) {...},
httpGetXML: function(args) {...},
httpGetJSON: function(args) {...},
httpGetPlainText: function(args) {...},
httpPost: function(args) {...},
httpPostVars: function(args) {...},
httpPostForXML: function(args) {...},
httpPostForJSON: function(args) {...},
httpPostForPlainText: function(args) {...},
httpPut: function(args) {...},
httpHead: function(args) {...},
httpDelete: function(args) {...},
httpOptions: function(args) {...},
httpTrace: function(args) {...},
// implementation details below ...
}
```
这个库可以通过以下代码调用:
```javascript
function getDocument(url) {
var args = {};
args.url = url;
args.callbackFunction = ajaxComplete;
args.context = "processLinks";
args.headers = {'accept':'application/vnd.collection+json'}
ajax.httpGet(args}
// later ...
function ajaxComplete(response,headers,context,status,msg)
{
switch(status) {...} // handle status
switch(context) {...} // dispatch to context
}
```
具备HTTP感知能力的API客户端不需要很复杂,客户端浏览器应用使用`XMLHttpRequest`对象就可以完成很多任务。不过,这种方法也有缺点,一些服务可能希望通过SDK控制客户端应用与服务的交互方式,这可能会让开发者感到沮丧,甚至导致客户端团队放弃使用某个API。
#### 3. 以消息为中心的实现方式构建有弹性的客户端
为了延长客户端应用的生命周期并提高其稳定性,我们可以将客户端应用编码为使用知名的媒体类型进行“交流”。具体来说,就是让客户端应用紧密绑定服务返回的消息,而不是特定的服务或领域问题。
以下是一个ToDo领域应用的示例:
- **绑定服务接口类型的客户端**:
```javascript
/* to-do-functions.js */
var thisPage = function() {
function init() {}
function makeRequest(href, context, body) {}
function processResponse(ajax, context) {}
function refreshList() {}
function searchLi
```
0
0
复制全文
相关推荐










