如何在相同的 $http.get 中获取不同的 JSON 内容

How to get different JSON content in the same $http.get

我正在使用 AngularJS 从服务器检索对象列表。服务器端是用 Spring MVC 制作的。

所以,我想 return 这些对象的列表作为 JSON 格式,但是,我想 return 如果服务器可以提供信息性消息对象' 出于任何原因检索数据。

我可以不用将 List<> 和 Message 对象封装在 DTO(数据传输对象)中吗? 我如何检查 AngularJS 收到的 JSON 是否可以来自 2 种不同的类型?

这是我的控制器的片段class。它目前 return 是我想要 return 的 MyType 的列表。但想法是将其转换为通用类型(对象,也许?)和 return 来自此请求的列表或消息,视情况而定。

@RequestMapping(value = RestPaths.LIST_MYTYPE_BY_OWNER, method = RequestMethod.GET)
public @ResponseBody List<MyType> listByOwner(@RequestBody Owner o) {
    List<MyType> myType = myService.list(o);
    return myType;
}

这是咨询控制器的服务。考虑到 JSON 可能有不同的格式,我该如何处理数据?

this.listMyType = function(ownerId){
    var deferred = $q.defer();

    $http.get('/rest/my/list_by_owner',{})
    .then(function (response) {
        if (response.status == 200) {
            deferred.resolve(response.data);
        }
        else {
            deferred.reject('Error retrieving list of myType');
        }
    });

    return deferred.promise;
}

我的建议是抛出一个异常,然后添加一个 spring 异常处理程序来设置适当的状态代码和消息:

@RequestMapping(value = RestPaths.LIST_MYTYPE_BY_OWNER, method = RequestMethod.GET)
public @ResponseBody List<MyType> listByOwner(@RequestBody Owner o) {
    List<MyType> myType = myService.list(o);
    if (myType.size() == 0) {
        throw new ResourceNotFoundException("List was empty");
    }
    return myType;
}

@ControllerAdvice
public class ControllerExceptionHandler {

    @ExceptionHandler(ResourceNotFoundException.class)
    public void handleException(Exception e, HttpServletReponse response) {
        response.setStatus(HttpStatus.NOT_FOUND);
        response.getOutputStream().write(e.message);
    }
}

这里有一篇关于 spring mvc 异常处理的非常好的文章:https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

我不会使用异常来进行流量控制。如果两种情况(列表为空或无效)都有效,请在您的处理程序方法中处理这两种情况。使用 ResponseEntity 封装您的响应。 Return 一种情况下 String 消息(空),另一种情况下 List<MyType> 消息(非空)。

@RequestMapping(value = RestPaths.LIST_MYTYPE_BY_OWNER, method = RequestMethod.GET)
public ResponseEntity<?> listByOwner(@RequestBody Owner o) {
    List<MyType> myType = myService.list(o);
    if (myType.isEmpty()) {
        return new ResponseEntity<>("The message", HttpStatus.NOT_FOUND);
    }
    return new ResponseEntity<>(myType, HttpStatus.OK);
}

所有处理程序方法 return 值都由 HandlerMethodReturnValueHandler objects. The corresponding one for ResponseEntity is HttpEntityMethodProcessor. It handles the ResponseEntity's body the same way @ReponseBody 处理。

所以 String 将作为 text/plain(或 html)直接写入响应,而 List<MyType> 将被序列化为 application/json默认(或您配置的任何内容)。

您可以将响应 headers 添加到 ResponseEntity,这也有助于确定内容的序列化方式(content-type,等等)。