Лучшая практика для отправки ответа в весенней загрузке - PullRequest
0 голосов
/ 22 апреля 2019

Я кодирую REST Api-s в весенней загрузке.Я хочу убедиться, что мой код доступен для чтения внешними разработчиками с помощью инструмента разработки swagger API ( Swagger ).Например,

@GetMapping("/getOne")
    public ResponseEntity<?> getOne(@RequestParam String id) {
        try {
            return new ResponseEntity<Branch>(branchService.getOne(id), HttpStatus.OK);
        } catch (Exception e) {
            return new ResponseEntity<FindError>(new FindError(e.getMessage()), HttpStatus.BAD_REQUEST);
        }
    }

Если запрос выполнен успешно, ответом будет Объект ветвления , в случае неудачи ответом будет FindError object, который имеет только один атрибут ( сообщение ).Таким образом, оба могут быть выполнены в зависимости от ответа.Но пользовательский интерфейс не показывает, как должен отображаться ответ, потому что я использую "?" как универсальный тип .Это лучшая практика, чтобы поймать ошибку?(Этот кодекс документации по кодированию бесполезен для внешних разработчиков, поскольку он не показывает объект ответа).Или какой-либо наилучшей практики для вышеуказанной проблемы?

Существует множество методов, которые возвращают различные объекты, такие как Branch .Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 22 апреля 2019

Прежде всего вы должны следовать лучшим методикам RESTful API.Не используйте глаголы, вместо этого используйте существительные в качестве URL. Так вместо @GetMapping("/getOne"), вы можете написать его как @GetMapping("/branch/{id}").Вы можете сослаться на этот блог https://blog.mwaysolutions.com/2014/06/05/10-best-practices-for-better-restful-api/

@ Во-вторых, не возвращайте универсальный тип как ? , вместо этого вы можете использовать определенный тип, здесь как Ветвь и делать центральную обработку исключений.Вам может помочь следующий фрагмент кода:

@GetMapping("/branch/{id}")
public ResponseEntity<Branch> getBranch(@Pathvariable String id) {
{
    Branch branch = branchService.getOne(id);

    if(branch == null) {
         throw new RecordNotFoundException("Invalid Branch id : " + id);
    }
    return new ResponseEntity<Branch>(branch, HttpStatus.OK);
}

RecordNotFoundException.java

@ResponseStatus(HttpStatus.NOT_FOUND)
public class RecordNotFoundException extends RuntimeException
{
    public RecordNotFoundException(String exception) {
        super(exception);
    }
}

CustomExceptionHandler.java

@ControllerAdvice
public class CustomExceptionHandler extends ResponseEntityExceptionHandler
{
    @ExceptionHandler(Exception.class)
    public final ResponseEntity<Object> handleAllExceptions(Exception ex, WebRequest request) {
        List<String> details = new ArrayList<>();
        details.add(ex.getLocalizedMessage());
        ErrorResponse error = new ErrorResponse("Server Error", details);
        return new ResponseEntity(error, HttpStatus.INTERNAL_SERVER_ERROR);
    }

    @ExceptionHandler(RecordNotFoundException.class)
    public final ResponseEntity<Object> handleRecordNotFoundException(RecordNotFoundException ex, WebRequest request) {
        List<String> details = new ArrayList<>();
        details.add(ex.getLocalizedMessage());
        ErrorResponse error = new ErrorResponse("Record Not Found", details);
        return new ResponseEntity(error, HttpStatus.NOT_FOUND);
    }
}

ErrorResponse.java

public class ErrorResponse
{
    public ErrorResponse(String message, List<String> details) {
        super();
        this.message = message;
        this.details = details;
    }

    private String message;

    private List<String> details;

    //Getter and setters
}

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

Тестовые случаи:

1) HTTP GET /branch/1 [VALID]

HTTP Status : 200

{
    "id": 1,
    "name": "Branch 1",
    ...
}
2) HTTP GET /branch/23 [INVALID]

HTTP Status : 404

{
    "message": "Record Not Found",
    "details": [
        "Invalid Branch id : 23"
    ]
}
0 голосов
/ 22 апреля 2019

Я бы порекомендовал сделать это так.

@GetMapping("/getOne")
public Response getOne(@RequestParam String id) {
        ResponseEntity<Branch> resbranch;
        ResponseEntity<FindError> reserror;
        try {
            resbranch=new ResponseEntity<Branch>(branchService.getOne(id), HttpStatus.OK);
            return Response.status(200).entity(resbranch).build();

        } catch (Exception e) {
            reserror=new ResponseEntity<FindError>(new FindError(e.getMessage()), HttpStatus.BAD_REQUEST);
            return Response.status(400).entity(reserror).build();
        }
    }

200 - для ОК, а 400 - для плохого запроса. Здесь больше не будет неоднозначных типов ..

...