zhufuyi / sponge

Sponge is a powerful Go development framework, it's easy to develop web, gRPC and microservice projects.
https://go-sponge.com
MIT License
1.48k stars 146 forks source link

GET请求传递复合类型的最佳实践 #70

Closed bootun closed 1 month ago

bootun commented 1 month ago

我在proto中定义了一个请求参数,是个复合类型,定义如下:

message GetTwoPointsDistanceRequest {
  message Point {
    // 纬度
    string latitude = 1[(tagger.tags) = "form:\"latitude\""];
    // 经度
    string longitude = 2[(tagger.tags) = "form:\"longitude\""];
  }

  // 点位1
  Point point1 = 1[(tagger.tags) = "form:\"point1\""];
  // 点位2
  Point point2 = 2[(tagger.tags) = "form:\"point2\""];
}

执行make proto后,生成的swagger-ui上显示字段名是

?point1.latitude=xx&point1.longitude=xx&point2.latitude=xx&point2.longitude=xx

但不清楚这样的格式如何写proto才能解析?

如果想要框架生成的代码原生能拿到参数的话,是不是只能把参数平铺到结构最外层? 变成这样:

message GetTwoPointsDistanceRequest {
  // 点位1的纬度
  string point1_latitude  = 1[(tagger.tags) = "form:\"point1_latitude\""];
  // 单位1的经度
  // ...
  // 点位2的纬度
  // ...
  // 点位2的经度
  // ...
}

或者要把gin的ctx透传过来,直接用gin的c.Query去拿? 不管是平铺参数还是透传gin的context,都感觉不够优雅,究竟哪种方法才算是最佳实践呢?

zhufuyi commented 1 month ago

对于复合类型参数,应该用POST请求,如果坚持使用GET请求,把复合类型参数改为平铺更加省事。