Spring ResponseEntity 最佳实践

4

我对RESTful web服务还不熟悉,正在学习Spring实现的web服务。

我特别想学习如何正确使用ResponseEntity返回类型来处理大部分的用例。

我有一个端点:

/myapp/user/{id}

此端点支持GET请求,并将返回一个JSON格式的字符串,其中包含ID为{id}的用户对象。我打算将控制器方法注释为生成JSON格式。

如果存在ID为{id}的用户,则将状态设置为200,并在正文中设置该用户的JSON字符串。

如果不存在具有该ID的用户,则我原本打算返回某种形式的400错误,但是我不确定在ResponseEntity的正文中应该设置什么。由于我将端点方法标注为生成JSON格式,所以我是否应该想出一种通用POJO来表示错误,并将其作为JSON返回?


是的,您应该返回通用POJO,并在没有用户ID存在的情况下在POJO中返回错误或无效状态。 - Akshay Pethani
2
如果没有任何内容存在,那么就没有什么可以返回的了。只需响应一个状态码为“404”的空HttpResponse,表示“未找到资源”。 - Herr Derb
2个回答

6

您不需要使用通用的Pojo,使用RequestMapping可以为每个Http代码创建不同的响应。在本例中,我展示了如何控制错误并相应地给出响应。

这是具有服务规范的RestController。

@RestController
public class User {

    @RequestMapping(value="/myapp/user/{id}", method = RequestMethod.GET)
    public ResponseEntity<String> getId(@PathVariable int id){

        if(id>10)
            throw new UserNotFoundException("User not found");

        return ResponseEntity.ok("" + id);
    }

    @ExceptionHandler({UserNotFoundException.class})
    public ResponseEntity<ErrorResponse> notFound(UserNotFoundException ex){

        return new ResponseEntity<ErrorResponse>(
            new ErrorResponse(ex.getMessage(), 404, "The user was not found") , HttpStatus.NOT_FOUND);
    }
}

在getId方法中有一些逻辑,如果customerId < 10,则应该将客户ID作为消息正文的一部分进行响应,但是当客户大于10时应抛出异常,在这种情况下,服务应该响应一个ErrorResponse。

public class ErrorResponse {

    private String message;
    private int code;
    private String moreInfo;

    public ErrorResponse(String message, int code, String moreInfo) {
        super();
        this.message = message;
        this.code = code;
        this.moreInfo = moreInfo;
    }

    public String getMessage() {

        return message;
    }

    public int getCode() {

        return code;
    }

    public String getMoreInfo() {

        return moreInfo;
    }
}

最后,我使用了一个特定的异常来处理“未找到”错误

public class UserNotFoundException extends RuntimeException {

    public UserNotFoundException(String message) {
        super(message);
    }
}

0
如果不存在具有该ID的用户,我将返回某种形式的400错误,但我不确定在ResponseEntity的正文中应设置什么。由于我将端点方法注释为生成JSON,因此是否应该想出一个通用的POJO来表示错误,并将其作为JSON返回?
这绝对是一种可能的解决方案,如果您想添加例如更具体的请求失败原因,或者如果您想添加特定的I18N消息或者只是想泛化您的API以提供一些抽象结构。
我个人更喜欢@Herr Derb建议的解决方案,如果没有要返回的内容,请不要返回任何内容。返回的数据可能完全不必要/未使用,如果返回代码不是2XX,则接收器可能会将其丢弃。
这可能与以下内容相关: http://www.bbenson.co/post/spring-validations-with-examples/ 作者描述了如何验证传入模型并构建通用错误响应。也许这是您想做的事情...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接