|
@@ -0,0 +1,62 @@
|
|
|
+package main
|
|
|
+
|
|
|
+/*
|
|
|
+Sample request content:
|
|
|
+ Method: POST
|
|
|
+ Content-type: application/json -> without it JSON-RPC returns a 415.
|
|
|
+ Accept header is not needed.
|
|
|
+
|
|
|
+{
|
|
|
+ "method": "StringService.Length",
|
|
|
+ "params" : [
|
|
|
+ {
|
|
|
+ "Message": "Hello, world"
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ "id": 1
|
|
|
+}
|
|
|
+
|
|
|
+Sample Curl usage:
|
|
|
+
|
|
|
+curl -X POST -H "Content-type: application/json" -d '{"method": "StringService.Length", "params": [{"Message": "Hello, world"}], "Id": 1}' http://localhost:8080/rpc
|
|
|
+
|
|
|
+ */
|
|
|
+
|
|
|
+import (
|
|
|
+ "net/http"
|
|
|
+
|
|
|
+ "github.com/gorilla/rpc/v2"
|
|
|
+ "github.com/gorilla/rpc/v2/json"
|
|
|
+
|
|
|
+ "fmt"
|
|
|
+ "unicode/utf8"
|
|
|
+ "github.com/davecgh/go-spew/spew"
|
|
|
+)
|
|
|
+
|
|
|
+type RPCApiArguments struct {
|
|
|
+ Message string
|
|
|
+}
|
|
|
+
|
|
|
+type RPCAPIResponse struct {
|
|
|
+ Message string
|
|
|
+}
|
|
|
+
|
|
|
+type StringService struct{}
|
|
|
+
|
|
|
+func (s *StringService) Length(q *http.Request, args *RPCApiArguments, r *RPCAPIResponse) error {
|
|
|
+ r.Message = fmt.Sprintf("Your request [%s] is %d characters long",
|
|
|
+ args.Message,
|
|
|
+ utf8.RuneCountInString(args.Message))
|
|
|
+ spew.Dump(r)
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+func main() {
|
|
|
+ address := ":8080"
|
|
|
+ fmt.Printf("API started on %s\n", address)
|
|
|
+ s := rpc.NewServer()
|
|
|
+ s.RegisterCodec(json.NewCodec(), "application/json")
|
|
|
+ s.RegisterService(new(StringService), "")
|
|
|
+ http.Handle("/rpc", s)
|
|
|
+ http.ListenAndServe(address, nil)
|
|
|
+}
|