当前位置: 首页 > news >正文

做的网站访问不了wordpress悬浮菜单

做的网站访问不了,wordpress悬浮菜单,网站备案幕,wordpress yzipiccgo-zero 的网关往 rpc 服务传递数据时,可以使用 headers,但需要注意前缀规则,否则会发现数据传递不过去,或者对方取不到数据。 go-zero 的网关对服务的调用使用了第三方库 grpcurl,入口函数为 InvokeRPC: …

go-zero 的网关往 rpc 服务传递数据时,可以使用 headers,但需要注意前缀规则,否则会发现数据传递不过去,或者对方取不到数据。

go-zero 的网关对服务的调用使用了第三方库 grpcurl,入口函数为 InvokeRPC:

grpcurl.InvokeRPC(r.Context(), source, cli.Conn(), rpcPath, s.prepareMetadata(r.Header), handler, parser.Next)

调用在 https://github.com/zeromicro/go-zero/blob/master/gateway/server.go 中进行的,上述调用会处理 HTTP 的 headers 数据,对于不是以字符串“Grpc-Metadata-”打头的会过滤掉,对于以字符串“Grpc-Metadata-”打头的会将“Grpc-Metadata-”转为“gateway-”。

// go-zero/gateway/internal/headerprocessor.go
// ProcessHeaders builds the headers for the gateway from HTTP headers.
func ProcessHeaders(header http.Header) []string {var headers []stringfor k, v := range header {if !strings.HasPrefix(k, metadataHeaderPrefix) { // 判断是否包含了前缀“Grpc-Metadata-”continue // 如果没有前缀“Grpc-Metadata-”则直接过滤丢弃掉}// 将前缀“Grpc-Metadata-”替换为前缀“gateway-”key := fmt.Sprintf("%s%s", metadataPrefix, strings.TrimPrefix(k, metadataHeaderPrefix))for _, vv := range v {headers = append(headers, key+":"+vv)}}return headers
}

函数 MetadataFromHeaders 负责从 headers 解码数据:

// https://github.com/fullstorydev/grpcurl/blob/master/grpcurl.go
func MetadataFromHeaders(headers []string) metadata.MD {md := make(metadata.MD)for _, part := range headers {if part != "" {pieces := strings.SplitN(part, ":", 2)if len(pieces) == 1 {pieces = append(pieces, "") // if no value was specified, just make it "" (maybe the header value doesn't matter)}headerName := strings.ToLower(strings.TrimSpace(pieces[0]))val := strings.TrimSpace(pieces[1])if strings.HasSuffix(headerName, "-bin") {if v, err := decode(val); err == nil {val = v}}md[headerName] = append(md[headerName], val)}}return md
}
// https://github.com/fullstorydev/grpcurl/blob/master/invoke.go
func InvokeRPC(ctx context.Context, source DescriptorSource, ch grpcdynamic.Channel, methodName string,headers []string, handler InvocationEventHandler, requestData RequestSupplier) error {md := MetadataFromHeaders(headers)svc, mth := parseSymbol(methodName)if svc == "" || mth == "" {return fmt.Errorf("given method name %q is not in expected format: 'service/method' or 'service.method'", methodName)}dsc, err := source.FindSymbol(svc)if err != nil {// return a gRPC status error if hasStatus is trueerrStatus, hasStatus := status.FromError(err)switch {case hasStatus && isNotFoundError(err):return status.Errorf(errStatus.Code(), "target server does not expose service %q: %s", svc, errStatus.Message())case hasStatus:return status.Errorf(errStatus.Code(), "failed to query for service descriptor %q: %s", svc, errStatus.Message())case isNotFoundError(err):return fmt.Errorf("target server does not expose service %q", svc)}return fmt.Errorf("failed to query for service descriptor %q: %v", svc, err)}sd, ok := dsc.(*desc.ServiceDescriptor)if !ok {return fmt.Errorf("target server does not expose service %q", svc)}mtd := sd.FindMethodByName(mth)if mtd == nil {return fmt.Errorf("service %q does not include a method named %q", svc, mth)}handler.OnResolveMethod(mtd)// we also download any applicable extensions so we can provide full support for parsing user-provided datavar ext dynamic.ExtensionRegistryalreadyFetched := map[string]bool{}if err = fetchAllExtensions(source, &ext, mtd.GetInputType(), alreadyFetched); err != nil {return fmt.Errorf("error resolving server extensions for message %s: %v", mtd.GetInputType().GetFullyQualifiedName(), err)}if err = fetchAllExtensions(source, &ext, mtd.GetOutputType(), alreadyFetched); err != nil {return fmt.Errorf("error resolving server extensions for message %s: %v", mtd.GetOutputType().GetFullyQualifiedName(), err)}msgFactory := dynamic.NewMessageFactoryWithExtensionRegistry(&ext)req := msgFactory.NewMessage(mtd.GetInputType())handler.OnSendHeaders(md)ctx = metadata.NewOutgoingContext(ctx, md)stub := grpcdynamic.NewStubWithMessageFactory(ch, msgFactory)ctx, cancel := context.WithCancel(ctx)defer cancel()if mtd.IsClientStreaming() && mtd.IsServerStreaming() {return invokeBidi(ctx, stub, mtd, handler, requestData, req)} else if mtd.IsClientStreaming() {return invokeClientStream(ctx, stub, mtd, handler, requestData, req)} else if mtd.IsServerStreaming() {return invokeServerStream(ctx, stub, mtd, handler, requestData, req)} else {return invokeUnary(ctx, stub, mtd, handler, requestData, req)}
}

网关可如下实现:

newReq := r.WithContext(r.Context())
newReq.Header.Set("Grpc-Metadata-myuid", userId)
next.ServeHTTP(w, newReq)

服务端的实现:

vals := metadata.ValueFromIncomingContext(l.ctx, "gateway-myuid")
userId := vals[0]
http://www.yayakq.cn/news/327418/

相关文章:

  • 安全网站建设赣州网络公司电话
  • 顺德建网站的公司已注册域名怎么做网站呢
  • 做商城网站都需要什么中学加强校园网站建设
  • 浏览器怎么打开网站服务器设置榆中县城乡建设局网站
  • 做网站用什么ui美观网站排名怎么上去
  • 自己做鲜花网站怎么样网络程序设计学什么
  • 响应式网站和自适应网站的区别wordpress编辑器 下载
  • 西安seo网站管理网站开发招聘职位
  • 网站建设哪家公司东莞百度seo哪家好
  • 徐州提供网站建设要多少钱常州知名做网站服务
  • 中国造价工程建设管理协会网站重庆住房和城乡建设部网站的打印准考证
  • 水果销售网站开发文献综述360免费wifi怎么安装
  • 可以做宣传的网站有哪些网络公司怎么优化网站
  • 我想创业做网站微信开放文档官网
  • 成华区门户网站如何将一个网页生成链接
  • 海底捞口碑营销北京seo服务行者
  • 安乡网站制作合肥公司做网站
  • 越城区住房和城乡建设局网站网站备案时间
  • 苏州沧浪做网站哪家好电子商城网站建议书
  • 团购网站开发代码青岛网站推广公司
  • 利用python做网站网页源代码下载
  • 酒泉地网站推广仿顺丰优选网站源码
  • 套模板建设网站多少钱wordpress 自带相册
  • 网站建设服务兴田德润响应式布局与自适应布局区别
  • 哪家成都公司做网站怎样做网络营销推广网站营销推广
  • 怎么做网站服务器吗外贸免费建设网站
  • 模板网站建设乐云seo效果好seo外链自动群发工具
  • 免费招聘网站平台有哪些wordpress 链接新窗口打开
  • 无锡网站推广$做下拉去118cr广告图文制作用哪个软件
  • 网站返利二维码怎么做阿里云 wordpress 权限设置