标签: restful-architecture

REST API - 文件(即图像)处理 - 最佳实践

我们正在使用REST API开发服务器,它接受并使用JSON进行响应.问题是,如果您需要将图像从客户端上传到服务器.

另请注意,我在讨论用例,其中实体(用户)可以拥有文件(carPhoto,licensePhoto),还有其他属性(名称,电子邮件...),但是当您创建新用户时,您不会发送这些图像,它们是在注册过程后添加的.


我所知道的解决方案,但每个都有一些缺陷

1.使用multipart/form-data而不是JSON

:POST和PUT请求尽可能是RESTful,它们可以包含文本输入和文件.

缺点:它不再是JSON,与multipart/form-data相比,它更容易测试,调试等

2.允许更新单独的文件

用于创建新用户的POST请求不允许添加图像(在我们的用例中我在开始时的说法是可以的),上传图片是通过PUT请求作为multipart/form-data完成的,例如/ users/4/carPhoto

好的:一切(除了文件上传本身)都保留在JSON中,它很容易测试和调试(你可以记录完整的JSON请求而不用担心它们的长度)

缺点:它不直观,您不能一次POST或PUT实体的所有变量,并且此地址/users/4/carPhoto可以更多地被视为一个集合(REST API的标准用例看起来像这样/users/4/shipments).通常你不能(也不想)GET/PUT实体的每个变量,例如users/4/name.您可以使用GET获取名称,并在用户/ 4处使用PUT进行更改.如果在id之后有什么东西,它通常是另一个集合,比如users/4/reviews

3.使用Base64

将其作为JSON发送,但使用Base64编码文件.

good:与第一个解决方案相同,它尽可能地提供RESTful服务.

缺点:再次,测试和调试更糟糕(正文可以有兆字节数据),大小和处理时间都有所增加 - 客户端和服务器


我真的很想使用解决方案.2,但它有它的缺点...任何人都可以让我更好地了解"什么是最好的"解决方案?

我的目标是使用尽可能多的标准来提供RESTful服务,同时我希望尽可能简化它.

rest json file-upload restful-architecture

140
推荐指数
4
解决办法
9万
查看次数

以RESTful方式在资源上调用服务器端方法

请记住,我对REST有基本的了解.假设我有这个网址:

http://api.animals.com/v1/dogs/1/
Run Code Online (Sandbox Code Playgroud)

现在,我想让服务器让狗吠.只有服务器知道如何执行此操作.假设我想让它在一个CRON工作上运行,这使得狗在永恒的剩余时间内每隔10分钟就会吠叫一次.这个电话是什么样的?我有点想这样做:

网址请求:

ACTION http://api.animals.com/v1/dogs/1/
Run Code Online (Sandbox Code Playgroud)

在请求正文中:

{"action":"bark"}
Run Code Online (Sandbox Code Playgroud)

在你为了构建我自己的HTTP方法而生气之前,请帮助我,让我更好地了解如何以RESTful方式调用服务器端方法.:)

编辑澄清

关于"树皮"方法做什么的更多澄清.以下是一些可能导致不同结构化API调用的选项:

  1. bark只是发送一封电子邮件给dog.email并且没有记录.
  2. bark向dog.email发送电子邮件,并将dog.barkCount增加1.
  3. 当树皮发生时,树皮会创建一个新的"树皮"记录,并带有bark.timestamp记录.它还将dog.barkCount递增1.
  4. bark运行系统命令从Github下载最新版本的狗代码.然后它向dog.owner发送一条短信告诉他们新的狗代码正在制作中.

api rest url api-design restful-architecture

136
推荐指数
2
解决办法
6万
查看次数

资源和端点有什么区别?

我听过"资源"和"端点"都指的是同一件事.资源似乎是一个较新的术语.

他们之间有什么区别?"资源"是否意味着RESTful设计?

api rest uri endpoint restful-architecture

127
推荐指数
3
解决办法
12万
查看次数

我何时在RESTful API中使用路径参数与查询参数?

我想让我的RESTful API非常可预测.决定何时使用URI而不是使用查询参数来分段数据的最佳做法是什么.

对我来说,支持分页,排序和分组的系统参数在'?'之后是有道理的.但是如果像'status'和'region'这样的字段或其他属性来分割你的收藏呢?如果那些也是查询参数,那么知道何时使用路径参数的经验法则是什么?

rest api-design spring-mvc restful-url restful-architecture

98
推荐指数
6
解决办法
6万
查看次数

在django中使用RESTFUL API中的数据的正确方法

我正在尝试学习django,所以当我有一个当前的解决方案时,我不确定它是否遵循django中的最佳实践.我想在我的网站上显示来自网络API的信息.假设api url如下:

http://api.example.com/books?author=edwards&year=2009
Run Code Online (Sandbox Code Playgroud)

Thsis将返回Edwards于2009年撰写的书籍清单.返回以下格式:

{'results':
             [
                {
                   'title':'Book 1',
                   'Author':'Edwards Man',
                   'Year':2009
                },
                {
                   'title':'Book 2',
                   'Author':'Edwards Man',
                   'Year':2009}
           ]
}
Run Code Online (Sandbox Code Playgroud)

目前我正在使用我的视图文件中的API,如下所示:

class BooksPage(generic.TemplateView):
    def get(self,request):
        r = requests.get('http://api.example.com/books?author=edwards&year=2009')
        books = r.json()
        books_list = {'books':books['results']}
        return render(request,'books.html',books_list)
Run Code Online (Sandbox Code Playgroud)

通常,我们从models.py文件中的数据库中获取数据,但我不确定是否应该在models.py或views.py中获取此API数据.如果它应该在models.py中,有人可以举例说明如何做到这一点吗?我特意为stackoverflow编写了上面的例子,所以任何bug都纯粹是在这里编写它的结果.

python django rest restful-architecture

56
推荐指数
1
解决办法
4万
查看次数

在GET中传递数组以进行REST调用

我有一个网址来为这样的用户获取约会:

/user/:userId/appointments
Run Code Online (Sandbox Code Playgroud)

如果我想为多个用户预约,网址应该如何?

它应该是:

/appointments?users=1d1,1d2..
Run Code Online (Sandbox Code Playgroud)

谢谢,克里斯.

rest restful-url restful-architecture

51
推荐指数
4
解决办法
11万
查看次数

如何组合websockets和http来创建一个REST API,使数据保持最新?

我正在考虑使用websockets和http构建REST API,我使用websockets告诉客户端新数据可用或直接向客户端提供新数据.

以下是它如何工作的一些不同的想法:
ws = websocket

想法A:

  1. 大卫得到所有用户 GET /users
  2. 雅各布添加一个用户 POST /users
  3. 将ws消息发送给具有新用户存在信息的所有客户端
  4. 大卫通过ws和电话回复了一条消息 GET /users

想法B:

  1. 大卫得到所有用户 GET /users
  2. 大卫注册以在完成更改时获取ws更新 /users
  3. 雅各布添加一个用户 POST /users
  4. 新用户由ws发送给David

想法C:

  1. 大卫得到所有用户 GET /users
  2. 大卫注册以在完成更改时获取ws更新 /users
  3. Jacob添加一个用户,POST /users它获得id 4
  4. David通过ws收到新用户的id 4
  5. 大卫得到了新用户 GET /users/4

我死了:

  1. 大卫得到所有用户 GET /users
  2. 大卫注册以在完成更改时获取ws更新/users.
  3. 雅各布添加一个用户 POST /users
  4. 大卫收到一条消息,表示已完成更改 /users
  5. 大卫只通过电话获得三角洲 GET /users?lastcall='time of step one'

哪种选择最好,有哪些优缺点?
这是另一个更好的'Idea E'吗?
我们甚至需要使用REST还是需要所有数据?

编辑
为了解决数据不同步的问题,我们可以提供标题
"If-Unmodified-Since"
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Unmodified-Since
或"E-Tag"
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag
或两者都有PUT请求.

rest jax-rs websocket restful-architecture

46
推荐指数
3
解决办法
8675
查看次数

你能在PHP中使用REST吗?如果是这样的话?

我正在开发自己的PHP库,我想从我的API调用RESTful Web服务.这可以在PHP中完成,如果是这样,这样做的基础是什么?

php rest restful-architecture

45
推荐指数
3
解决办法
5万
查看次数

Socket.io和RESTFul如何协同工作?

(我对RESTFul不熟悉,如果我的概念错了,请纠正我)

在RESTFul体系结构中,我们将每个操作映射到URL.如果我点击"发表文章",可能它实际上是URL http://example.com/和一些数据action=post&content=blahblah.

如果我想发布,但不刷新整个网页,我可以使用javascript的XMLHTTPRequest.我发布它然后得到它的内容并将其插入我的页面中的div.这些操作都是异步的.

然后我知道有一些名字WebSocket和它的包装socket.io.它使用"消息"在客户端和服务器之间进行通信.当我点击"发布"时,客户端只需要调用socket.send(data)并等待服务器client.send(data).这很神奇.但URL怎么样?

可以在不重复自己的情况下使用这两种模型吗?换句话说,每个动作都有它的URL,其中一些可以实时与用户交互(通过socket.io?)

而且,我应该这样做吗?在一个非常互动的网络程序(例如游戏)中,RESTFul仍然有意义吗?

node.js socket.io restful-architecture

35
推荐指数
2
解决办法
3万
查看次数

如何为RESTful Web服务创建自定义媒体类型(application/vnd)?

我现在正在玩REST,并认为我正确地实现了HATEOAS,只是为了让所有概念都正确.

为此,我想创建自己的媒体类型(application/vnd[...]+xmlapplication/vnd[...]+json).

第一个问题:媒体类型是否定义了我的服务器和客户端之间的合同?

媒体类型将定义我的消息格式,因此我需要添加XML模式和JSON模式以配合新的媒体类型(以便REST客户端知道消息中的内容以及要发回的内容).

我已经在网上做了一些研究,但缺少一个人如何做到这一点的细节.它是否只涉及编写详尽的规范/文档或是否有一些技术步骤来实现?(我不需要在IANA注册吗?)

如何application/vnd创建一个全新的功能 - 媒体类型?你需要照顾什么才能让客户正确使用它?

media rest hateoas restful-architecture hypermedia

33
推荐指数
1
解决办法
2万
查看次数