如何在同一端点调用两个函数?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ć
相关产品推荐
相关产品推荐

