首页 > 解决方案 > 在 REST API 中实现子资源

问题描述

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

URL 将类似于:
https://localhost:8080/v1/student/ {id}?include=address,qualification,login

所以地址,资格和登录是三个子资源,如果我们添加这是查询参数,它将被包括在内。子资源可以是数据库调用或其他服务的休息调用

问题发生在实施方面,我已将@RequestParam List 包括在内

所以目前我在服务课上是这样写的

 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;
        }

标签: javarestdesign-patterns

解决方案


您正在寻找的是投影。从这个链接

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

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


推荐阅读