我们正在使用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有基本的了解.假设我有这个网址:
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调用的选项:
我听过"资源"和"端点"都指的是同一件事.资源似乎是一个较新的术语.
他们之间有什么区别?"资源"是否意味着RESTful设计?
我想让我的RESTful API非常可预测.决定何时使用URI而不是使用查询参数来分段数据的最佳做法是什么.
对我来说,支持分页,排序和分组的系统参数在'?'之后是有道理的.但是如果像'status'和'region'这样的字段或其他属性来分割你的收藏呢?如果那些也是查询参数,那么知道何时使用路径参数的经验法则是什么?
我正在尝试学习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都纯粹是在这里编写它的结果.
我有一个网址来为这样的用户获取约会:
/user/:userId/appointments
Run Code Online (Sandbox Code Playgroud)
如果我想为多个用户预约,网址应该如何?
它应该是:
/appointments?users=1d1,1d2..
Run Code Online (Sandbox Code Playgroud)
谢谢,克里斯.
我正在考虑使用websockets和http构建REST API,我使用websockets告诉客户端新数据可用或直接向客户端提供新数据.
以下是它如何工作的一些不同的想法:
ws = websocket
想法A:
GET /usersPOST /usersGET /users想法B:
GET /users/usersPOST /users想法C:
GET /users/usersPOST /users它获得id 4GET /users/4我死了:
GET /users/users.POST /users/usersGET /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请求.
我正在开发自己的PHP库,我想从我的API调用RESTful Web服务.这可以在PHP中完成,如果是这样,这样做的基础是什么?
(我对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仍然有意义吗?
我现在正在玩REST,并认为我正确地实现了HATEOAS,只是为了让所有概念都正确.
为此,我想创建自己的媒体类型(application/vnd[...]+xml和application/vnd[...]+json).
第一个问题:媒体类型是否定义了我的服务器和客户端之间的合同?
媒体类型将定义我的消息格式,因此我需要添加XML模式和JSON模式以配合新的媒体类型(以便REST客户端知道消息中的内容以及要发回的内容).
我已经在网上做了一些研究,但缺少一个人如何做到这一点的细节.它是否只涉及编写详尽的规范/文档或是否有一些技术步骤来实现?(我不需要在IANA注册吗?)
如何application/vnd创建一个全新的功能 - 媒体类型?你需要照顾什么才能让客户正确使用它?
rest ×9
api ×2
api-design ×2
restful-url ×2
django ×1
endpoint ×1
file-upload ×1
hateoas ×1
hypermedia ×1
jax-rs ×1
json ×1
media ×1
node.js ×1
php ×1
python ×1
socket.io ×1
spring-mvc ×1
uri ×1
url ×1
websocket ×1