kataras / iris

The fastest HTTP/2 Go Web Framework. New, modern and easy to learn. Fast development with Code you control. Unbeatable cost-performance ratio :rocket:
https://www.iris-go.com
BSD 3-Clause "New" or "Revised" License
25.26k stars 2.47k forks source link

[BUG] MVC does not support receiving protobufs #2489

Open dongzhanhub opened 1 month ago

dongzhanhub commented 1 month ago

Describe the bug On the issue of receiving protobuf data exception in MVC To Reproduce

  1. The following is the main code segment, which works as a whole except for errors when receiving protobuf

    app := iris.New()
    return app.Run(iris.Addr(":"+port),
        iris.WithKeepAlive(1*time.Minute),
        iris.WithoutInterruptHandler,
        iris.WithOptimizations,
        iris.WithProtoJSON,
        iris.WithoutBodyConsumptionOnUnmarshal,
        iris.WithoutServerError(iris.ErrServerClosed),
        iris.WithRemoteAddrHeader("X-Real-IP"),
    )
    
    mvcApp := mvc.New(app)
    
    api := mvcApp.Party("/")
    api.Party("test").Handle(new(controllers.TestController))

Question:Directly in the outermost layer directly error, the program has not been executed to the controller
Response Error:valid character '$' looking for beginning of valueinvalid character '$' looking for beginning of value

  1. This code reads protobuf without problem:
app.Post("/read", read)

func read(ctx iris.Context) {
    var request pb.FcmRequest

    err := ctx.ReadProtobuf(&request)
    if err != nil {
        ctx.StopWithError(iris.StatusBadRequest, err)
        return
    }

    fmt.Println(request)
}

func read(ctx iris.Context) {
    var request pb.FcmRequest

    err := ctx.ReadProtobuf(&request)
    if err != nil {
        ctx.StopWithError(iris.StatusBadRequest, err)
        return
    }

    fmt.Println(request)

    ctx.Writef("HelloRequest.Name = %s", request)
}
Dexus commented 1 month ago

@dongzhanhub please use the code blocks to show the code in good format. Thanks

dongzhanhub commented 1 month ago

@dongzhanhub please use the code blocks to show the code in good format. Thanks Sorry, didn't notice, formatted But I have a question, how does MVC support receiving protobuf?

Dexus commented 1 month ago

For the protobuf with mvc check the grpc examples with mvc

dongzhanhub commented 1 month ago

For the protobuf with mvc check the grpc examples with mvc

Thanks for your reply. I have seen this example about rpc, the configuration of pb.proto must be based on rpc service mode to receive protobuf data, which is difficult to coordinate multiple parties to change this configuration. Is MVC not currently supported in the form of a normal api? Or is there currently a way to receive octet-stream? this example:https://github.com/kataras/iris/blob/main/_examples/mvc/grpc-compatible/main.go

Dexus commented 1 month ago

you can send both json or pb directly in the body. Both works for me.

the only thing you need is the DI ob the protobuf in the function.