You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在同一端点调用两个函数?Angular与Java开发场景

问题描述

我是第一次使用Angular和Java,正通过任务学习。此前已实现前端向后端发起请求获取计数(前端传递数字,后端查询数据库并返回结果)。现在有类似任务:传递相同数字到后端,查询数据库后返回4个字符串并在前端展示,但我不知道如何在同一端点处理两个GET请求。

现有代码实现

ItemService

public PayloadResponse<Long> getCount(EntityRequest<Long> request);

ItemServiceImpl

@Override
public PayloadResponse<Long> getCount(EntityRequest<Long> request) {
    Long itemId = request.getEntity();
    Long count = itemDAO.getCount(itemId);
    PayloadResponse<Long> response = new PayloadResponse<>(request, ResponseCode.OK, count);
    
    return response;
}

ItemRestService

@GetMapping("/{itemId}/overview")
public PayloadResponse<Long> getCount(@PathVariable Long itemId) {
    var request = new EntityRequest<>(itemId);
    return itemService.getCount(request);
}

ItemDAO

public Long getCount(Long itemId) {
    String hql = "select count( distinct m.id) from ItemEntity i join MapTileResourceEntity mtr on mtr.resourceId = :itemId "
            + "and mtr.resourceType = :resourceType join MapTileEntity mt on mt.id = mtr.mapTile.id join MapEntity m on m.id = mt.map.id";
    TypedQuery<Long> query = entityManager.createQuery(hql, Long.class).setParameter("itemId", itemId).setParameter("resourceType",
            ObjectType.ITEM.getValue());
    return query.getSingleResult();
}

解决方案

同一端点无法处理两个GET请求(HTTP规范中,相同请求方法+相同路径的接口会冲突),你可以通过以下几种方式实现需求:

方式1:新增不同路径的接口

直接为获取4个字符串的需求新增独立接口路径:

1. 扩展ItemService

新增方法:

public PayloadResponse<List<String>> getStrings(EntityRequest<Long> request);

2. 实现ItemServiceImpl

@Override
public PayloadResponse<List<String>> getStrings(EntityRequest<Long> request) {
    Long itemId = request.getEntity();
    List<String> resultList = itemDAO.getStrings(itemId);
    return new PayloadResponse<>(request, ResponseCode.OK, resultList);
}

3. 新增Rest接口

在ItemRestService中添加:

@GetMapping("/{itemId}/strings")
public PayloadResponse<List<String>> getStrings(@PathVariable Long itemId) {
    var request = new EntityRequest<>(itemId);
    return itemService.getStrings(request);
}

4. 实现ItemDAO的查询方法

public List<String> getStrings(Long itemId) {
    // 根据业务需求编写HQL查询,返回目标字符串列表
    String hql = "select targetColumn from TargetEntity where itemId = :itemId";
    TypedQuery<String> query = entityManager.createQuery(hql, String.class)
            .setParameter("itemId", itemId);
    return query.getResultList();
}

方式2:用请求参数区分返回类型

如果想复用部分路径,可通过请求参数区分返回内容:
修改ItemRestService的现有接口,添加type参数:

@GetMapping("/{itemId}/overview")
public PayloadResponse<?> getOverview(@PathVariable Long itemId, @RequestParam String type) {
    var request = new EntityRequest<>(itemId);
    if ("count".equals(type)) {
        return itemService.getCount(request);
    } else if ("strings".equals(type)) {
        return itemService.getStrings(request);
    }
    // 处理参数不合法的情况
    return new PayloadResponse<>(request, ResponseCode.BAD_REQUEST, null);
}

前端请求时分别调用:

  • 获取计数:GET /{itemId}/overview?type=count
  • 获取字符串:GET /{itemId}/overview?type=strings

方式3:返回包含两种数据的统一DTO

如果业务允许同时获取两种数据,可定义统一DTO一次性返回:

public class ItemOverviewDTO {
    private Long count;
    private List<String> strings;
    
    // 构造方法、getter、setter
}

之后修改Service和接口返回该DTO,前端按需取用对应数据即可。

内容的提问来源于stack exchange,提问作者Zijad Bećirević

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 15:12:39