我正在开发一个RESTful API,我在为API提供输入的过程中遇到了一些麻烦.
假设我有一个可以像这样获取的"Person"资源:api/person/{id}并返回如下对象:
public class Person
{
public int Id { get; set; }
public string Surname { get; set; }
public string GivenName { get; set; }
public DateTime DateOfBirth { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如果我想更新那个人,API应该期待一个完整的Person实例,还是可以使用单独的DTO?
比如说,DateOfBirth不能改变,接受它作为输入是否被认为是RESTful:
public class UpdatePersonDto
{
public string Surname { get; set; }
public string GivenName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这意味着我将不得不为此端点api/person/{id}恢复Person使用时GET,而作为输入接收UpdatePersonDto使用时PUT.这对我来说听起来不对,但我不确定我是不是只是偏执狂.
所以我想我的问题总结为:接受给定资源端点上的数据结构是否适合与端点返回的数据结构不同?
除了简单的创建(POST),读取(GET),更新(PUT)和删除(DELETE)之外,用REST执行操作是否合适?我对整个RESTful神学都很陌生,所以请耐心等待,但我应该如何完成以下任务:
我最初的想法是1.启用某种身份验证,2.在服务器端响应GET调用,保留空间并返回结果,以及3.通过DELETE调用立即提供对象的"保留".这仍然是RESTful吗?
我正在尝试设计一个充分利用超媒体的RESTful服务.
优选地,用户代理应该只知道根URI,以便能够探索服务的所有功能 - 也就是说,我希望它在成熟度模型中处于第3级.
现在,用户代理应该能够创建一些资源,并在以后编辑它们.在创建/编辑时,用户代理需要访问其他一些资源/枚举.
foo资源:
{
"category" : "category chosen from an enumeration of possible categories",
"color" : "color chosen from an enumeration of possible colors",
"aRelatedResource" : "resource identifier from chosen from a collection"
}
Run Code Online (Sandbox Code Playgroud)
鉴于前面提到的要求,我提出了以下模式:
有一个fooRoot资源:
{
// no properties, only links
"_links" : {
"foos" : { "href" : "URI-to-foos" },
"fooCreator" : { "href" : "URI-to-plain-fooWriter" }
}
}
Run Code Online (Sandbox Code Playgroud)
包括链接到fooWriter在FOO资源:
foo资源:
{
"category" …Run Code Online (Sandbox Code Playgroud) 在使用API的移动性环境中,高级研究提出了必须由服务器返回的几个动态过滤器.(我们不想与服务器进行太多交换来初始化我们的过滤器)
在REST api中,如何为过滤器搜索公开可能值的枚举?
谢谢你的建议/想法?
我有一个具有多个属性的实体,比如说"项目".除了简单的属性,项目可能有一个«状态»列表,其中最后一个是当前的.我有一个Web表单来创建/编辑项目.可以在此表单中更改此项目的所有属性,并且用户还可以为项目添加新状态(但不能更改或删除旧状态).
项目状态是纯粹的复合实体,它们在项目范围之外没有任何独特的含义或标识,并且它们不能直接处理,因此它们显然不值得使用特殊的根REST资源.
根据REST架构,我创建了一个名为/ projects的资源.POST用于创建新项目,PUT用于更改现有项目.
但是,我不希望客户端将项目与其所有历史状态一起推送,首先是因为此集合太重,其次是因为业务逻辑仅允许添加状态,而不是更改或删除它们,因此将项目设置为PUT无论如何,连同其所有状态都没有任何意义.
仅具有新状态的项目也不是一种选择,因为它违反了PUT的幂等性.
我也不喜欢在第二个HTTP请求中发布状态的想法,例如/ project/{id}/status,因为这会从用户的角度打破更新操作的原子性.如果第二个请求在线路上丢失,则项目将与编辑它的用户不一致(属性已更改,但状态保持不变).创建RESTful"事务"对于更新看似单一的实体这一简单任务来说似乎有点过分(并且也容易出错).
这种问题在我的工作中非常普遍,并且可以如此概括:更新复杂的复合实体的REST非常正确和原子的方式是什么,业务逻辑只允许部分更新?
在API中进行搜索的最佳做法是什么?
我遇到了一些关于 REST 的资源,但我无法清楚地理解事情。如果有人可以就我下面的示例解释一些事情,那将对我有所帮助。
我有一张名为 User
User 表格内容
id name
1 xxx
Run Code Online (Sandbox Code Playgroud)
我要调用的 URL 是 /test/1
结果将采用 JSON 格式,例如: { 1: "xxx" }
到目前为止,我对 REST 的理解:
请让我知道我的理解是否正确。否则,请回答以下问题:
我的应用程序的基本架构是React前端,它使用位于多语言存储层之上的RESTful API.
前端:
反应消费API
后端:
Python
Flask
验证
Auth0 + OKTA
一切都很好.但是,我需要为用户提供不同的角色.换句话说,我需要根据角色控制用户可以对资源执行的操作.
示例:
-User A想要添加一个新用户
- 他的请求中有一个令牌,所以我知道用户A是经过身份验证的
- 所以我需要确保他实际上可以根据他的角色添加用户.
我不想像其他解决方案中建议的那样硬编码用户角色,我想允许添加自定义角色.
此外,我想尊重人们的时间,所以如果有资源解决我的问题,请随时指出.
这些是我的问题:
1.是否有任何最佳实践来实现我想要实现的目标?
你能指点我讨论授权(不是认证)的例子或教程吗?
3.如果经过身份验证的用户也可以执行操作,或者我是否在授权后以某种形式提供角色,我是否检查每个服务呼叫?因此服务请求包含身份验证和授权令牌?(这似乎很容易破解,所以我猜不是......)
如果我对授权主题感到困惑,那是因为我.请随时向我指出任何对您有帮助的资源.
提前感谢您抽出宝贵时间提供帮助!对此,我真的非常感激.
rest authorization role-base-authorization python-3.x restful-architecture
我目前正在开发一个Angular 2应用程序.在开发过程中,我开始使用TypeScript类从JSON创建对象,我通过HTTP或在表单中创建新对象时创建对象.
例如,该类可能看起来像这样.
export class Product {
public id: number;
public name: string;
public description: string;
public price: number;
private _imageId: number;
private _imageUrl: string;
constructor(obj: Object = {}) {
Object.assign(this, obj);
}
get imageId(): number {
return this._imageId;
}
set imageId(id: number) {
this._imageId = id;
this._imageUrl = `//www.example.org/images/${id}`;
}
get imageUrl(): string {
return this._imageUrl;
}
public getDTO() {
return {
name: this.name,
description: this.description,
imageId: this.imageId,
price: this.price
}
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,上面显示的这个解决方 但现在让我们假设对象中有更多属性,我想要一个干净的DTO(例如没有私有属性),通过POST将此Object发送到我的服务器.一个更通用的getDTO()功能怎么样?我想避免列出很长的财产分配清单.我在考虑为属性使用装饰器.但我真的不知道如何使用它们来过滤DTO的属性.
software-design restful-architecture typescript ecmascript-6
对于我们的Web api项目,我们使用以下url版本控制系统:
HTTPS:// {FQDN}/{apiVersion}/{apiResourceName}/{resourcePath} {参数}?
例如,我们可以有如下内容:
https://myapi.mysite.com/v1/customer/2
现在考虑上面,假设您想要向客户发布两个版本(实时,测试).一个实时版本(使用实时数据),另一个是测试(使用测试数据进行客户开发测试).
对于直播,我可以轻松使用我提到的那个:https://myapi.mysite.com/v1/customer/2.
你如何命名上述api的测试版?什么是api url版本v1的测试版本?可以指定测试api url吗?
使用url版本控制时,API {fqdn}的完全限定域名的最佳做法是什么?
rest ×9
api ×3
restful-url ×2
ecmascript-6 ×1
enums ×1
hypermedia ×1
json ×1
python-3.x ×1
typescript ×1
web ×1