func ExampleServeMux_Handles() { var mux rest.ServeMux mux.Handles(rest.Paths{ "/user/:id": { "GET": user.get, "POST": user.post, }, "/message/:text": {"GET": getMessage}, "/file/:name": {"GET": secure(getFile)}, }) // т.к. поддерживается интерфейс http.Handler, то можно использовать // с любыми стандартными библиотеками http.ListenAndServe(":8080", mux) }
func TestCodex(t *testing.T) { rest.Debug = true rest.SetLogger(os.Stderr) rest.Encoder = NewCoder(0) var mux rest.ServeMux mux.Handle("GET", "/test", func(c *rest.Context) error { return c.Send("test1") }) mux.Handle("POST", "/test", func(c *rest.Context) error { return c.Send(errors.New("test2")) }) mux.Handle("PUT", "/test", func(c *rest.Context) error { return c.Send(rest.JSON{"test": "message", "time": time.Now()}) }) mux.Handle("PATCH", "/test", func(c *rest.Context) error { return c.Send(mux) }) mux.Handle("TEST", "/test", func(c *rest.Context) error { return c.Send(struct { Test complex64 }{ Test: complex(3, 15), }) }) ts := httptest.NewServer(mux) defer ts.Close() for _, method := range []string{"GET", "POST", "PUT", "PATCH", "TEST"} { req, err := http.NewRequest(method, ts.URL+"/test", nil) if err != nil { t.Fatal(err) } req.Header.Set("Accept", "application/json") dump, err := httputil.DumpRequest(req, true) if err != nil { t.Fatal(err) } fmt.Printf("%s\n", dump) resp, err := http.DefaultClient.Do(req) if err != nil { t.Error(err) } dump, err = httputil.DumpResponse(resp, true) if err != nil { t.Fatal(err) } fmt.Printf("%s\n%s\n", dump, strings.Repeat("-", 40)) resp.Body.Close() } }
func Example() { var mux rest.ServeMux // инициализируем обработчик запросов // добавляем описание обработчиков, задавая пути, методы и функции их обработки mux.Handles(rest.Paths{ // при задании путей можно использовать именованные параметры с ':' "/user/:id": { "GET": func(c *rest.Context) error { // можно быстро сформировать ответ в JSON return c.Send(rest.JSON{"user": c.Param("id")}) }, // для одного пути можно сразу задать все обработчики для разных методов "POST": func(c *rest.Context) error { var data = make(rest.JSON) // можно быстро десериализовать JSON, переданный в запросе, в объект if err := c.Bind(&data); err != nil { // возвращать ошибки тоже удобно return err } return c.Send(rest.JSON{"user": c.Param("id"), "data": data}) }, }, // можно одновременно описать сразу несколько путей в одном месте "/message/:text": { "GET": func(c *rest.Context) error { // параметры пути получаются простым запросом return c.Send(rest.JSON{"message": c.Param("text")}) }, }, "/file/:name": { "GET": func(c *rest.Context) error { // поддерживает отдачу разного типа данных, в том числе и файлов file, err := os.Open(c.Param("name") + ".html") if err != nil { return err } defer file.Close() // можно получать не только именованные элементы пути, но // параметры, используемые в запросе if c.Param("format") == "raw" { c.ContentType = `text/plain; charset="utf-8"` } else { c.ContentType = `text/html; charset="utf-8"` } return c.Send(file) // отдаем содержимое файла }, }, "/favicon.ico": { // для работы со статическими файлами определена специальная функция "GET": rest.File("./favicon.ico"), }, }) // можно сразу задать базовый путь для всех URL, используемых в обработчиках mux.BasePath = "/api/v1" // можно задать глобальные заголовки для всех ответов mux.Headers = map[string]string{ "X-Powered-By": "My Server", } // т.к. поддерживается интерфейс http.Handler, то можно использовать // с любыми стандартными библиотеками http http.ListenAndServe(":8080", mux) }