为了账号安全,请及时绑定邮箱和手机立即绑定

RESTful API:一个视图中来自多个端点的数据

RESTful API:一个视图中来自多个端点的数据

PHP
holdtom 2022-07-29 10:49:13
我已经开始创建一个 RESTful API(好吧,我已经尽力了,我正在尝试遵循这些模式)并且我偶然发现了一个我不确定如何处理的场景。我将解释当前的结构:我的应用程序有 4 个控制器:顾客付款日志以客户控制器为例,我定义了以下操作:GET /customers:返回客户列表POST /customers:创建一个新客户GET /customers/{id}:返回具有提供的 id 的客户PUT /customers/{id}:使用提供的 id 更新客户DELETE /customers/{id}:销毁客户这是客户控制器的完整代码:namespace App\Http\Controllers;use App\Customer;use Illuminate\Http\Request;class CustomerController extends Controller{    /**     * Display a listing of the resource.     *     * @return \Illuminate\Http\Response     */    public function index()    {        return Customer::all();    }    /**     * Store a newly created resource in storage.     *     * @param  \Illuminate\Http\Request  $request     * @return \Illuminate\Http\Response     */    public function store(Request $request)    {        $customer = Customer::create($request->all());        return response()->json($customer, 201);    }    /**     * Display the specified resource.     *     * @param  \App\Customer  $customer     * @return \Illuminate\Http\Response     */    public function show(Customer $customer)    {        return $customer;    }    /**     * Update the specified resource in storage.     *     * @param  \Illuminate\Http\Request  $request     * @param  \App\Customer  $customer     * @return \Illuminate\Http\Response     */    public function update(Request $request, Customer $customer)    {        $customer->update($request->all());        return response()->json($customer, 200);    }    /**     * Remove the specified resource from storage.     *     * @param  \App\Customer  $customer     * @return \Illuminate\Http\Response     */    public function destroy(Customer $customer)    {        $customer->delete();        return response()->json(null, 204);    }}其他控制器中的代码非常相似。同样重要的是要注意:一个客户可以有多个付款一个客户可以在日志中有多个记录问题从这里开始:我需要在前端显示一个包含所有客户数据(姓名、电子邮件、注册日期等)的摘要页面和一个显示付款次数的框和另一个显示日志中条目数的框。我需要提出 3 个请求吗?(一个到/customers/id,另一个到customers/id/payments,另一个到customers/id/logs)如果我在 customers/id 调用中返回所有与客户相关的数据,我是否违反了 RESTful 约定?
查看完整描述

2 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

我正在使用apigility,但我的回答仍然与您的问题有关。根据 REST 术语(可以在这里找到https://apigility.org/documentation/intro/first-rest-service#terminology)您正在谈论实体和集合。


/customers/id - entity,

/customers/id/payments - collection,

/customers/id/logs - collection. 

这是 3 个不同的请求。所以,是的,你需要提出 3 个不同的请求。


但是,老实说,如果您不需要分页,payments并且logs您只能向 /customers/id 发出一个请求,并且在响应中您可以拥有带有数组的字段


{

    "_links": {

        "self": {

            "href": "http://localhost:8080/status/3c10c391-f56c-4d04-a889-bd1bd8f746f0"

        }

    },

    "id": "3c10c391-f56c-4d04-a889-bd1bd8f746f0",

    ...

    _payments: [

        ...

    ],

    _logs: [

        ...

    ],

}

更新(与未来访客的评论重复)。


另外,您应该注意DTO。我想这个链接会很有趣https://stackoverflow.com/a/36175349/1581741。


更新2。


目前,我这样对待您的收藏/customers/id/payments:


/payments?user_id=123

表格user_id上的过滤字段在哪里。payments


查看完整回答
反对 回复 2022-07-29
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

我认为您的问题是您将 REST API 与数据库混淆了。它们不必遵循相同的结构。GET /customers/{id}如果这是您从 REST API 中需要的,您可以轻松地返回整个嵌套的 JSON 。



查看完整回答
反对 回复 2022-07-29
  • 2 回答
  • 0 关注
  • 95 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信