【问题标题】:Django Rest Framework - I have working API with curl commands, how can I change it to work with standard http requests in browser?Django Rest Framework - 我有使用 curl 命令的 API,如何更改它以使用浏览器中的标准 http 请求?
【发布时间】:2021-02-14 14:09:01
【问题描述】:

我想我可能误会了什么。我创建了 Django Rest Framework 应用程序。我有使用令牌、query_params 等的 api。

如果我像这样卷曲,一切都会正常工作:

curl -X "GET" http://localhost:8000/api/results 
-H "Content-Type: application/json" 
-H "Authorization: Token eeea084811d9213aa3803946e4464758d66966bc" 
--data 'make=test'

它实际上是返回正确的记录。但通常,在其他网站上,我看到他们正在以这种格式为用户实现他们的 api:

http://www.example.com/?apikey=[yourkey]&

我试图查找将 curl 转换为 http 但我没有发现任何对我有用的东西,现在我很困惑。也许我的 api 目前仅适用于 curl?也许这个“http 调用”需要以某种方式额外实现/编码?

我怀疑这个问题很愚蠢,但不幸的是我还不知道合适的关键字来谷歌它。

【问题讨论】:

    标签: django curl django-rest-framework


    【解决方案1】:

    @Peksio- 实际上,这并不难。如果你使用 Django,你有两个选择

    1. 典型的 Django 方式
    2. DRF 方式

    您可以创建一个 Django 视图 (GET/POST),连接一个 models.py,然后添加 urls.py。如果您希望它成为一个 API,那么您可以根据 HTTP 方法和 Voila 简单地调用端点。你完成了

    DRF 方式更简单。

    1. 安装 Django REST 框架
    2. 创建一个名为 serializers.py 的文件(用于序列化您的模型)
    3. 创建一个类似于 django 视图的视图集。只是你必须添加一个查询集,序列化器
    4. 在 urls.py 中添加一个路由器或只是一个 URL,就大功告成了。

    如果您使用基于令牌的身份验证,那么 DRF 也支持 https://www.django-rest-framework.org/api-guide/authentication/

    对于基于 JWT 的身份验证 https://simpleisbetterthancomplex.com/tutorial/2018/12/19/how-to-use-jwt-authentication-with-django-rest-framework.html

    【讨论】:

    • 感谢您的回答,内容丰富。我还设法找到了解决办法。似乎我很难找到它,因为默认情况下 DRF 不支持通过查询字符串参数进行身份验证,但这篇文章解释了如何让它工作 - stackoverflow.com/questions/29433416/… 不过,谢谢你的解释:)
    【解决方案2】:

    我认为您对 curl 和 HTTP 请求的实际含义有些误​​解。

    curl 和 Web 浏览器都以相同的方式进行 HTTP 请求调用。例如,当您在浏览器中键入 http://www.example.com/?apikey=123 时,浏览器实际上会向 http://www.example.com/?apikey=123 发出 HTTP GET 请求。与此等效的 curl 将是:curl -X "GET" http://www.example.com/?apikey=123,它发送相同的 HTTP GET 请求。

    现在已经清楚了,让我们看看您提供的两种格式之间的区别。

    对于初学者,您需要对 HTTP 请求的实际含义有一个基本的了解。发送到 API 端点的典型 HTTP 请求包括以下内容:

    • 方法 - GET、POST、PATCH...
    • 网址 - http://www.example.com/
    • 查询参数(实际上是 URL 的一部分) - 例如 apikey=123ordering=created_at
    • 标题 - 例如Content-Type: application/jsonAuthorization: apikey 123
    • body - 任何类型的数据(可以是 json、原始文本、二进制等格式)

    现在,您提供的两种格式的唯一区别是授权值(令牌、apikey)的位置。在您的第一种格式中,它作为 Authorization 键的值放置在 HTTP 请求的标头部分中。在您的第二种格式中,它作为 apikey 的值放置在 HTTP 请求的查询参数部分中。

    希望能稍微澄清一下。

    【讨论】:

    • 感谢您的回答,内容丰富。我还设法找到了解决办法。似乎我很难找到它,因为默认情况下 DRF 不支持通过查询字符串参数进行身份验证,但这篇文章解释了如何让它工作 - stackoverflow.com/questions/29433416/… 不过,谢谢你的解释:)
    猜你喜欢
    • 1970-01-01
    • 2010-09-28
    • 2019-05-31
    • 1970-01-01
    • 2013-03-19
    • 2015-01-16
    • 2012-06-12
    • 1970-01-01
    相关资源
    最近更新 更多