func queryService(c *cli.Context) { if len(c.Args()) < 2 { fmt.Println("require service and method") return } service := c.Args()[0] method := c.Args()[1] var request map[string]interface{} var response map[string]interface{} json.Unmarshal([]byte(strings.Join(c.Args()[2:], " ")), &request) req := client.NewJsonRequest(service, method, request) err := client.Call(context.Background(), req, &response) if err != nil { fmt.Printf("error calling %s.%s: %v\n", service, method, err) return } b, _ := json.MarshalIndent(response, "", "\t") fmt.Println(string(b)) }
func (s *ApiServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { if r.Method != "POST" { http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) return } defer r.Body.Close() var service, method string var request interface{} // response content type w.Header().Set("Content-Type", "application/json") switch r.Header.Get("Content-Type") { case "application/json": b, err := ioutil.ReadAll(r.Body) if err != nil { e := errors.BadRequest("go.micro.api", err.Error()) w.WriteHeader(400) w.Write([]byte(e.Error())) return } var body map[string]interface{} err = json.Unmarshal(b, &body) if err != nil { e := errors.BadRequest("go.micro.api", err.Error()) w.WriteHeader(400) w.Write([]byte(e.Error())) return } service = body["service"].(string) method = body["method"].(string) request = body["request"] default: r.ParseForm() service = r.Form.Get("service") method = r.Form.Get("method") json.Unmarshal([]byte(r.Form.Get("request")), &request) } log.Infof("API Request: /rpc service: %s, method: %s", service, method) var response map[string]interface{} req := client.NewJsonRequest(service, method, request) err := client.Call(context.Background(), req, &response) if err != nil { log.Errorf("Error calling %s.%s: %v", service, method, err) ce := errors.Parse(err.Error()) switch ce.Code { case 0: w.WriteHeader(500) default: w.WriteHeader(int(ce.Code)) } w.Write([]byte(ce.Error())) return } b, _ := json.Marshal(response) w.Header().Set("Content-Length", strconv.Itoa(len(b))) w.Write(b) }