处理依赖于参数的动态请求

时间:2018-03-16 02:10:10

标签: java spring api apache-kafka

我正在使用Spring启动创建一个API,我试图想出处理两个具有相同端点的请求的最佳方法。因此,如果请求具有参数X,Y和Z它会做A事,否则做B事。

处理它的最佳方法是什么?也许是一个处理请求并指向正确方法的中间件?或者可以评估参数X是否为空?谢谢你的帮助。

例如:

请求A:

/payment
   {
      "holder_name": "John Doe",
      "payment_method": 
      {
         "card_number" : "5478349021823961",
         "exp_date" : "2018-10-16",
         "cvv" : "713"
      }
   }

请求B:

/payment
   {
      "holder_name": "John Doe",
      "payment_method": 
      {
         "boleto_number" : "123456789"
      }
   }

这两个请求具有相同的端点,但付款方式不同。

1 个答案:

答案 0 :(得分:0)

最好的方法取决于应用程序的具体细节和需求。检查值是否缺失或为空可能不是最好的事情,例如,如果您收到四个字段card_numberexp_datecvvboleto_number要执行的正确操作。

您可以在根级别的额外字段中请求json中的类型。

<!-- language: json -->
{
    "holder_name": "John Doe",
    "payment_method": "TICKET",
    "payment_details": {
        "ticket_number": "123456789"
    }
}

或者使用当前付款对象的字段。

<!-- language: json -->
{
    "holder_name": "John Doe",
    "payment_method": {
        "type": "TICKET"
        "ticket_number": "123456789"
    }
}

这样您可以先检查方法类型,然后检查其他字段和详细信息是否与您希望该类型的字段匹配,然后再切换到正确的处理程序。

此外,您应该决定是否允许不属于指定方法的未知字段或字段。例如,如果您决定不严格,那么接收前面提到的4个字段(类型为CREDIR_CARD)可以有效地处理为信用卡付款,并忽略额外字段。如果您决定更严格,可能会抛出错误,表明收到了意外字段。

您可以使用枚举来定义类型。

public enum PaymentType {
    TICKET,
    CREDIT_CARD,
    CASH
}

最后,根据您是使用类或类似地图的对象作为已处理json的结构,您可以使用自定义转换器轻松转换对象,具体取决于类型。