例如,您运行GET请求users/9但没有id为#9的用户.哪个是最好的响应代码?
我有一个像这样的ViewSet来列出用户的数据:
class Foo(viewsets.ViewSet):
def list(self, request):
queryset = User.objects.all()
serializer = UserSerializer(queryset, many=True)
return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)
我想打开像ModelViewSet的默认分页一样的分页:
{
"count": 55,
"next": "http://myUrl/?page=2",
"previous": null,
"results": [{...},{...},...,{...}]
}
Run Code Online (Sandbox Code Playgroud)
官方文件说:
只有在使用通用视图或视图集时,才会自动执行分页
...但我的结果集根本没有分页.我该如何分页呢?
当客户端请求集合上的所有元素但集合为空时,我编写了一个返回204(无内容)的Web API.
例如:/api/products当没有产品时返回204.
现在我的问题是我正在尝试使用Restangular来使用API,如下所示:
Restangular.all('products').getList().then(function (products) {
$scope.products = products;
});
Run Code Online (Sandbox Code Playgroud)
但是,这会导致以下javascript错误.
错误:getList的响应应该是一个数组,而不是一个对象或其他东西
是什么赋予了?我找不到有关在Restangular文档中处理任何内容的任何信息
我用错了吗?我应该用空列表返回200吗?
我知道这是一个相当普遍的问题,但我没有找到满足我的答案.
我一直在使用django rest框架一段时间了,但除了给出的例子之外,这几乎是无关紧要的.它的默认行为是在访问具有空列表项的路由时返回带有空列表资源的HTTP 200.例如:如果我们有一个路径,例如/articles/访问文章列表,但它不包含任何项目,我们会收到如下json的响应:
{"count":0, "next":null, "previous":null, "items": []}
Run Code Online (Sandbox Code Playgroud)
这完全没问题.我们在/ articles /中找到了我们要查找的资源,它恰好没有任何项目.
如果我们访问路线/articles/?page=1,我们会得到完全相同的响应.
到现在为止还挺好.现在我们尝试访问/articles/?page=2,响应代码也会发生变化.现在得到一个404好像无法找到资源的错误消息,说该页面不包含任何结果.哪个是与?page = 1相同的情况......
我对这种行为非常满意,但今天我开始质疑这个设计.是怎样的?page=1情况不同于?page=2?而且,在发出HEAD请求时,如何判断请求是否"有效"?在包含任何结果的意义上有效.
这在过滤列表检查某个字段的可用性(例如,发出HEAD请求/users/?username=ted)的情况下可能很有用.
这是一个很好的设计吗?为什么大多数人似乎不同意它,它有什么缺点?
我们正在设计一个公共 API,并试图找出以下情况下 GET 的最佳实践:
路径参数:
/orders/{orderId}
Run Code Online (Sandbox Code Playgroud)
发现:200 个带有响应正文。
未找到:404。
查询参数:
/Products/{productId}/orders?color={color}
Run Code Online (Sandbox Code Playgroud)
找到的订单:200 个,带响应正文。
未找到:在这种情况下应该是 200 还是 204,甚至是 404?
在我看来,应该是200或204,因为本例中找到了资源,并且查询参数只是执行过滤效果。但在这种情况下我们应该返回 200 还是 204 呢?
rest http http-status-code-404 http-status-code-200 http-status-code-204
我有一个休息端点/Products/latest,如果没有产品,它会返回 204,以及以下通用角度服务:
getFromAPI(url: string) {
const params = new HttpParams();
return this.http
.get(url, { params: params })
.catch((err: HttpErrorResponse) => {
console.error(`Backend returned code ${err.status}, body was: ${err.error}`);
return Observable.of([]);
});
}
Run Code Online (Sandbox Code Playgroud)
和
getFromAPI() {
return this.masterService.get('/Products/latest').map((res: Response) => {
if (res.status === 204) {
return Observable.of([]);
} else {
return res;
}
});
}
Run Code Online (Sandbox Code Playgroud)
但是,当服务产生 204 代码时,我收到以下错误:
类型错误:无法读取 null 的属性“状态”
这怎么会发生?如果 API 以 204 响应,为什么整个响应为空?
例如,有一个restful APIGET http://luexu.com/users/{page}来列出第N 页中的用户。假设每个页面有 20 个用户。数据库中共有 100 个用户。GET http://luexu.com/users/5返回第 80 个到第 100 个用户。
那么查询GET http://luexu.com/users/10呢?它超出了总用户数。哪个是返回空列表、空数组[]或返回空数组的更好设计404?
200?
{
"code": 200,
"msg": "OK",
"data": []
}
Run Code Online (Sandbox Code Playgroud)
还是204?
{
"code": 204,
"msg": "OK",
"data": []
}
Run Code Online (Sandbox Code Playgroud)
还是404?
{
"code": 404,
"msg": "Not Found",
"data": null
}
Run Code Online (Sandbox Code Playgroud) 像GetEmployees这样的mvc web api调用会搜索员工对象列表但却找不到.这不是错误条件,因为在业务环境中可以接受列表可以为空.
搜索没有失败,它只是没有找到任何东西.
形成响应的最佳方式是什么?我是不是该
我有一个用于搜索的 REST 端点。
GET /person?firstname=john&name=smith
结果是一个带有 HTTP 状态代码的集合200 OK被返回:
[
{
"id":11,
"firstname":"John",
"name":"Smith",
"birthday":"1996-03-08"
},
{
"id":18,
"firstname":"John",
"name":"Smith",
"birthday":"1963-07-11"
}
]
Run Code Online (Sandbox Code Playgroud)
空搜索结果的正确 HTTP 状态代码和有效负载是什么?
200 OK带有空集合的HTTP 状态[]
204 No Content带有空集合的HTTP 状态[]
204 No Content带有空正文的HTTP 状态
rest ×6
http ×4
api-design ×2
angular ×1
django ×1
json ×1
python ×1
restangular ×1
restful-url ×1