设计一个符合RESTful标准的API

4

我正在为一家初创公司的Android应用设计REST API作为后端服务。该公司目前有一个网页版本的服务,拥有大约10,000个用户。我对Web API的设计有几个疑问:

  1. 如何使我的API安全?

我只希望Android客户端可以访问API,而其他人无法访问。一种方法是从前端发送加密令牌并在后端解密。还有其他方法吗?另外,我应该如何实现它?

  1. 如何使我的API快速高效?

有一个特定的终端点非常频繁地被访问。尽管该终端点上的信息不经常更改,但在短时间内发出的请求很可能会返回相同的响应。我该如何使这些请求的响应更快?使用 ETagLast-Modified 能否达到预期效果?

  1. 我应该相信来自客户端的数据吗?

目前,当我收到带有某些参数的请求时,我仅检查请求中的参数是否为null。例如,如果请求具有mobile作为参数,则我仅检查请求中是否存在mobile参数。我不进行其他检查,例如检查mobile的长度是否小于10,然后抛出异常。

编辑: 如果有人认为问题“过于宽泛”,请留下评论,以便我可以编辑问题并添加任何必要的详细信息。


问题比较广泛,但是这里有一些反馈。1. “安全”可以有很多含义。考虑你要保护的资源以及它们如何被访问。对于你提到的具体任务,也许可以尝试通过HTTPS建立会话并传递令牌,但这本身就可以成为一个完整的问题。2. 有许多因素会影响API请求的延迟。尝试使用性能分析工具确定大部分时间花费在哪里。缓存是一个不错的选择,但要考虑它是在哪里进行的(数据库?会话?应用程序?)。3. 不,绝对不行。 - pieman72
@pieman72 1. 我所说的安全是指只有Android客户端才能访问API。我认为令牌会很好用。2. 你能推荐一个好的分析工具来衡量API性能吗?3. 是的,我不应该信任来自客户端的数据并实施所有必要的检查。 - Archit Verma
你需要根据应用程序堆栈使用不同的工具,但看起来你正在使用Django,也许这个链接可以帮助你:https://code.djangoproject.com/wiki/ProfilingDjango。 - pieman72
1个回答

1

我正在创业,遇到了几乎相同的问题需要解决。唯一的区别在于第一个问题,因为我决定将API访问权限仅限于经过身份验证的用户。然而,这是我解决问题的方法:

1. 如何使我的API安全?

正如我所写的,我将API访问权限仅限于经过身份验证的用户。我使用基于令牌的身份验证,使用自己的REST注册/身份验证API端点,这些端点基于以下软件包:

如果您想使用此解决方案,我建议您还要查看django-rest-auth

2. 如何使我的API快速高效?

如果您有“在短时间内进行的请求,并且很可能返回相同的响应”,我建议您缓存此响应,例如(最简单的版本):

if response_in_cache and time_passed < max_time_frame:
    return response_in_cache
else:
    generate response
    save response in the cache (for next time)
    return response

你也可以使用New Relic来跟踪你的API性能。
3. 我应该相信客户端的数据吗?
绝对不应该!尝试使用django-rest-framework来构建你的RESTful API。它提供了一个名为Serializer的类,可以强大地控制请求/响应的输入/输出。这里有一个例子: 你的序列化器
class CommentSerializer(serializers.Serializer):
    email = serializers.EmailField()
    content = serializers.CharField(max_length=200)
    created = serializers.DateTimeField()

Validation

serializer = CommentSerializer(data={'email': 'foobar', 'content': 'baz'})
serializer.is_valid()
# False
serializer.errors
# {'email': [u'Enter a valid e-mail address.'], 'created': [u'This field is required.']}

请查看序列化文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接