登录
首页 >  Golang >  Go问答

客户端在使用 Go 编写的 gRPC 服务时为什么会收到“传输:收到意外的内容类型”错误?

来源:stackoverflow

时间:2024-03-23 11:36:30 464浏览 收藏

在使用 Go 编写的 gRPC 服务时,客户端可能会遇到“传输:收到意外的内容类型”错误。该错误表明客户端收到了意外的内容类型,例如“text/plain”,而不是 gRPC 协议定义的有效内容类型。这可能是由于客户端指向错误的端口或设置,导致客户端向非 gRPC 服务器发出请求。

问题内容

我刚刚从 micro/go-grpc 克隆了示例代码,并尝试在本地主机中构建 grpc 服务器。

proto file 

syntax = "proto3";

package go.micro.srv.greeter;

service say {
    rpc hello(request) returns (response) {}
}

message request {
    string name = 1;
}

message response {
    string msg = 1;
}

服务器/main.go

package main

import (
    "context"
    "log"

    "github.com/micro/go-micro"
    "github.com/micro/go-grpc"
    hello "github.com/micro/go-grpc/examples/greeter/server/proto/hello"
)

type say struct{}

func (s *say) hello(ctx context.context, req *hello.request, rsp 
*hello.response) error {
    log.print("received say.hello request")
    rsp.msg = "hello " + req.name
    return nil
}

func main() {
    service := grpc.newservice(
        micro.name("go.micro.srv.greeter"),
    )

// optionally setup command line usage
service.init()

// register handlers
hello.registersayhandler(service.server(), new(say))

// run server
if err := service.run(); err != nil {
    log.fatal(err)
    }
}

客户端/main.go

package main

import (
    "context"
    "fmt"

    "github.com/micro/cli"
    "github.com/micro/go-grpc"
    hello "github.com/micro/go-grpc/examples/greeter/server/proto/hello"
    "github.com/micro/go-micro"
)

var (
    // service to call
    servicename string
)

func main() {
    service := grpc.newservice()

    service.init(
        micro.flags(cli.stringflag{
            name:        "service_name",
            value:       "go.micro.srv.greeter",
            destination: &servicename,
        }),
    )

    cl := hello.newsayservice(servicename, service.client())

    rsp, err := cl.hello(context.todo(), &hello.request{
        name: "john",
    })
    if err != nil {
        fmt.println(err)
        return
    }

    fmt.println(rsp.msg)
}

我的操作系统是macosx,go版本是1.11.1

当我运行服务器端示例代码时,一切看起来都很好:

$ go run ./main.go --server_address:localhost:9999
2018/11/18 20:08:05 listening on 127.0.0.1:9999
2018/11/18 20:08:05 broker listening on [::]:62739
2018/11/18 20:08:05 registering node: go.micro.srv.greeter-9b2818b0-eb2a-11e8-bfef-720008acb800

但是如果我运行客户端示例代码,总是收到:

{"id":"","code":0,"detail":"transport: received the unexpected content-type "text/plain"","status":""}

我尝试删除 --server_address 但仍然相同。我尝试添加 mdns 注册表,但也不起作用。我尝试使用 $ micro health go.micro.srv.greeter,它返回了相同的结果。

想知道我的设置有什么问题吗?


解决方案


我刚刚遇到了同样的错误,因为我指向了错误的端口。我确信我的设置与您的设置不同,这是一个不同的问题,但问题是我试图向 http 服务器发出 GRPC 请求,该请求返回内容类型为“text/plain”的 404 not found “ 对于 html。如果您在删除服务器地址时遇到同样的问题,可能是您没有正确读取参数,或者您设置的值仍然指向有 http 服务器而不是 GRPC 服务器的地方。 p>

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>