表现良好的 RESTful 客户端交互

2024-03-18

我有一个关于实现严格遵守 REST 架构原则的数据访问客户端的似乎相当简单的问题。首先,我们假设我有一个运行良好的 REST API,我想使用 Django 应用程序来使用它。我将首先发现哪些服务可用(为后续内容编辑):

GET example.com/services/ HTTP/1.1

HTTP/1.1 200 OK
<?xml version="1.0" encoding="UTF-8"?>
<services>
  <service>
    <name>Widgets</name>
    <link>http://example.com/services/widgets/</link>
    <item_link>http://example.com/services/widgets/{widget_id}/</item_link>
  </service>
  <service>
    <name>Factories</name>
    <link>http://example.com/services/factories/</link>
    <item_link>http://example.com/services/factories/{factory_id}/</item_link>
  </service>
  ...
</services>

现在,由于我正在构建一个基于使用此 API 的 Django 应用程序,我将如何继续以 REST方式继续探索这些服务?为了遵守 REST 原则,我的应用程序必须由接收到的超媒体驱动。我想第一步很简单——通过给定的名称与服务交互。我设置了一个 Django 视图,如下所示:

def get_service(request, service_name):
    doc = etree.parse(urllib.urlopen('http://example.com/services/'))
    uri = doc.xpath("service/name[.='%s']/following-sibling::*" % service_name)[0].text
    ...

我将从中执行另一个请求(为后续内容编辑):

GET example.com/services/widgets/ HTTP/1.1

HTTP/1.1 200 OK
<?xml version="1.0" encoding="UTF-8"?>
<widgets>
  <item_link>http://example.com/services/widgets/{widget_id}/</item_link>
  <widget>
    <id>1</id>
    <name>Whizbang Foobar</name>
    <link>http://example.com/services/widgets/1</link>
  </widget>
  ...
</widgets>

现在,我将在渲染的 Django 模板中显示一个简单的小部件列表。但从这里开始,我如何继续以 REST方式与该服务交互?也许我已经把自己搞糊涂了,但唯一的办法就是合理的我能想到的办法是实现大量应用程序视图或瘦 Django 数据模型来持久保存服务 URI。

我主要担心的是,如果不严格遵守 REST 架构准则,这是微不足道的,但我觉得我在尝试这样做时完全错过了机会。我知道设计正确的 REST API 和客户端并不“容易”,但似乎我迫切需要一个类似的示例来完成实际的实现。

对于这个问题的冗长和冗长以及不可避免的枯萎读者的捂脸,我深表歉意。

跟进:

以下是实现这些交互的有效方法(使用 URI 模板)吗?出于演示目的(代替更抽象的实现),使用另一个 Django 视图来检索资源集合项:

def get_item(request, service_name, item_id):
    doc = etree.parse(urllib.urlopen('http://example.com/services/'))
    uri = doc.xpath("service/name[.='%s']/following-sibling::item_link" % service_name)[0].text
    ...

那么接下来的请求:

GET example.com/services/widgets/1 HTTP/1.1

HTTP/1.1 200 OK
<?xml version="1.0" encoding="UTF-8"?>
<widget>
  <id>1</id>
  <name>Whizbang Foobar</name>
  <tags>foo bar baz ham eggs</tags>
  <index_link>http://example.com/services/widgets/</index_link>
</widget>

我主要担心的是,如果不严格遵守 REST 架构准则,这是微不足道的,但我觉得我在尝试这样做时完全错过了机会。我知道设计正确的 REST API 和客户端并不“容易”,但似乎我迫切需要一个类似的示例来完成实际的实现。

我能找到的最好的例子是太阳云API http://kenai.com/projects/suncloudapis/pages/Home。大多数文档描述了系统使用的各种媒体类型,这似乎是实现此类目标的关键。

我发现在开发 API 的同时编写客户端会很有帮助。这样您就可以立即发现可能导致 API 编码困难的因素并解决问题。

这并不容易。如果您遵循 HATEOAS 约束得出其逻辑结论,您定义的每种媒体类型都将由一系列客户端之一处理。如果您可以使所有资源遵循类似的行为模式,那么您编写客户端的工作就会变得更加容易。

例如,您可以定义一个媒体类型“索引”,仅列出相关资源。索引定义用于分页、获取列表中的项目、按名称查找项目等的链接。

然后,您可以定义一个名为“Item”的基本媒体类型。 Item 有一个链接,用于显示其父 Index、更新/删除自身等。然后,您的资源 Widget 可以由两种不同的媒体类型表示 - 一种是 Index,另一种是基于 Item。

您可以首先实现一个处理 Index 媒体类型的类。然后,您可以编写一个基类来处理所有常见的 Item 媒体类型行为。最后,您可以编写一个 Widget 客户端来处理所有特定于 widget 的行为并扩展 Item 客户端。这些客户端可以按照其编写语言的惯用方式公开其功能(更多链接和数据字段的可用性)。

处理来自服务器的响应只需将响应的 MIME 类型与您编写的客户端之一进行匹配即可。

换句话说,即使您的服务的客户端作为一个整体将由许多范围有限的客户端组成,但它们每个都将基于共同的行为,因此可以以 DRY 方式实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

表现良好的 RESTful 客户端交互 的相关文章

  • Django - 在基于类的视图中从另一个类方法调用一个类方法

    我在基于 django 类的视图中有一个方法 例如称为get player stats 我想从这个方法中调用同一个类中的另一个方法 但我无法这样做 代码如下 class ScoreView TemplateView def get play
  • 删除 Django 1.7 中的应用程序(和关联的数据库表)

    是否可以使用 Django 1 7 迁移来完全删除 卸载应用程序及其所有跟踪 主要是其所有数据库表 如果没有 在 Django 1 7 中执行此操作的适当方法是什么 python manage py migrate
  • 在没有模型的情况下将自定义页面添加到 django admin

    我正在尝试在没有模型关联的情况下向管理员添加自定义页面 这就是我迄今为止所取得的成就 class MyCustomAdmin AdminSite def get urls self from django conf urls import
  • Django while 循环

    我想知道是否有任何方法可以在 django 中执行 while 循环 我认为这就是我所追求的 我想做的是一个嵌套的 ul li 列表 该列表是由 for 循环中的 for 循环生成的 但由于第二个 for 循环中的某些元素有更多的子节点 我
  • Mac OSX 10.6 上的 Python mysqldb 不工作

    我正在使用 Python 2 7 并尝试让 Django 项目在 MySQL 后端运行 我已经下载了 mysqldb 并按照此处的指南进行操作 http cd34 com blog programming python mysql pyth
  • rabbitmq 的 REST API

    有没有办法从 ajax 向 RabbitMQ 发送数据 我的应用程序由数千个 Web 客户端 用 js 编写 和 WCF REST 服务组成 现在我试图弄清楚如何为我的应用程序创建可扩展点 这个想法是有一个rabbitmq实例 它从放置在一
  • 当数据库不是 Django 模型时,是否可以使用数据库中的表?

    是否可以从应用程序数据库中的表获取查询集 该表不是应用程序中的模型 如果我有一个不是名为 cartable 的模型的表 从概念上讲 我想这样做 myqueryset cartable objects all 有没有相对简单的方法来做到这一点
  • 在 Django 查询中使用 .extra(select={...}) 引入的值上使用 .aggregate() ?

    我正在尝试计算玩家每周玩游戏的次数 如下所示 player game objects extra select week WEEK games game date aggregate count Count week 但姜戈抱怨说 Fiel
  • 无法覆盖 save_model django admin?

    我不明白我做错了什么 我希望用户只添加公告模型的标题和描述 其余部分应自动填充 这是我的模型 class Annoucement models Model username models ForeignKey User on delete
  • 如何重写 Django 中的 model.Manager.create() 方法?

    我有很多Hardware模型有一个HardwareType具有各种特征 就像这样 models py from django db import models class HardwareType model Models name mod
  • 如果django项目位于子文件夹和子域中,如何编写.htaccess?

    我的 django 站点的路径是 staging ninjawebsite com clients project 我希望将其视为基本网址 django 项目位于public html clients project子文件夹 一切似乎都工作
  • Django中的自动递增值

    我在 django 中有一个表并尝试自动递增它的序列号 在自定义模板中 for 循环用于变量 自定义模板 for i in getodeskview tr td 1 td td i odesk id td td i hours td td
  • 电子商务是否从头开始

    我需要开发一个包含电子商务部分的新网站 我来这里是想从你那里得到一些关于我应该走哪条路的提示 该网站将有一个静态部分 其中包括一些静态页面和用于销售产品的电子商务部分 我是 Django 和 PHP 开发人员 但这是我第一次需要开发电子商务
  • 数据未保存为加密数据 django

    到目前为止 我尝试了超过 6 个插件 但现在很沮丧 现在用的是这个密码学 https pypi org project django cryptography 一切都很好并相应地完成 但是当我像这样在模型管理器中保存数据时 def crea
  • 从 WCF REST 获取错误详细信息

    我有一个由 Net WCF 客户端使用的 REST 服务 遇到错误时 REST 服务会返回 HTTP 400 错误请求 响应正文包含 JSON 序列化详细信息 如果我使用 Fiddler Javascript 或直接从 C 执行请求 我可以
  • 使用 django-social-auth 登录后获取 Facebook 数据

    我们已经建立了一个应用程序 使用django social auth使用 Facebook 验证用户身份的扩展 身份验证工作正常 但我们不清楚如何从 Facebook 获取有用信息 好友列表 点赞等 看起来django facebook处理
  • 放心 + 模拟 MVC @ControllerAdvice

    在我的项目中 我使用 Rest Assured MockMVC 并具有以下依赖项
  • IIS 上的 Django:调试由于大文件上传上的 FastCGI 请求超时而导致的 IIS 错误

    我正在尝试在带有 IIS 10 和 FastCGI 的 Windows 10 计算机上托管 Django Web 应用程序 虽然到目前为止一切都运行良好 但我在上传较大文件 120MB 时遇到了某些 POST 请求的问题 即 HTTP 50
  • 如何在Django中获取某个组的所有用户?

    我想获取 Django 组中所有用户的列表 例如 User objects filter group Staff 我在文档中的任何地方都找不到如何执行此查询 以下查询解决了我的问题 User objects filter groups na
  • 如何在亚马逊 EC2 上调试 python 网站?

    我是网络开发新手 这可能是一个愚蠢的问题 但我找不到可以帮助我的确切答案或教程 我工作的公司的网站 用 python django 构建 托管在亚马逊 EC2 上 我想知道从哪里开始调试这个生产站点并检查存储在那里的日志和数据库 我有帐户信

随机推荐

  • MongoDB shell中无序批量更新记录

    我有一个包含数百万个文档的集合 类似于以下内容 id ObjectId value 0 53 combo h 0 v 0 42 h 1 v 1 32 问题是这些值存储为字符串 我需要将它们转换为浮点 双精度 我正在尝试这个并且它正在工作 但
  • 在函数中使用非静态值作为默认参数

    有没有一种好的方法可以将非静态值作为函数中的默认参数 我见过一些对同一问题的较旧的回答 这些回答总是以明确地写出超载而告终 这在 C 17 中还有必要吗 我想做的是做类似的事情 class C const int N Initialized
  • 请推荐一个可处理可拖动元素碰撞检测的 JQuery 插件 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我们正在使用可拖动 http jqueryui com demos draggable JQuery UI 插件 需要禁止元素之间重叠 我
  • 最终方法是否会阻止 Hibernate 为此类实体创建代理?

    Hibernate 使用代理来实现集合的延迟加载 甚至单端关联 根据Hibernate的 3 6 5 参考文档 部分 21 1 3 单端关联代理 如果这样的代理包含 任何最终方法 我的问题是 此限制仅适用于持久字段的 getter sett
  • 如何使用 Jackson (2.x) 提供程序设置 Jersey 客户端来处理 POST 请求

    我正在努力设置 Jersey 客户端来测试对资源的 POST 请求 我的 Jersey 和 Jackson 依赖项如下所示
  • 更改传单标记图标

    我正在使用 Dennis Wilhelm 的 Leaflet Slider 在 Leaflet 地图上显示数据的变化 我正在尝试更改标记图标 但效果不佳 那么 当使用Leaflet Slider显示随时间的变化时 如何更改标记图标呢 我必须
  • 在 Excel 中计算静态随机数(计算一次)

    我正在寻找一种在 Excel 中计算一次随机数的方法 所以它是在第一次调用时计算的 但之后它就不会改变 举例来说 如果我在 B1 有这样的东西RANDONCE A1 然后我第一次在 A1 中输入一个值时 它会计算一个随机值 但随后它不会再次
  • 如何在TPM中加载和使用持久对称密钥?

    我只是想将一个 32 字节长的对称密钥持久存储在 TPM 的 NV 存储中 并在重新启动后使用它 无需将其从 TPM 中取出 来加密小型数据 我尝试用两种不同的方式做到这一点 1 使用 TPM 的随机字节生成器创建密钥 在NV中定义空间并将
  • Ruby 电子邮件编码和引用的可打印内容

    有没有一种直接的方法来指导 TMail 将正文编码为 quoted printable 我只看到其中用于解码此类内容的方法 而不是创建它 你刚刚使用吗TMail 或者你正在使用它ActionMailer 看起来像TMail本身不具备编码为q
  • Java从其他目录导入

    我正在使用 Java 构建企业服务总线 ESB 我不会进入 细节但我必须构建多个使用相同类的服务器 我有以下目录结构 server1 Main java server2 Main java com Database java 我想从Main
  • ngx-bootstrap - 用于输入的时间选择器弹出窗口

    我正在使用time picker组件来自ngx引导程序 https valor software com ngx bootstrap timepicker我想包括time picker如下输入框 更多以弹出对话框的方式 用于日期选择器 ht
  • OrderedDictionary、ListDictionary 和 HybridDictionary 需要什么?

    当三种不同的字典 OrderedDictionary ListDictionary 和 HybridDictionary 都执行相似的功能时 它们的需求是什么 它们都没有排序 并且可以通过所有集合中的键来检索集合的元素 那么 三个不同类的目
  • bootstrap css,如何在容器内制作全宽div

    我想用引导框架制作这种布局 menu x full width site content
  • 单元测试中的元素在完成后仍待处理

    运行测试后 我在 Resharper 中看到此警告 所有测试都通过了 2018 08 09 11 11 58 524 WARN 元素 Data Tests Infra IntegrationTests ResolvedIdentityTes
  • 如何对 CollapsingToolbarLayout 的展开标题进行多行排列?

    我的问题是下一个 我会使用相对较大的文本作为 CollapsingToolbarLayout 标题 因此我需要将其显示为多行模式 当我尝试通过更改文本外观时setExpandedTitleTextAppearance 方法行不通 我使用的代
  • Android Volley ImageLoader - BitmapLruCache 参数?

    我在使用新的 Volley 库实现图像缓存时遇到问题 在演示中 代码如下所示 mRequestQueue Volley newRequestQueue context mImageLoader new ImageLoader mReques
  • 如何防止IE10中contenteditable ul被误删除?

    我想在页面上有一个内容可编辑的 ul 但是 在 Internet Explorer 10 中 如果您单击进入 使用右键单击菜单或 CTRL A 选择全部 然后删除 ul 元素将从页面中删除 防止这种情况的最佳方法是什么 或者至少检测它何时发
  • 用于覆盖文件的 CodeDeploy 配置

    我正在通过部署CodeDeploy目标实例中的logstash配置 etc logstash 这是 3 阶段的最后一步CodePipeline 但是它失败并显示消息 部署失败 因为此位置已存在指定文件 etc logstash pipeli
  • javascript 的 magento 转义字符串

    是否有一个辅助函数可以正确转义要呈现为单引号引用的 JavaScript 字符串文字的字符串 我知道 jsQuoteEscape 但它只处理引号而不处理 n r 等 所以如果我的字符串是 line1 nlineb 即两行之间有换行符 我用
  • 表现良好的 RESTful 客户端交互

    我有一个关于实现严格遵守 REST 架构原则的数据访问客户端的似乎相当简单的问题 首先 我们假设我有一个运行良好的 REST API 我想使用 Django 应用程序来使用它 我将首先发现哪些服务可用 为后续内容编辑 GET example