标签: restful-architecture

设计休息Web服务的最佳方法,其中包含要从浏览器中使用的二进制数据

我正在开发一个json rest web服务,它将使用使用backbone.js构建的单个网页应用程序来使用

该API将允许消费者上传与某个实体相关的文件,例如与项目相关的pdf报告

谷歌搜索并在堆栈溢出做一些研究我带来了这些可能的方法:

第一种方法: base64编码数据字段

POST: /api/projects/234/reports
{
  author: 'xxxx',
  abstract: 'xxxx',
  filename: 'xxxx',
  filesize: 222,
  content: '<base64 encoded binary data>'
}
Run Code Online (Sandbox Code Playgroud)

第二种方法:多部分形式的帖子:

POST: /api/projects/234/reports
{
  author: 'xxxx',
  abstract: 'xxxx',
}
Run Code Online (Sandbox Code Playgroud)

作为回复我会得到一个报告ID,然后我会发一个帖子

POST: /api/projects/234/reports/1/content
enctype=multipart/form-data
Run Code Online (Sandbox Code Playgroud)

然后只发送二进制数据

(看看这个:https://stackoverflow.com/a/3938816/47633)

第三种方法:将二进制数据发布到单独的资源并保存href

首先,我在客户端生成一个随机密钥,并在那里发布二进制内容

POST: /api/files/E4304205-29B7-48EE-A359-74250E19EFC4
enctype=multipart/form-data
Run Code Online (Sandbox Code Playgroud)

然后

POST: /api/projects/234/reports
{
  author: 'xxxx',
  abstract: 'xxxx',
  filename: 'xxxx',
  filesize: 222,
  href: '/api/files/E4304205-29B7-48EE-A359-74250E19EFC4'
}
Run Code Online (Sandbox Code Playgroud)

(见:https://stackoverflow.com/a/4032079/47633)

我只是想知道我是否可以使用任何其他方法,每种方法的优点/缺点,以及是否有任何已建立的方法来处理这种要求

我对第一种方法的看法是,我必须在客户端上完全加载和base64编码文件

一些有用的资源:

rest binary-data backbone.js restful-architecture

31
推荐指数
3
解决办法
1万
查看次数

在RESTful API请求中指定资源字段列表的方法

我在Web服务中使用RESTful API,具有某些资源,如用户,帖子等.当我提出帖子列表(GET /帖子)的请求时,我想要检索每个帖子(即主题,作者姓名)的减少部分数据的帖子数组.当我提出具体帖子的请求(GET/posts/42)时,我想检索帖子对象字段的完整列表,包括大帖子体,关于喜欢计数,评论计数的其他信息.我想存在很多解决这个问题的方法.在我看来,最明显的3个是:

  1. 在每个请求上明确指定字段lits(/ posts?fileds = subject,author_name和for/posts/42?fields = subject,body,createaAt,author_name,comments_count,likes_count等...).
  2. 仅当字段列表与默认字段列表不同时才明确指定字段列表.
  3. 如果所需字段设置与默认字段不同,请指定应从(设置)默认字段中排除(或包含)的字段列表.

我要为我的客户构建清晰有用的API.我应该选择哪种方式?

api rest restful-architecture

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

关于使用OAuth使用自己的API的问题

我正在为我正在开发的项目构建一个RESTful API,我想让主应用程序使用API​​,因为:

  1. 这将导致维护一组代码
  2. 如果我们决定公开第三方开发者的API,那么它已经完成了
  3. 它开辟了制作消费它的移动应用程序的可能性
  4. 我真的想学习如何做到这一点

API将托管在子域中https://api.example.com,主Web应用程序将托管在根域中https://example.com.

从概念上讲,我理解一切是如何工作的,但我的主要问题是如果认证流程将会发生变化.通常第三方应用程序将:

  1. 从中获取请求令牌 https://api.example.com/request_token
  2. 重定向用户以进行身份​​验证 https://api.authenticate.com/authorize
  3. 重定向回第三方应用程序
  4. 从中获取访问令牌 https://api.example.com/access_token

由于我控制两个域,我可以做类似的事情:

  1. 当用户登陆登录屏幕时获取请求令牌 https://www.example.com
  2. 用户使用https://www.example.com调用相同代码的表单进行身份验证https://api.example.com/authorize
  3. 如果凭据有效,则交换请求令牌以获取访问令牌
  4. 访问令牌保存在会话中,并在用户像往常一样注销时到期

第3步感觉它是错的,因为会有重复的代码,但是它不会打开我的XSS攻击是https://www.example.com发送数据的登录表单,https://api.example.com因为它们在技术上是不同的域?

我是不是太复杂了?

authentication api rest oauth restful-architecture

28
推荐指数
1
解决办法
4097
查看次数

如何让Laravel为JSON REST API返回自定义错误

我正在开发某种RESTful API.发生一些错误时,我抛出一个App::abort($code, $message)错误.

问题是:我希望他抛出一个带有"代码"和"消息"键的json形成的数组,每个数组包含上面提到的数据.

Array
(
    [code] => 401
    [message] => "Invalid User"
)
Run Code Online (Sandbox Code Playgroud)

有没有人知道它是否可能,如果可能,我该怎么做?

php rest json restful-architecture laravel-4

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

REST - 何时使用400("错误请求")

我有一个像sales/customers/{customerno}这样的资源.如果客户端向此资源发送PUT请求,则如果实体主体中的xml无效,则返回400 - Bad请求.但是,如果xml有效,但xml的内容无效,该怎么办?比如说客户端正在尝试更新客户PostCode并提供无效的PostCode.返回400是否正确 - 在这种情况下是错误的请求,还是我应该使用的另一个http代码?

xml rest http-status-codes http-status-code-400 restful-architecture

25
推荐指数
2
解决办法
4万
查看次数

基于用户查看权限的不同REST资源内容

我想根据访问权限为不同的用户提供相同问题的不同答案.我读了这个问题:

在RESTful响应中排除私有数据

但我不接受的答案,其中指出,应同时提供一致/people.xml/unauthenticated/people.xml,因为我的REST的理解是,特定资源应该生活在一个特定的位置,而不是几个要看你如何其信息多有兴趣在.

我正在设计的系统比那个系统复杂得多.假设用户创建了许多朋友圈,并为他们分配了不同的访问权限.例如,我的"熟人"圈可能可以访问我的生日,而我的"专业"圈子可能可以访问我的工作经历,但不是相反.为了从我所提到的问题,适用的答案,我需要让所有的用户的圈子(我可能要保持出于安全原因的秘密)的一种方式,然后经过/circles/a/users/42,/circles/b/users/42,/circles/c/users/42等等,然后合并结果以显示可用的最大信息量.显然,没有一个圆圈可以获得任何其他圈子获得的所有信息.我认为这很棘手(请注意,我可能需要使用几种对象来执行此操作,未来版本可能需要不同的过程),但如果我想对特定用户施加安全限制,尽管他也是在我的一些圈子里?这个问题甚至可以解决吗?即使我拒绝回复上述任何一个问题并提出一个可以给我答案的新查询,它仍然会揭示这样一个事实,即由于个人访问限制,这个特定用户的处理方式不同.

我在这里错过了什么?我甚至可以开发RESTful Web服务吗?

如果结论是行为不是RESTful,那么这仍然会构成违反REST合同在道德上可行的情况吗?如果是这样,有什么负面影响?例如,我是否存在代理缓存问题的风险?

api rest web-services access-rights restful-architecture

22
推荐指数
2
解决办法
5457
查看次数

RESTful GET响应是否应该返回资源的ID?

这里的一些开发人员正在讨论关于来自RESTful APIGET请求是否应该返回所请求资源的ID的友好(有些人会说是宗教性的).我们假设以下GET请求:

http://my.api.com/rest/users/23

目前返回:

{"name": "Jim", "age": 40, "favoriteColor": "blue"}
Run Code Online (Sandbox Code Playgroud)

请注意,结果集中缺少"id".

基本上有4个阵营与这个问题作斗争.

CAMP#1:当呼叫者发出GET请求时,他们已经知道了ID.因此,结果集应该包括ID.如果调用者需要此数据来启用UI编辑,则调用者需要通过ID 23,可能手动将成员{"id":23}添加到JSON.
Camp#1中的人员也认为结果集中ID的存在表明该值可以被修改,当然它不能.

CAMP#2:没有ID,JSON结果集本身不能用于UI表单中的编辑/更新操作.相反,AJAX回调机制需要负责传递ID字段并手动将这些字段添加到结果集中.这似乎很笨拙且容易出错.UI人员正在争论结果集"感觉"就像缺少应该存在的数据,即ID.

营地#3:这些人关心的是一致性.如果我们有API返回的用户对象集合,这些对象必须包含ID.因此,为了保持一致性,GET的单例版本还应包含ID.

CAMP#4:这些人建议用户的GET请求可以返回包含ID的HyperMedia或SelfLinks形式的元数据.

这不是一个深奥的"谁是对的?" 争论,或者.我们采用的方法将决定API的形状,并影响几个开发人员在新的几周内的工作量.

api rest json data-consistency restful-architecture

22
推荐指数
1
解决办法
9566
查看次数

如何构建REST资源层次结构?

我是服务器端Web开发的新手,最近我一直在阅读很多关于实现RESTful API的内容.我仍然坚持的REST API的一个方面是如何构建URI层次结构,以识别客户端可以与之交互的资源.具体来说,我一直在决定如何制作层次结构以及在资源由其他资源类型组成的情况下该怎么做.

这是一个有希望展示我的意思的例子.想象一下,我们有一个Web服务,允许用户从其他用户购买产品.所以在这个简单的例子中,有两个顶级资源用户产品.这是我开始构建URI层次结构的方式,

对于用户:

/users
      /{id}
           /location
           /about
           /name
           /seller_rating
           /bought
           /sold
Run Code Online (Sandbox Code Playgroud)

对于产品:

/products
         /{id}
              /name
              /category
              /description
              /keywords
              /buyer
              /seller
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,每个层次结构中的对象都引用另一个层次结构中的对象的子集.例如/users/{id}/bought,某个用户已购买的产品列表,这是其中的一个子集/products.此外,/products/{id}/seller引用销售特定产品的用户.

由于这些URI引用其他对象或其他对象的子集,因此API应该支持以下内容:/users/{id}/bought/id/description/products/{id}/buyer/location?因为如果支持这些类型的URI,那么什么是阻止这样的东西/users/{id}/bought/{id}/buyer/bought/{id}/seller/name,或者同样令人费解的东西呢?此外,在这种情况下,您将如何处理路由,因为服务器中的路由器必须解释任意长度的URI?

api rest uri restful-url restful-architecture

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

Django POST URL错误

我试图通过输出Json在Django中创建REST Api.如果我在终端使用curl发出POST请求,我会遇到问题.我得到的错误是

您通过POST调用此URL,但URL不以斜杠结尾,并且您设置了APPEND_SLASH.在保持POST数据时,Django无法重定向到斜杠URL.将表单更改为指向127.0.0.1:8000/add/(注意斜杠),或在Django设置中设置APPEND_SLASH = False.

我的url.py是

    from django.conf.urls.defaults import patterns, include, url
import search

# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()

urlpatterns = patterns('',

    url(r'^query/$', 'search.views.query'),
    url(r'^add/$','search.views.add'),
)
Run Code Online (Sandbox Code Playgroud)

我的意见是

# Create your views here.
from django.http import HttpResponse
from django.template import Context,loader
import memcache
import json

def query(request):
    data=['a','b']

    mc=memcache.Client(['127.0.0.1:11221'],debug=0)
    mc.set("d",data);

    val=mc.get("d")

    return HttpResponse("MEMCACHE: %s<br/>ORIGINAL: %s" % (json.dumps(val),json.dumps(data)) )

def add(request):
    #s=""
    #for data in request.POST:
    #   s="%s,%s" % (s,data) …
Run Code Online (Sandbox Code Playgroud)

python django restful-architecture

18
推荐指数
3
解决办法
4万
查看次数

单个请求请求太大资源或太多资源时的HTTP状态代码

有人知道哪种HTTP状态代码适合以下情况吗?

匿名客户端可以从RESTful API的集合中请求一系列项目GET /collection/?range_start=100&range_end=200.示例查询返回包含100个项目的列表(以JSON格式).对于客户可以请求多少项,还有一个限制,比方说300.如果客户要求例如[100,1100]范围内的1000项,那么响应状态代码应该是什么?这意味着超过限制的700项?

应该是400 Bad Request,403 Forbidden,409 Conflict,416 Requested Range不满足(?)还是422 Unprocessable Entity?你会推荐什么?

一个相关的问题和答案建议409,但情况略有不同:https: //stackoverflow.com/a/13463815/638546

rest http http-status-codes restful-architecture

18
推荐指数
1
解决办法
6337
查看次数