예제 #1
0
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)
}
예제 #2
0
파일: codex_test.go 프로젝트: geotrace/rest
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()
	}
}
예제 #3
0
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)
}