猿问

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

我已经开始创建一个 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 约定?


holdtom
浏览 96回答 2
2回答

牛魔王的故事

我正在使用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

慕田峪4524236

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