Comments (3)
Hello @gablemire
gadgeto/tonic
generates wrapping gin-compatible handlers that automatically bind request informations to a specified input type. It uses the reflect
package to dynamically inspect the input and output types of the handler. fizz
relies on that behavior and fetches the informations it needs from tonic for each handler, as shown here: https://github.com/wI2L/fizz/blob/master/fizz.go#L176
fizz
could in theory extract the reflect logic that inspect the handler's input/output types and provides its own fizz.Handler
function to wrap Gin handlers. However, you would still need to specify struct tags to differentiate query-params/headers/body fields in the input type of your handler.
Could you elaborate about your use-case? Aside from the potential dependencies diff (that could be fixed easily since both code owners are from the same company), do you have others reasons not to use tonic
? The obvious one is about perfs, since tonic
makes heavy use on reflect
primitive in the got path of each request, whereas fizz
only instantiate once when the router is created.
from fizz.
Hello @wI2L
The main reason I have is for performance, indeed. You should use reflection to extract the primitives on boot and be done with it afterwards in my opinion. But it's more than that, really. I believe this design choice makes it very difficult for somebody who wishes to use fizz after they developed their API to onboard with fizz. Because it relies on tonic, this means one would have to rewrite all their handlers in order to get auto-generation of the OpenAPI.
Without tonic, fizz could still extract a lot of information (routes, parameters, etc) and would require the user to only document the input / output further. I feel this should be an option. If tonic handlers are used, it should be able to extract the information. It means less performance, but more usability. Otherwise, we should be able to manually define the information and fizz should be able to still process the endpoint with the original Gin handler.
What do you think?
from fizz.
There's still one downside/issue with that approach. The tonic-wrapped handler signature must be func(*gin.Context, [input]) ([output], error)
. The input and output types are optional. If you were to ignore the tonic wrapping part, that wouldn't make sense to use that handler signature, because you would extract the request informations from the Gin context manually, and thus, doens't need the input/output types that are still required to describe a route in the OpenAPI spec. Adding more functions to fizz to describe all the parameters of a route instead of getting that informations from those types would clutter the router definition.
from fizz.
Related Issues (20)
- Do we have method to not show all struct in param and return type ?
- Add additional tags for a path operation HOT 1
- pointer, required, not nullable openapi output HOT 1
- Enum values can't be added when DataType interface has been implemented
- Are Schema's anyOf/allOf/oneOf incorrectly typed?
- A way to override default example
- [binding error] Parsing audio file sent in the request body together with query params HOT 1
- Support for Open API extensions? HOT 5
- HeaderTag now working in input struct HOT 2
- desc in Response and ResponseWithExamples does not work HOT 1
- Method with same name on different struct produce same openAPI ID
- Providing Examples for Custom Types HOT 1
- Security should be an array instead of dictionary
- How to read the input body? HOT 1
- Fizz does not work with generic structs HOT 4
- How to specify the return type for an API that writes to the output directly via stream HOT 5
- No scopes unavailable in OAuth2 flow HOT 1
- Adding `x-readme` section?
- Is this project still maintained? Looks like the last tag was quite some time ago. Thanks! HOT 1
- About generic schemas
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from fizz.