Во-первых, мы должны поговорить о семействе баз данных No-SQL, к которому принадлежит MongoDB, во-вторых, мы должны коснуться того, как установить MongoDB в нашу систему (я предполагаю, что вы используете один из дистрибутивов Linux), а затем мы интегрируем эту базу данных MongoDB с простым Gorilla-Mux API.
Код к этой статье можно найти здесь.
No-SQL (нереляционные базы данных)
Это документально-ориентированные базы данных, формат хранения данных в которых отличается от SQL баз данных, таких как MySQL или PostgreSQL. Существуют различные типы нереляционных баз данных, основанные на их модели данных. Основными типами являются базы данных документов, такие как MongoDB, базы данных ключевых значений, такие как Redis, базы данных с широким столбцом, такие как Apache и Cassandra, и, наконец, графовые базы данных, такие как Orient-DB, Dgraph.
Базы данных No-SQL дают разработчикам свободу хранения огромных объемов неструктурированных данных. Это связано с тем, что базы данных No-SQL менее структурированы или ограничены по формату, что обеспечивает большую гибкость и адаптируемость к типу хранимых данных.
Популярным примером приложения, использующего базу данных No-SQL, является приложение Messenger от Facebook, которое использует Apache HBase для потоковой передачи данных на кластеры Hadoop. Apache HBase — это ширококолоночная база данных, созданная по образцу Big Table от Google.
Характеристики баз данных No-SQL (нереляционных):
- Простота интеграции и использования в приложениях для разработчиков
- Позволяет горизонтальное или горизонтальное масштабирование.
- Позволяют быстро выполнять запросы
- Имеют гибкую схему.
Более подробно эта тема раскрыта в этой статье здесь.
Установка MongoDB
Сначала мы обновим apt и установим MongoDB, как показано ниже:
mykmyk@skynet:~$ sudo apt update
затем;
mykmyk@skynet:~$ sudo apt-get install mongodb
Теперь, чтобы убедиться, что ваша база данных MongoBD установлена
правильно, проверьте это, выполнив следующие действия:
mykmyk@skynet:~$ mongo
MongoDB shell version v3.6.3
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.6.3
Server has startup warnings:
2022-07-23T22:58:19.824+0300 I STORAGE [initandlisten]
2022-07-23T22:58:19.824+0300 I STORAGE [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2022-07-23T22:58:19.824+0300 I STORAGE [initandlisten] ** See http://dochub.mongodb.org/core/prodnotes-filesystem
2022-07-23T22:58:30.835+0300 I CONTROL [initandlisten]
2022-07-23T22:58:30.835+0300 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2022-07-23T22:58:30.835+0300 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2022-07-23T22:58:30.835+0300 I CONTROL [initandlisten]
>
Если вы столкнулись с ошибками во время установки MongoDB, я отсылаю вас к этой хорошо написанной статье, она должна стать достаточным руководством для безопасной установки базы данных в вашей системе.
Чтобы проверить базы данных, доступные в нашей MongoDB DMS:
> show databases;
admin 0.000GB
appdb 0.000GB
config 0.000GB
local 0.000GB
test 0.000GB
Приведенная выше команда «show databases» выводит список всех доступных баз данных, по умолчанию, admin, test и local — это три базы данных, которые должны быть доступны перед созданием новой базы данных;
Мы собираемся создать базу данных под названием «booksdb», поэтому, находясь в оболочке MongoDB:
> use booksdb;
switched to db booksdb
Команда «use booksdb» выше переключается с текущей базы данных на базу данных booksdb, которую мы только что создали. Интересно отметить, что «booksdb» не появится, если мы запросим все доступные базы данных с помощью команды «show databases». Попробуйте это сделать.
> use booksdb;
switched to db booksdb
> show databases;
admin 0.000GB
appdb 0.000GB
config 0.000GB
local 0.000GB
test 0.000GB
Вышеописанное явление является результатом внутренней реализации MongoDB, база данных создается в MongoDB только тогда, когда в нее вставляются фактические начальные данные, поэтому давайте сделаем это.
все еще находясь в оболочке MongoDB, введите:
> db.books.insertOne({_id:5, title: 'A Song Of Ice and Fire',authors:['George R.R Martin','Phyllis Eisenstein'],publishdate:'August 1,1996',characters:['Jon Snow','Daenerys Targaryen','Eddard Star','Sansa Stark','Jammie Lannister','Rob Stark','Cerser Lannister'],publisher:{name:'Bantam Books',country:'United States',website:'www.randomhousebooks.com'}})
{ "acknowledged" : true, "insertedId" : 5 }
В json, который мы только что вставили, есть идентификатор _id, мы можем либо указать этот идентификатор при вставке нашего объекта books, либо предоставить MongoDB вставить его за нас. Попробуем вставить книгу без указания идентификатора и посмотрим, что сделает MongoDB:
> db.books.insertOne({title: 'A Feast Of Crows',authors:['George R.R Martin'],publishdate:'August 1,1996',characters:['Jon Snow','Daenerys Targaryen','Eddard Star','Sansa Stark','Jammie Lannister','Rob Stark','Cerser Lannister'],publisher:{name:'Bantam Books',country:'United States',website:'www.randomhousebooks.com'}})
{
"acknowledged" : true,
"insertedId" : ObjectId("62dda3f1457193537fd4d245")
}
>
Как вы можете видеть выше, в JSON-ответе insert aknowledgment, значение insertId теперь изменилось на длинное хэш-значение, которое генерируется внутри MongoDB, в нашем случае это «62dda3f1457193537fd4d245».
Для поиска книг мы используем ключевое слово find(), как показано ниже:
> db.books.find()
{ "_id" : 5, "title" : "A Song Of Ice and Fire", "authors" : [ "George R.R Martin", "Phyllis Eisenstein" ], "publishdate" : "August 1,1996", "characters" : [ "Jon Snow", "Daenerys Targaryen", "Eddard Star", "Sansa Stark", "Jammie Lannister", "Rob Stark", "Cerser Lannister" ], "publisher" : { "name" : "Bantam Books", "country" : "United States", "website" : "www.randomhousebooks.com" } }
{ "_id" : ObjectId("62dda3f1457193537fd4d245"), "title" : "A Feast Of Crows", "authors" : [ "George R.R Martin" ], "publishdate" : "August 1,1996", "characters" : [ "Jon Snow", "Daenerys Targaryen", "Eddard Star", "Sansa Stark", "Jammie Lannister", "Rob Stark", "Cerser Lannister" ], "publisher" : { "name" : "Bantam Books", "country" : "United States", "website" : "www.randomhousebooks.com" } }
>
Функция find() без каких-либо дополнительных аргументов возвращает все
документы в нашей коллекции «booksdb». Для возврата одного документа мы используем findOne(), если он пуст, то возвращает последний документ, т.е:
> db.books.findOne()
{
"_id" : 5,
"title" : "A Song Of Ice and Fire",
"authors" : [
"George R.R Martin",
"Phyllis Eisenstein"
],
"publishdate" : "August 1,1996",
"characters" : [
"Jon Snow",
"Daenerys Targaryen",
"Eddard Star",
"Sansa Stark",
"Jammie Lannister",
"Rob Stark",
"Cerser Lannister"
],
"publisher" : {
"name" : "Bantam Books",
"country" : "United States",
"website" : "www.randomhousebooks.com"
}
}
>
Мы можем вводить параметры фильтрации в наши запросы к коллекции find(), как показано ниже:
> db.books.find({title:{$eq: "A Feast Of Crows"}})
{ "_id" : ObjectId("62dda3f1457193537fd4d245"), "title" : "A Feast Of Crows", "authors" : [ "George R.R Martin" ], "publishdate" : "August 1,1996", "characters" : [ "Jon Snow", "Daenerys Targaryen", "Eddard Star", "Sansa Stark", "Jammie Lannister", "Rob Stark", "Cerser Lannister" ], "publisher" : { "name" : "Bantam Books", "country" : "United States", "website" : "www.randomhousebooks.com" } }
Мы можем удалить документ из заданной коллекции с помощью функций deleteOne и deleteMany:
> db.books.deleteOne({"_id": ObjectId("62dda3f1457193537fd4d245")})
{ "acknowledged" : true, "deletedCount" : 1 }
На следующем этапе мы сосредоточимся на создании нашего очень простого GorillaMux API:
Gorilla-Mux API
Прежде всего, чтобы наш API мог общаться с базой данных MongoDB, мы будем использовать драйвер базы данных под названием mgo.
mgo- Богатый драйвер MongoDB для Go
Это драйвер MongoDB для go-lang, который позволяет разработчикам создавать приложения, как в нашем случае, и иметь интерфейс API непосредственно с базой данных MongoDB без необходимости проходить через интерактивную оболочку Mongo. Этот драйвер действует как обертка вокруг API MongoDB.
Ознакомьтесь с документацией по этому драйверу здесь, чтобы получить более глубокое представление о его реализации и применении.
Установка mgo:
Сначала создадим папку для нашего приложения, создадим папку под названием MongoGorilla:
mykmyk@skynet:~/go/src/github.com/myk4040okothogodo/GoMongo$ mkdir MongoGorilla
Затем запустите go mod init, который создаст файл go.mod для отслеживания зависимостей, которые мы будем использовать для создания нашего API приложения, как драйвер mgo выше:
mykmyk@skynet:~/go/src/github.com/myk4040okothogodo/MongoGorilla$ go mod init
go: creating new go.mod: module github.com/myk4040okothogodo/MongoGorilla
mykmyk@skynet:~/go/src/github.com/myk4040okothogodo/MongoGorilla$ ll
total 12
drwxrwxr-x 2 mykmyk mykmyk 4096 Jul 23 23:24 ./
drwxrwxr-x 20 mykmyk mykmyk 4096 Jul 23 23:09 ../
-rw-rw-r-- 1 mykmyk mykmyk 58 Jul 23 23:24 go.mod
Теперь установим наш драйвер «mgo», как показано ниже:
mykmyk@skynet:~/go/src/github.com/myk4040okothogodo/MongoGorilla$ go get gopkg.in/mgo.v2
go: downloading gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22
go: added gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22
Gorilla-Mux
Далее мы должны добавить пакет gorilla/mux, который поможет реализовать очень простой маршрутизатор в нашем API, чтобы помочь подобрать входящий запрос к соответствующим обработчикам.
Более подробно о пакете и о том, как он реализует свои функции диспетчеризации, читайте здесь.
Чтобы установить пакет и сделать его доступным в нашем проекте, в корневой папке проекта, где находится файл go.mod, введите следующее:
mykmyk@skynet:~/go/src/github.com/myk4040okothogodo/MongoGorilla$ go get -u github.com/gorilla/mux
go: downloading github.com/gorilla/mux v1.8.0
go: added github.com/gorilla/mux v1.8.0
mykmyk@skynet:~/go/src/github.com/myk4040okothogodo/MongoGorilla$
Создание API
Теперь давайте напишем простую программу, которая общается с базой данных MongoDB с помощью нашего драйвера «mgo» и вставляет запись книги » A song of Ice and Fire».
Создайте файл под названием «main.go», откройте его и добавьте следующий код, показанный ниже:
1 package main
2
3 import (
4 "os"
5 "os/signal"
6 "context"
7 "time"
8 "net/http"
9 "io/ioutil"
10 "encoding/json"
11 "github.com/hashicorp/go-hclog"
12 "log"
13 "github.com/gorilla/mux"
14 mgo "gopkg.in/mgo.v2"
15 "gopkg.in/mgo.v2/bson"
16
17 )
18
19
20 // The struct below holds our database session information
21 type DBSession struct {
22 session *mgo.Session
23 collection *mgo.Collection
24 }
25
26
27 //Book struct holds book data
28 type Book struct {
29 ID bson.ObjectId `json: "id" bson:"_id,omitempty"`
30 Title string `json: "title" bson:"title"`
31 Authors []string `json: "authors" bson: "authors"`
32 Genre []string `json: "genre" bson: "genre"`
33 PublishDate string `json: "publishdate" bson: "publishdate"`
34 Characters []string `json: "characters" bson: "characters"`
35 Publisher Publisher `json: "publisher" bson:"publisher"`
36 }
37
38
39 // Publisher is nested in Movie
40 type Publisher struct {
41 Name string `json: "budget" bson:"name"`
42 Country string `json: "country" bson:"country"`
43 website string `json: "website" bson:"website"`
44 }
45
46
47 // GetBook fetches a book with a given ID
48 func (db *DBSession) GetBook (w http.ResponseWriter, r *http.Request){
49 vars := mux.Vars(r)
50
51 w.WriteHeader(http.StatusOK)
52 var book Book
53 err := db.collection.Find(bson.M{"_id": bson.ObjectIdHex(vars["id"])}).One(&book)
54 if err != nil {
55 w.Write([]byte(err.Error()))
56 } else {
57 w.Header().Set("Content-Type", "application/json")
58 response, _ := json.Marshal(book)
59 w.Write(response)
60 }
61 }
62
63
64 //PostBook adds a new book to our MongoDB collection
65 func (db *DBSession) PostBook (w http.ResponseWriter, r *http.Request){
66 var book Book
67 postBody, _ := ioutil.ReadAll(r.Body)
68 json.Unmarshal(postBody, &book)
69
70 //Create a Hash ID to insert
71 book.ID = bson.NewObjectId()
72 err := db.collection.Insert(book)
73 if err != nil {
74 w.Write([]byte(err.Error()))
75 } else {
76 w.Header().Set("Content-Type","application/json")
77 response, _ := json.Marshal(book)
78 w.Write(response)
79 }
80 }
81
82
83
84
85 //UpdateBook modifies the data of an existing book resource
86 func (db *DBSession) UpdateBook(w http.ResponseWriter, r *http.Request){
87 vars := mux.Vars(r)
88 var book Book
89
90 putBody, _ := ioutil.ReadAll(r.Body)
91 json.Unmarshal(putBody, &book)
92 err := db.collection.Update(bson.M{"_id":
93 bson.ObjectIdHex(vars["id"])}, bson.M{"$set": &book})
94
95 if err != nil {
96 w.WriteHeader(http.StatusOK)
97 w.Write([]byte(err.Error()))
98 } else {
99 w.Header().Set("Content-Type","text")
100 w.Write([]byte("Update succesfully"))
101 }
102 }
103
104
105 //DeleteBook removes the data from the db
106 func (db *DBSession) DeleteBook (w http.ResponseWriter, r *http.Request){
107 vars := mux.Vars(r)
108 err := db.collection.Remove(bson.M{"_id":
109 bson.ObjectIdHex(vars["id"])})
110 if err != nil {
111 w.WriteHeader(http.StatusOK)
112 w.Write([]byte(err.Error()))
113 } else {
114 w.Header().Set("Content-Type", "text")
115 w.Write([]byte("Delete Succesfully"))
116 }
117 }
118
119 func main() {
120 l := hclog.Default()
121 session, err := mgo.Dial("127.0.0.1")
122 c := session.DB("booksdb").C("books")
123 db := &DBSession{session: session, collection:c}
124 addr := "127.0.0.1:8000"
125 if err != nil {
126 panic(err)
127 }
128 defer session.Close()
129
130 //logger := log.New(os.Stdout, "", log.Ldate | log.Ltime)
131 // Create a new router
132 r := mux.NewRouter()
133
134 //Attach an elegant path with handler
135 r.HandleFunc("/api/books/{id:[a-zA-Z0-9]*}", db.GetBook).Methods("GET")
136 r.HandleFunc("/api/books", db.PostBook).Methods("POST")
137 r.HandleFunc("/api/books/{id:[a-zA-Z0-9]*}", db.UpdateBook).Methods("PUT")
138 r.HandleFunc("/api/books/{id:[a-zA-Z0-9]*}", db.DeleteBook).Methods("DELETE")
139
140 srv := &http.Server{
141 Handler: r,
142 Addr: addr,
143 ErrorLog: l.StandardLogger(&hclog.StandardLoggerOptions{}),
144 IdleTimeout: time.Minute,
145 WriteTimeout: 15 * time.Second,
146 ReadTimeout: 15 * time.Second,
147 }
148
149 //start the server
150 go func() {
151 l.Info("Starting server on port 8000 ")
152 err := srv.ListenAndServe()
153 if err != nil {
154 l.Error("Error starting the server :", "error", err)
155 os.Exit(1)
156 }
157 }()
158
159
160 //Trap sigterm or interupt and gracefully shutdown the server
161 ch := make(chan os.Signal, 1)
162 signal.Notify(ch, os.Interrupt)
163 signal.Notify(ch, os.Kill)
164
165 //Block untill a signal is received
166 sig := <- ch
167 log.Println("Got signal :", sig)
168
169
170 //gracefully shutdown the server, waiting max 30 for current operations to complete
171 ctx, _ := context.WithTimeout(context.Background(), 30 * time.Second)
172 srv.Shutdown(ctx)
173
174 }
Не забудьте выполнить команду «go mod tidy», чтобы привести в порядок все прямые и косвенные зависимости.
В приведенном выше коде мы сначала создаем две структуры, DBSession и Book;
Структура DBSession будет использоваться для хранения нашей сессии базы данных и свойств коллекции драйвера mgo. Структура Book будет хранить данные нашей книги, также обратите внимание, что структура Book имеет вложенную структуру Publisher.
Далее мы определяем метод приемника-указателя для нашей структуры Book, которая должна реализовать интерфейс Handler. В данном случае мы сначала определяем метод GetBook, который извлекает книгу из базы данных, используя идентификатор, предоставленный в качестве части запроса, а затем возвращает этот метод в качестве ответа. Затем мы определяем второй метод под названием PostBook, который делает то, что следует из его названия: он принимает книгу, отправленную в качестве части тела запроса, а затем пытается вставить эту книгу в нашу базу данных. Мы создали еще один метод обработчика под названием UpdateBook, который принимает обновленные значения книги, уже существующей в нашей базе данных, и пытается изменить одно из ее значений. Наш последний обработчик — метод DeleteBook, который использует данные, относящиеся к книге, хранящейся в нашей базе данных. Мы идентифицируем эту конкретную книгу с помощью идентификатора, который отправляется в качестве части запроса.
Затем мы создаем нашу главную функцию, в ней мы инстанцируем сессию с нашей базой данных, которую мы будем использовать для всех наших последующих запросов и обновлений, затем мы создаем новый маршрутизатор, используя метод NewRouter() в gorilla/mux, затем мы присоединяем наши обработчики к этому маршрутизатору, чтобы обеспечить отправку различных запросов к их последующим обработчикам. Затем мы запускаем наш сервер как go-программу, создаем канал для прослушивания и ответа на сигналы завершения работы сервера.
Чтобы добавить новую книгу в нашу базу данных и протестировать конечную точку POST, сделаем пост-запрос к нашему API, откроем терминал из любого места и выполним следующий запрос curl:
mykmyk@skynet:~/go/src/github.com/myk4040okothogodo/MongoGorilla$ curl -X POST
> http://localhost:8000/api/books
> -H 'cache-control: no-cache'
> -H 'content-type: application/json'
> -H 'postman-token: 6ef9507e-65b3-c3dd-4748-3a2a3e055c9c'
> -d '{"title" :"A Dance with Dragons","authors":[ "George R.R Martin", "Phyllis Eisenstein"],"publishdate":"August 6,1998","characters":[ "Jon Snow", "Daenerys Targaryen", "Eddard Star", "Sansa Stark", "Jammie Lannister", "Rob Stark", "Cerser Lannister" ],"publisher": { "name" : "Bantam Books", "country" : "United States", "website" : "www.randomhousebooks.com" }}'
Вы получите ответ от сервера API, который будет выглядеть следующим образом:
{"ID":"62ddc5e89c99ea1313ae2568","Title":"A Dance with Dragons","Authors":["George R.R Martin","Phyllis Eisenstein"],"Genre":null,"PublishDate":"August 6,1998","Characters":["Jon Snow","Daenerys Targaryen","Eddard Star","Sansa Stark","Jammie Lannister","Rob Stark","Cerser Lannister"],"publisher": { "name" : "Bantam Books", "country" : "United States", "website" : "www.randomhousebooks.com" }}
Перейдите в вашу базу данных и подтвердите, что там появилась новая запись, id которой был автоматически сгенерирован MongoDB для нас, это должно выглядеть следующим образом:
{ "_id" : ObjectId("62ddc5e87071de3d88044140"), "id" : ObjectId("62ddc5e89c99ea1313ae2568"), "title" : "A Dance with Dragons", "authors" : [ "George R.R Martin", "Phyllis Eisenstein" ], "genre" : [ ], "publishdate" : "August 6,1998", "characters" : [ "Jon Snow", "Daenerys Targaryen", "Eddard Star", "Sansa Stark", "Jammie Lannister", "Rob Stark", "Cerser Lannister" ], "publisher" : { "name" : "Bantam Books", "country" : "United States", "website" : "www.randomhousebooks.com" }}
Проверим нашу конечную точку GetBook, мы предоставим идентификатор, который был возвращен, когда мы добавили нашу книгу с помощью конечной точки PostBook выше, т.е. в моем случае «62ddc5e89c99ea1313ae2568»:
mykmyk@skynet:~/go/src/github.com/myk4040okothogodo/MongoGorilla$ curl -X GET
> http://localhost:8000/api/books/62ddc5e89c99ea1313ae2568
> -H 'cache-control: no-cache'
> -H 'postman-token: 00282916-e7f8-5977-ea34-d8f89aeb43e2'
Это должно вернуться:
{"ID":"62ddc5e89c99ea1313ae2568","Title":"A Dance with Dragons","Authors":["George R.R Martin","Phyllis Eisenstein"],"Genre":[],"PublishDate":"August 6,1998","Characters":["Jon Snow","Daenerys Targaryen","Eddard Star","Sansa Stark","Jammie Lannister","Rob Stark","Cerser Lannister"],"publisher" : { "name" : "Bantam Books", "country" : "United States", "website" : "www.randomhousebooks.com" }}
Чтобы проверить конечную точку удаления:
curl -X DELETE http://localhost:8000/api/books/62ddc5e87071de3d88044140
должно вернуться:
Delete Successfully
Теперь, если мы проверим нашу базу данных с помощью команды find(), мы обнаружим, что конкретная книга «Танец с драконами» была удалена, т.е:
> db.books.find()
{ "_id" : 5, "title" : "A Song Of Ice and Fire", "authors" : [ "George R.R Martin", "Phyllis Eisenstein" ], "publishdate" : "August 1,1996", "characters" : [ "Jon Snow", "Daenerys Targaryen", "Eddard Star", "Sansa Stark", "Jammie Lannister", "Rob Stark", "Cerser Lannister" ], "publisher" : { "name" : "Bantam Books", "country" : "United States", "website" : "www.randomhousebooks.com" } }
{ "_id" : ObjectId("62dda3f1457193537fd4d245"), "title" : "A Feast Of Crows", "authors" : [ "George R.R Martin" ], "publishdate" : "August 1,1996", "characters" : [ "Jon Snow", "Daenerys Targaryen", "Eddard Star", "Sansa Stark", "Jammie Lannister", "Rob Stark", "Cerser Lannister" ], "publisher" : { "name" : "Bantam Books", "country" : "United States", "website" : "www.randomhousebooks.com" } }
Чтобы проверить конечную точку Put, которую мы будем использовать для изменения определенных значений данных о книге:
Я хочу изменить издательство книги «A Feast of Crows» с «Bantam Books» на «Voyager» и удалить одного из авторов «Phyllis Eisenstein».
В настоящее время книга выглядит следующим образом:
{ "_id" : 62dda3f1457193537fd4d245, "title" : "A Feast Of Crows", "authors" : [ "George R.R Martin", "Phyllis Eisenstein" ], "publishdate" : "August 1,1996", "characters" : [ "Jon Snow", "Daenerys Targaryen", "Eddard Star", "Sansa Stark", "Jammie Lannister", "Rob Stark", "Cerser Lannister" ], "publisher" : { "name" : "Bantam Books", "country" : "United States", "website" : "www.randomhousebooks.com" } }
Подскажите, как изменить данные, подскажите:
curl -X PUT http://localhost:8000/api/books/.................
Если вы застряли, напишите об этом в комментариях, и я обязательно помогу.
Заключение
В этой статье мы в основном рассмотрели MongoDB, как установить и добавить данные в нее с помощью интерактивной оболочки, затем мы поговорили о создании простого gorilla-mux api и его взаимодействии с нашей базой данных для хранения, удаления и изменения данных о книгах, отправленных с помощью методов HTTP-запроса PUT, POST, GET и DELETE.
До свидания, до скорой встречи.