当前位置: 首页 > 知识库问答 >
问题:

在REST API中实现子资源

乜明朗
2023-03-14

我需要在REST API中实现子资源

URL将像:
https://localhost:8080/v1/student/{id}? include=地址,资格,登录

因此,地址、资格和登录是三个子资源,如果我们添加这是查询参数,则将包括这三个子资源。子资源可以是对其他服务的数据库调用或rest调用

这个问题发生在实现端,我已经将@RequestParam列表包括在内

所以现在我在服务课上就是这样写的

 public Student getStudentDetail(Integer id ,List<String> include){
    Student student = new Student();
    // setting student details
    for(String itr: include){
    if(itr=="address"){
    student.setAddress(repo.getAddress(id));
    }
    if(itr=="qualification"){
    student.setQualication(repo.getQualification(id));
    }
    if(itr=="login"){
    student.setLogin(client.getLogin(id));// here client in Rest Call for 
    }


   }
    return student;
    }

学生班级:

@Data
public Class Student{
private String id;

private List<Address> address;

private List<Qualification> qualification;

private Login login; 
}

所以在这里,我需要为每个子资源添加if条件,您能否建议更好的方法或任何设计原则。

还有另一种方法可以在运行时使用反射API获取存储库方法名称,但它会增加调用的额外开销。

另一种方法可以是:

我可以使用策略设计模式

Abstract Class 

public Abstract class Subresource{
public Student getSubresouce(Integer id,Student student){}
}

public class Address extends Subresource{
@Autowired
Databaserepo repo;

public Student getSubresource(Integer id , Student student){
  return student.setAddress(repo.getAddress(id));
}
}

public class Login extends Subresource{
@Autowired
RestClient client;

public Student getSubresource(Integer id, Student student){
 return student.setLogin(client.getLogin(id));
}
}

但在这种方法中,我无法在服务中编写逻辑

  public Student getStudentDetail(Integer id ,List<String> include){
        Student student = new Student();
        // setting student details
        for(String itr: include){
       // Need to fill logic
// Help me here to define logic to use strategy oattern
       }
        return student;
        }

共有1个答案

颜镜
2023-03-14

你要找的是投影。从此链接

投影是客户端仅从对象而不是整个对象请求特定字段的一种方式。在只需要对象中的几个字段时使用投影是一种很好的方法,可以自我记录代码,减少响应的有效负载,甚至允许服务器放松耗时的计算或IO操作。

如果您使用Spring,这里有一些示例。

 类似资料:
  • 如何使用SpringBoot和SpringSecurity将基本授权(登录密码)与其他服务(google、github、facebook)的授权结合起来?有很多信息,我不知道如何正确解决这个问题。我将非常感谢教程或链接到材料。

  • 我想使用JAX-RS实现Subresource。资源的URI类似于http://localhost:8080/messenger/webapi/messages/1/comments。我可以使用以下URI获取消息http://localhost:8080/messenger/webapi/messages/1,但当我试图获取消息的注释时,我只得到空的花括号。 两个资源类都在同一个包中。我知道,如果

  • 本文向大家介绍Android中实现根据资源名获取资源ID,包括了Android中实现根据资源名获取资源ID的使用技巧和注意事项,需要的朋友参考一下 接触过Android开发的同学们都知道在Android中访问程序资源基本都是通过资源ID来访问。这样开发起来很简单,并且可以不去考虑各种分辨率,语言等不同资源显式指定。 痛点 但是,有时候也会有一些问题,比如我们根据服务器端的值取图片,但是服务器端绝对

  • 问题内容: 考虑两个类。第一个是,其子类符合: 第二类继承自: 该代码无法编译,因为: 使用元类型值构造“ Vehicle”类类型的对象必须使用“ required”初始化程序。 因此,我继续添加所需的初始化程序: 现在,应用程序可以编译,并且对象可以正确响应。 两个问题: 为什么构造具有元类型的对象需要初始化程序?(看来我编写的初始化程序没有任何作用。) 我写错了什么,还是 应该 添加到初始化程

  • 我有一个名为AdminResource的父资源和一个名为AdminModuleResource的子资源。 父资源已正确安装HATEOAS链接: 子资源也正确安装了HATEOAS链接: 但是它的父资源已经失去了链接。 目前,在我的子管理模块资源中,父管理资源没有链接。事实上,汇编程序的toResources方法只提供子管理模块资源的链接。 你知道我如何在子管理模块资源中添加到父管理资源的链接吗? 编

  • 问题内容: 如您所知,如果子类未实现未实现的方法,则eclipse提供了一种不错的方法来实现它们。有什么办法可以将其应用于所有子类吗? 我的问题是,当每个孩子班级有50个时,我必须这样做。我将不胜感激任何帮助。 问题答案: 在包资源管理器中选择顶级包。转到“问题”视图。错误列表应为“类型Foo必须实现继承的抽象方法Parent.foo()”(对于给定的类/方法名称)。右键单击错误,选择“快速修复”