gpt4 book ai didi

java - Feign Client GET 请求,从微服务中抛出 "Method Not Allowed: Request method ' POST' not supported"

转载 作者:行者123 更新时间:2023-12-02 14:47:02 27 4
gpt4 key购买 nike

我有一个带有 spring 后端的 Vue.js 应用程序,它通过 Feign 客户端调用“订单”微服务。我有许多使用@PathVariable(s) 工作正常的 GET 请求,但我有 1 个 GET 请求,它可以将任意数量的不同 URL 参数传递给它,并且定义了一个 OrderListItemParameters 类并将其添加到 GET 请求中,将参数传递给微服务。我可以看到请求正在发送到微服务,但它被拒绝并出现“org.zalando.problem.spring.common.AdviceTrait:不允许的方法:不支持请求方法‘POST’”错误。

我已确保假客户端发送的 OrderListItemParameters 与微服务中预期的 OrderListItemParameters 匹配。并且在 Feign 客户端或微服务中都没有提及 POST。我只有 GET 和 PUT 端点。

前端代码的 Java 后端:

@RestController
@RequestMapping("/api")
public class OrdersResource {

## THIS WORKS NO PROBLEM
@GetMapping("/order/{orderId}")
public @ResponseBody
ResponseEntity<?> order(@PathVariable int orderId) throws Exception {
return ResponseEntity.ok(orderClient.order(orderId));
}


## THIS ENDPOINT IS THE ONE THAT FAILS
@GetMapping("/order/list")
public @ResponseBody
ResponseEntity<?> orders(OrderListItemParameters orderListItemParams) {
return ResponseEntity
.ok(orderClient.getOrderList(orderListItemParams));
}
}

@Component
@AuthorizedUserFeignClient(name = "orders")
public interface OrderClient {

## THIS WORKS NO PROBLEM
@RequestMapping(method = RequestMethod.GET, value = "/api/order/pg/{orderId}")
String order(@PathVariable("orderId") int orderId);

## THIS ENDPOINT IS THE ONE THAT FAILS
@RequestMapping(method = RequestMethod.GET, value = "/api/order/list")
String getOrderList(OrderListItemParameters orderListItemParams);
}

OrderListItemParameters 类作为 URL 参数传入:(这在微服务中是相同的)

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class OrderListItemParameters implements Serializable {

private String searchPhrase;
private String startDate;
private String endDate;
private ArrayList<String> sortKey;
private ArrayList<String> sortValue;
private Integer from;
private Integer size;
}

(with getters, and setters)

微服务 Controller :

@Controller
@RequestMapping("/api")
public class OrderController {

## THIS WORKS NO PROBLEM
@GetMapping("/order/pg/{orderId}")
public @ResponseBody
Order pgorder(@PathVariable int orderId) {
return orderService.getPgOrderById(orderId);
}

## THIS ENDPOINT IS THE ONE THAT FAILS
@GetMapping("/order/list")
public @ResponseBody
ResponseEntity getOrderListItemsByMerchant(OrderListItemParameters orderListItemParams) {
return orderService
.getOrderListItemsByMerchant(orderListItemParams);
}

这是日志的图片:Clearly Stating GET requests... Logs

任何有助于弄清楚为什么 Controller 认为这是一个 POST 请求的帮助都会很棒。

最佳答案

这是最终有效的解决方案......

#Resource
@GetMapping("/order/list")
public @ResponseBody
ResponseEntity<?> getOrderListItemsByMerchant(
@RequestParam Map<String, Object> params) {
// method code
}

#Feign Client
@RequestMapping(method = RequestMethod.GET, value = "/api/order/list")
ResponseEntity<String> getOrderList(@RequestParam Map<String, Object> params);

#Microservice Controller
@GetMapping("/order/list")
public @ResponseBody
ResponseEntity getOrderListItemsByMerchant(OrderListItemParameters orderListItemParams) {
// method code
}

这允许我获取带有动态参数的 URL,并且微服务仍然将请求视为 GET。

在请求的两边有相同的定义对象会很好,但我根本无法使@SpringQueryMap 或@QueryMap 工作。

我讨厌假装。

关于java - Feign Client GET 请求,从微服务中抛出 "Method Not Allowed: Request method ' POST' not supported",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58468968/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com