Hijacker

Hijacker跟preprocessor类型,区别在于,hijacker接管了整个request处理过程。

如果把一个hijacker配置给一个URL,它会在拦截器的最后一个Before()方法之后,第一个After()方法之前,接管这之间的整个处理过程。

你想干什么都行,这意味这,向service发送请求和错误处理这类事情,你也得自己来。

如果一个URL上同时设置了Hijacker和preprocessor,那么preprocessor会被忽略。

下面的例子中,URL “/eat_apple/{num:[0-9]+}” 被”接管”了,不管queryString里是什么值,参数”num”都被设置成了”999”。

func (i *ServiceInitializer) InitService(s turbo.Servable) error {
+       s.RegisterComponent("hijackEatApple", hijackEatApple)
    return nil
}

+var hijackEatApple turbo.Hijacker = func (resp http.ResponseWriter, req *http.Request) {
+      client := turbo.GrpcService().(gen.YourServiceClient)
+      r := new(gen.EatAppleRequest)
+      r.Num = "999"
+      res, err := client.EatApple(req.Context(), r)
+      if err == nil {
+              resp.Write([]byte(res.String() + "\n"))
+      } else {
+              resp.Write([]byte(err.Error() + "\n"))
+      }
+}

编辑 “yourservice/service.yaml”:

+hijacker:
+  - GET /eat_apple/{num:[0-9]+} hijackEatApple

重启服务并测试:

$ curl -w "\n" "http://localhost:8081/eat_apple/6"
message:"Good taste! Apple num=999"