реализовать подресурс в REST API - PullRequest
0 голосов
/ 20 марта 2019

Мне нужно реализовать подресурс в REST API.

URL будет выглядеть так:
https://localhost:8080/v1/student/{id}?include=address,qualification,login

, так что адрес, квалификация и логин - это три подресурса, которые будут включеныесли мы добавим это параметр запроса. Subresource может быть вызовом базы данных или вызовом rest другой службы

проблема возникает на стороне реализации, я взял @RequestParam List include

, так что в настоящее время я являюсьписать так в классе обслуживания

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

поэтому здесь мне нужно добавить условие для каждого подресурса, можете ли вы предложить какой-либо лучший подход для этого или любой другойпринципал проектирования.

Существует другой подход для получения имени метода репозитория во время выполнения с использованием 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 Ответ

1 голос
/ 20 марта 2019

То, что вы ищете, это проекции.Из этой ссылки

Проекции позволяют клиенту запрашивать только определенные поля объекта, а не весь объект.Использование проекций, когда вам нужно всего лишь несколько полей от объекта, является хорошим способом для самостоятельного документирования вашего кода, уменьшения полезной нагрузки ответов и даже для того, чтобы сервер мог расслабить выполнение вычислений или операций ввода-вывода, отнимающих много времени.

Если вы используете Spring здесь - это несколько примеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...