在设计一个易于被不同客户(网络和移动设备)使用的API时,我应该为每个客户创建一个端点吗?
例如,在尝试为网络和移动设备创建API时,我想到了以下内容:
换句话说,我可以创建一个单一的API端点,例如:
http://site.ne/api/register - 适用于网站和移动设备
或者,我应该为网站创建一个单独的处理程序,比如说。
http://site.ne/register.php - 网站
http://site.ne/api/register - 移动
我相信Facebook,Twitter等正在做前者。如果这是正确的事情,我只是想清除我的疑虑并强化我的理解。
请介绍一些简单的例子。如果有人在之前使用相同的方法进行了缓冲并获得胜利者,请分享您的解决方案。
答案 0 :(得分:0)
无论客户如何,您的API都应该运行相同的API。这就是为什么RESTful API很受欢迎的原因。您正在为所有客户构建一项服务。以这种方式构建API使其更具可维护性和可扩展性(假设它是无状态的)。这包含了网络的本质。
考虑到这一点,您的客户希望与您的服务进行互动。它想要检索数据并发回数据(然后使用HTTP动词来表示意图)。如何表示这些数据是客户的责任,并且与服务无关。
Web客户端可以进行Ajax调用以检索数据并以HTML格式呈现。 HTML可以响应以支持多个设备/屏幕。胖客户端也可以进行Web调用并根据需要显示它。每次你需要另一个客户端时,构建它。服务保持不变。客户也可能是其他服务 - 这有帮助吗?
如果您认为某个网址代表了某个资源,那么请添加' api'你的网址是一个反模式。如果您有兴趣阅读有关REST的更多信息,那么我建议Jim Webber在实践中休息。无论您选择构建API,我仍然建议您使用一个不知道其所服务客户端的接口。
答案 1 :(得分:0)
通过采用REST架构,您可以统一创建供REST客户端使用的API。
这个所谓的REST客户端可以是Web或移动的,通常使用JSON作为返回值。
我们以Facebook的Graph GET用户ID API(graph.facebook.com/{user-id}
)为例:
我们希望获得有关用户ID的一些信息:bgolub
GET https://graph.facebook.com/bgolub
将返回以下JSON
{
"id": "15500414",
"first_name": "Benjamin",
"last_name": "Golub",
"link": "http://www.facebook.com/15500414",
"name": "Benjamin Golub",
"relationship_status": "Married",
"significant_other": {
"id": "15500304",
"name": "Megen Vo"
}
}
然后在网络(Javascript)中,您可以执行以下操作:
FB.api('/bgolub', function(response) {
console.log(JSON.stringify(response));
// do something more such as save the id to your DB
});
对于Android,您可以创建REST客户端(例如使用Retrofit),例如:
public class MyClient {
private static String URL_FEED = "https://graph.facebook.com";
private static MyClientInterface sMyClientInterface;
public static MyClientInterface getMyClient() {
if (sMyClientInterface == null) {
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(URL_FEED)
.build();
sMyClientInterface = restAdapter.create(MyClientInterface.class);
}
return sMyClientInterface;
}
public interface MyClientInterface {
@GET("/bgolub")
void getBenGolub(Callback<Object> callback);
}
}
重点是:移动和网络都可以并且应该使用一个API端点。 除非您返回不同的值,否则不需要为单个功能使用多个端点。