Ответ
Да, разработка REST API — одна из моих ключевых компетенций в Go. Я имею опыт как в создании API с нуля, так и в работе с существующими.
Создание REST API (Серверная часть)
В основе любого веб-сервиса на Go лежит стандартный пакет net/http
. Для более сложных задач, таких как маршрутизация и middleware, я использую популярные роутеры, например, chi
или gorilla/mux
, так как они предоставляют гибкость, не усложняя приложение.
Пример простого HTTP-хендлера:
func GetItemsHandler(w http.ResponseWriter, r *http.Request) {
// Логика получения данных
items := []string{"item1", "item2"}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
json.NewEncoder(w).Encode(items)
}
func main() {
r := chi.NewRouter()
r.Get("/items", GetItemsHandler)
http.ListenAndServe(":8080", r)
}
Взаимодействие с REST API (Клиентская часть)
Для отправки запросов к внешним API я также использую стандартный пакет net/http
, так как он мощный и не требует внешних зависимостей для большинства задач.
Пример POST-запроса:
func postData() {
jsonData := map[string]string{"firstName": "John", "lastName": "Doe"}
jsonValue, _ := json.Marshal(jsonData)
req, _ := http.NewRequest("POST", "https://api.example.com/users", bytes.NewBuffer(jsonValue))
req.Header.Set("Content-Type", "application/json")
client := &http.Client{Timeout: 10 * time.Second}
resp, err := client.Do(req)
if err != nil {
log.Fatalf("Request failed: %s", err)
}
defer resp.Body.Close()
}
Принципы проектирования API
При проектировании API я придерживаюсь следующих принципов:
- Четкое использование HTTP-методов:
GET
для получения,POST
для создания,PUT
/PATCH
для обновления,DELETE
для удаления. - Правильные коды состояния HTTP:
200 OK
,201 Created
,400 Bad Request
,404 Not Found
,500 Internal Server Error
и т.д. - Версионирование API: Например, через URL (
/api/v1/...
). - Единообразные и предсказуемые ответы: Структурированный JSON для успешных ответов и ошибок.