Client +
message MailRequest {
string title = 1;
string author = 2;
}
Server -
message MailRequest {
string title = 1;
}
雖然還是可以互通但是,還是要跟clien端確認參數已經移除了,請不要再使用囉!
Client -
message MailRequest {
string title = 1;
}
Server +
message MailRequest {
string title = 1;
string author = 2;
}
Server端比Client端多參數是沒問題的。
以下是範例
我的 Server gPRC接口 參數 MailCount float64
Client端硬帶入 map[string]flaot64 => Server端就會收到 NaN
var z float64
nan := z / z
fmt.Println(nan > 1, nan < 100, math.IsNaN(nan), (nan > 100 || nan < 0))
false false true false
NaN 怎麼判斷數值都是 false
// 若有判斷MailCount的驗證 -> 會造成整個無法判斷
if in.MailCount > 100 || in.MailCount < 0 {
return nil, errors.New(`MailCount value error`)
}
改善方法
// 多個判斷
if math.IsNaN(in.MailCount) {
}
golang grpc 對接不會有這問題 因為會無法go build
其他語言ex:js就不知道了
import "google/protobuf/wrappers.proto";
message HelloRequest {
google.protobuf.DoubleValue mail_count = 1;
double mail_count_default = 2;
}
fmt.Println("in.GetMailCount", in.GetMailCount())
fmt.Println("in.GetMailCountDefault", in.GetMailCountDefault())
in.GetMailCount <nil>
in.GetMailCountDefault 0
需要在你的proto檔案內import google/protobuf/wrappers.proto,參數使用套件包過的型態,在Server端也要判斷是否為nil
我把build出來的proto.go內的判斷是拿出來給大家看。
func (m *HelloRequest) GetMailCount() *wrappers.DoubleValue {
if m != nil {
return m.MailCount
}
return nil
}
func (m *HelloRequest) GetMailCountDefault() float64 {
if m != nil {
return m.MailCountDefault
}
return 0
}
以float64
來看,用wrappers的型態,當client端真的沒傳值會回傳nil,而用預設的型態會預設回傳0!
Client端連線沒複用,每次請求都建一次連線,造成連線阻塞會越建越慢,當初還以為是Server端有問題找了半天。