设计RESTful API

时间:2015-01-02 16:49:05

标签: django api rest http header

我正在设计REST API作为初创公司Android应用程序的后端服务。该创业公司目前拥有大约10万用户的网络版服务。我对Web API的设计有一些疑问:

  1. 如何确保我的API安全?
  2. 我只希望Android客户端访问API,而不是其他任何人。一种方法是从前端发送加密令牌并在后端解密。还有其他方法吗?另外,我该如何实现呢?

    1. 如何快速高效地使用我的API?
    2. 有一个非常频繁访问的特定端点。但该端点上的信息并没有太大变化。因此,在短时间内做出的请求最有可能返回相同的响应。如何更快地响应此类请求? ETagLast-Modified可以完成这项工作吗?

      1. 我应该信任来自客户的数据吗?
      2. 目前,当我收到带有某个参数的请求时,我对请求执行的唯一检查是检查参数是否为null。例如。如果请求有mobile作为参数,我只检查请求中是否存在mobile参数。我不执行其他检查,例如检查mobile的长度是否小于10然后抛出异常。

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

1 个答案:

答案 0 :(得分: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()

<强>验证

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.']}

查看serializer documentation