받는 사람 grpc 서버 protobuf 변환 매개 변수 쿼리 요청 HTTP

전제

요청 grpc 서비스 요청을 수신 한 후에는, HTTP에 인수를 변환하는 다른 인터페이스로 요청해야합니다.

사용, 데이터 프로토콜은 protobuf있는 서버로 이동 grpc

몇 가지 솔루션의 생각 :

  • 1. 컴파일 pb.go 파일이 존재하는 모든 파라미터를 파라미터 파라미터 값 (K) 사이의 공간에 의해 분리되어, 프린트 아웃 할 수있다) (문자열이다 : V 형태이지만 따옴표없이하지 JSON 체재

  • 2. 수신 된 데이터로 변환된다 JSON 직접 JSON 포맷 전송 요청
  • 요청이 속성을 얻기 위해 특정의 특성 및 방법을 얻을, 고정 구조체에 리플렉터를 통해 전달 된 다음 url.values ​​{}에 추가, 재 인코딩 ()이 요청을 전송

실현

시나리오 1

도 1은 공간 분할되고, 상대적으로 간단한 방식이고, 상기 파라미터 값은 다음에 따라 수득 ' "매개 변수를 분할함으로써 얻어진 url.values ​​첨가 값 {}

다음과 같이 코드입니다 :

param := url.Values{}
//得到请求的字符串形式
rs := strings.Split(request.String(), " ")
    for _, v := range rs {
        if v != "" {
            vv := strings.Split(v, ":")
            param.Add(vv[0], strings.Trim(vv[1], "\""))
            vv := strings.SplitN(v, ":", 2)
            //转换成
            val, e := strconv.Unquote(vv[1])
            log.Print(val, e)
            if e == nil {
                param.Add(vv[0], val)
            }
        }
    }

조기 확인을 실행, 후자의 두 가지 문제가 발생했습니다 :

  • 1. 시간 공간에 제출 된 값은 문제 세분화가있을 것입니다
  • 2. 한자는 UTF8가 얻을

시나리오 1 포기

시나리오 2

데이터는 제지도 형태 [문자열] 문자열로 파싱 한 후 JSON으로 변환하고, 상기 목적은 문자열 값을 변환 생략이고

str, _ := json.Marshal(request)
    jsonstr := string(str)

    m := make(map[string]interface{})
    e := json.Unmarshal([]byte(jsonstr), &m)
    param := url.Values{}
    if e != nil {
        return param
    }

    for k, v := range m {
        sv := fmt.Sprint(v)
        param.Add(k, sv)
    }

결과 : 중국의 경우 공간 문제가 해결되지만, 디지털 변환, 부동 소수점으로 문제의 변환을 Int64 타입 것

시나리오 3

실제 구조체를 반영하면 실제 매개 변수 이름 태그 속성을 기반으로하는 동일 필요하지 않은 구조체의 프로토 파일에 PB 컴파일 파일 이름과 재산을 이동 패키지를 반영하기 위해 따라 이동

다음과 같이 코드입니다 :

    ty := reflect.TypeOf(request).Elem()
    #得到struct的属性数量
    fieldnum := ty.NumField()
    
    #实际数据的指针
    ob := reflect.ValueOf(request)
    param := url.Values{}
    #由于编译好的属性最后3位不用
    for i := 0; i < fieldnum-3; i++ {
        f := ty.Field(i).Tag.Get("json")
        fv := strings.Split(f, ",")
        k := fv[0]

        fieldname := ty.Field(i).Name
        ret := ob.MethodByName("Get" + fieldname).Call(nil)
        if !ret[0].IsZero() {
            # 这一步,用了很巧的办法把各个类型转换成了string才能加入到param里
            v := fmt.Sprint(ret[0])
            param.Add(k, v)
        }
    }
    return param

추천

출처www.cnblogs.com/efan/p/12061823.html