전제
요청 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