Если вы хотите быстро протестировать ваш REST API из командной строки, вы можете использовать curl . В этой статье я расскажу, как выполнять HTTP-запросы GET, POST, PUT, HEAD, DELETE для REST API. Для этого поста в блоге я буду использовать API REST, разработанный в моем посте Tutorial — разработка и реализация REST API на Java с использованием Jersey и Spring .
1. Введение
Если в первой части поста в блоге я сделаю краткое введение в curl и его возможности (HTTP-запросы с опциями), во второй части я « переведу» набор тестов SOAPui, разработанный для руководства по REST API, на curl Запросы.
1.1. Что такое локон?
Ну, curl — это инструмент командной строки и библиотека для передачи данных с синтаксисом URL, поддерживающий DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet и TFTP. curl поддерживает сертификаты SSL, HTTP POST, HTTP PUT, загрузку по FTP, загрузку на основе форм HTTP, прокси-серверы, HTTP / 2, куки-файлы, аутентификацию пользователя и пароля (Basic, Digest, NTLM, Negotiate, Kerberos…), возобновление передачи файлов, туннелирование прокси и многое другое. [1]
Как уже упоминалось, я буду использовать curl для имитации вызовов запросов HEAD, GET, POST, PUT и DELETE к REST API.
1.2. HEAD запросы
Если вы хотите проверить, является ли ресурс работоспособным, какие заголовки он предоставляет и другую полезную метаинформацию, записанную в заголовках ответа, без необходимости переносить весь контент, вы можете сделать запрос HEAD. Допустим, я хочу посмотреть, что я получу при запросе ресурса подкаста. Я бы выполнил следующий запрос HEAD с curl:
Запрос
curl -Я делает запрос HEAD
|
1
|
curl -I http://localhost:8888/demo-rest-jersey-spring/podcasts/1 |
ИЛИ ЖЕ
HEAD запрос к ресурсу
|
1
|
curl -i -X HEAD http://localhost:8888/demo-rest-jersey-spring/podcasts/1 |
Варианты скручивания
-
-i, --include— включить заголовки протокола в вывод (H / F) -
-X, --request— указать-X, --requestCOMMAND (GET, PUT, DELETE…) для использования
отклик
ГОЛОВНОЙ ответ
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 631 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0HTTP/1.1 200 OKDate: Tue, 25 Nov 2014 12:54:56 GMTServer: Jetty(9.0.7.v20131107)Access-Control-Allow-Headers: X-extra-headerAccess-Control-Allow-Headers: X-Requested-With, Content-Type, X-CodingpediaAllow: OPTIONSContent-Type: application/xmlAccess-Control-Allow-Origin: *Access-Control-Allow-Methods: GET, POST, DELETE, PUTVary: Accept-EncodingContent-Length: 631 |
Обратите внимание на следующие заголовки
-
Access-Control-Allow-Headers: Content-Type -
Access-Control-Allow-Methods: GET, POST, DELETE, PUT
и -
Access-Control-Allow-Origin: *
в ответ.
Они были добавлены для поддержки перекрестного совместного использования ресурсов (CORS) . Вы можете найти больше об этом в моем посте Как добавить поддержку CORS на стороне сервера в Java с Джерси .
Что я нахожу немного интригующим, так это заголовок ответа Content-Type: application/xml , потому что я ожидал, что это будет application/json , поскольку в методе ресурса, определенном с Джерси, это должно было иметь приоритет:
@ Типы носителей аннотаций
|
01
02
03
04
05
06
07
08
09
10
11
|
@GET@Path("{id}")@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })public Response getPodcastById(@PathParam("id") Long id, @QueryParam("detailed") boolean detailed) throws IOException, AppException { Podcast podcastById = podcastService.getPodcastById(id); return Response.status(200) .entity(podcastById, detailed ? new Annotation[]{PodcastDetailedView.Factory.get()} : new Annotation[0]) .header("Access-Control-Allow-Headers", "X-extra-header") .allow("OPTIONS").build();} |
1.3. ПОЛУЧИТЬ запрос
Выполнение curl без параметров для URL (ресурса) выполнит GET.
Запрос
Простой завиток на ресурсе
|
1
|
curl http://localhost:8888/demo-rest-jersey-spring/podcasts/1 |
отклик
|
1
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><podcast><id>1</id><title>- The Naked Scientists Podcast - Stripping Down Science</title><linkOnPodcastpedia>http://www.podcastpedia.org/podcasts/792/-The-Naked-Scientists-Podcast-Stripping-Down-Science</linkOnPodcastpedia><feed>feed_placeholder</feed><description>The Naked Scientists flagship science show brings you a lighthearted look at the latest scientific breakthroughs, interviews with the world top scientists, answers to your science questions and science experiments to try at home.</description><insertionDate>2014-10-29T10:46:02.00+0100</insertionDate></podcast> |
Обратите внимание, что, как и ожидалось, из запроса HEAD мы получаем документ XML. В любом случае, мы можем форсировать ответ JSON, добавив строку заголовка к нашему запросу curl, установив для заголовка Accept HTTP значение application/json :
запрос curl с пользовательским заголовком
|
1
|
curl --header "Accept:application/json" http://localhost:8888/demo-rest-jersey-spring/podcasts/1 |
Варианты скручивания
-
-H, --header— заголовок клиента для передачи на сервер
запрос curl с пользовательским заголовком
|
1
|
curl -H "Accept:application/json" http://localhost:8888/demo-rest-jersey-spring/podcasts/1 |
отклик
Ответ в формате JSON
|
1
|
{"id":1,"title":"- The Naked Scientists Podcast - Stripping Down Science","linkOnPodcastpedia":"http://www.podcastpedia.org/podcasts/792/-The-Naked-Scientists-Podcast-Stripping-Down-Science","feed":"feed_placeholder","description":"The Naked Scientists flagship science show brings you a lighthearted look at the latest scientific breakthroughs, interviews with the world top scientists, answers to your science questions and science experiments to try at home.","insertionDate":"2014-10-29T10:46:02.00+0100"} |
Если вы хотите, чтобы он отображался более красиво, вы можете использовать следующую команду, если на вашем компьютере установлен Python .
Запрос
Звоните ресурс с JSON довольно печати
|
1
|
curl -H "Accept:application/json" http://localhost:8888/demo-rest-jersey-spring/podcasts/1 | python -m json.tool |
отклик
Ответ JSON — довольно печатный
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed100 758 100 758 0 0 6954 0 --:--:-- --:--:-- --:--:-- 6954[ { "description": "The Naked Scientists flagship science show brings you a lighthearted look at the latest scientific breakthroughs, interviews with the world top scientists, answers to your science questions and science experiments to try at home.", "feed": "feed_placeholder", "id": 1, "insertionDate": "2014-10-29T10:46:02.00+0100", "linkOnPodcastpedia": "http://www.podcastpedia.org/podcasts/792/-The-Naked-Scientists-Podcast-Stripping-Down-Science", "title": "- The Naked Scientists Podcast - Stripping Down Science" }, { "description": "Quarks & Co: Das Wissenschaftsmagazin", "id": 2, "insertionDate": "2014-10-29T10:46:13.00+0100", "title": "Quarks & Co - zum Mitnehmen" }] |
1.4. Curl запрос с несколькими заголовками
Как вы узнали из моего последнего поста, Как сжимать ответы в Java REST API с помощью GZip и Jersey , все ответы, предоставляемые REST API, сжимаются с помощью GZip. Это происходит, только если клиент «предлагает», что он принимает такую кодировку, устанавливая следующий заголовок Accept-encoding:gzip .
Запрос
Установить несколько заголовков с помощью curl
|
1
|
curl -v -H "Accept:application/json" -H "Accept-encoding:gzip" http://localhost:8888/demo-rest-jersey-spring/podcasts/ |
Варианты скручивания
-
-v, --verbose— сделать операцию более разговорчивой
Для этого вам нужно просто добавить другую опцию -H с соответствующим значением. Конечно, в этом случае вы получите несколько нечитаемых символов в контенте, если вы не перенаправите ответ в файл:
Ответ с нечеткими персонажами
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
* Adding handle: conn: 0x28ddd80* Adding handle: send: 0* Adding handle: recv: 0* Curl_addHandleToPipeline: length: 1* - Conn 0 (0x28ddd80) send_pipe: 1, recv_pipe: 0 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* About to connect() to proxy vldn680 port 19001 (#0)* Trying 10.32.142.80...* Connected to vldn680 (10.32.142.80) port 19001 (#0)> GET http://localhost:8888/demo-rest-jersey-spring/podcasts/ HTTP/1.1> User-Agent: curl/7.30.0> Host: localhost:8888> Proxy-Connection: Keep-Alive> Accept:application/json> Accept-encoding:gzip>< HTTP/1.1 200 OK< Date: Tue, 25 Nov 2014 16:17:02 GMT* Server Jetty(9.0.7.v20131107) is not blacklisted< Server: Jetty(9.0.7.v20131107)< Content-Type: application/json< Access-Control-Allow-Origin: *< Access-Control-Allow-Methods: GET, POST, DELETE, PUT< Access-Control-Allow-Headers: X-Requested-With, Content-Type, X-Codingpedia< Vary: Accept-Encoding< Content-Encoding: gzip< Content-Length: 413< Via: 1.1 vldn680:8888<{ [data not shown]100 413 100 413 0 0 2647 0 --:--:-- --:--:-- --:--:-- 2647▒QKo▒0▒+▒▒g▒▒R▒+{▒V▒Pe▒▒؊c▒▒ n▒▒▒▒fæHH▒"▒▒g▒/?2▒eM▒gl▒a▒d▒{=`7▒Eϖ▒▒c▒ZMn8▒i▒▒▒}H▒▒i1▒3g▒▒▒▒▒ ;▒E▒0O▒n▒R*▒g/E▒▒n=▒▒▒▒)▒U▒▒▒lժ▒Φ▒h▒6▒▒▒_>w▒▒-▒▒:▒▒▒!▒Bb▒Z▒▒tO▒N@'= |▒▒C▒f▒▒loؠ▒,T▒▒A▒4▒▒:▒l+<▒▒▒▒P▒3▒▒A▒lR▒u▒a▒͓9hO #▒▒h▒i▒gq▒▒$▒▒|Ň ▒▒▒08>#▒0b!▒▒'▒G▒^▒Iﺬ.TU▒▒▒z▒\▒i^]e▒▒▒▒2▒▒▒֯▒▒?▒:/▒m▒▒▒▒▒Y▒h▒▒▒_䶙V▒+R▒WT▒0▒?f{▒▒▒▒&▒l▒▒Sk▒iԽ~▒▒▒▒▒▒n▒▒▒▒_V]į▒* Connection #0 to host vldn680 left intact |
2. Тестовый набор SOAPui переведен на запросы curl
Как уже упоминалось, во второй части я сопоставлю запросы скручивания с набором тестов SOAPui, представленным здесь .
2.1. Создать ресурс подкастов
2.1.1. Удалить все подкасты (этап подготовки)
Запрос
УДАЛИТЬ все подкасты
|
1
|
curl -i -X DELETE http://localhost:8888/demo-rest-jersey-spring/podcasts/ |
отклик
|
01
02
03
04
05
06
07
08
09
10
|
HTTP/1.1 204 No ContentDate: Tue, 25 Nov 2014 14:10:17 GMTServer: Jetty(9.0.7.v20131107)Content-Type: text/htmlAccess-Control-Allow-Origin: *Access-Control-Allow-Methods: GET, POST, DELETE, PUTAccess-Control-Allow-Headers: X-Requested-With, Content-Type, X-CodingpediaVary: Accept-EncodingVia: 1.1 vldn680:8888Content-Length: 0 |
2.1.2. POST новый подкаст без канала — 400 (BAD_REQUEST)
Запрос
|
1
|
curl -i -X POST -H "Content-Type:application/json" http://localhost:8888/demo-rest-jersey-spring/podcasts/ -d '{"title":"- The Naked Scientists Podcast - Stripping Down Science-new-title2","linkOnPodcastpedia":"http://www.podcastpedia.org/podcasts/792/-The-Naked-Scientists-Podcast-Stripping-Down-Science","description":"The Naked Scientists flagship science show brings you a lighthearted look at the latest scientific breakthroughs, interviews with the world top scientists, answers to your science questions and science experiments to try at home."}' |
отклик
Response 400 Bad Request
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
HTTP/1.1 400 Bad RequestDate: Tue, 25 Nov 2014 15:12:11 GMTServer: Jetty(9.0.7.v20131107)Content-Type: application/jsonAccess-Control-Allow-Origin: *Access-Control-Allow-Methods: GET, POST, DELETE, PUTAccess-Control-Allow-Headers: X-Requested-With, Content-Type, X-CodingpediaVary: Accept-EncodingContent-Length: 271Via: 1.1 vldn680:8888Connection: close{"status":400,"code":400,"message":"Provided data not sufficient for insertion","link":"http://www.codingpedia.org/ama/tutorial-rest-api-design-and-implementation-in-java-with-jersey-and-spring/","developerMessage":"Please verify that the feed is properly generated/set"} |
2.1.3. POST новый подкаст правильно — 201 (СОЗДАНО)
Запрос
POST новый подкаст правильно — 201 (СОЗДАНО)
|
1
|
curl -i -X POST -H "Content-Type:application/json" http://localhost:8888/demo-rest-jersey-spring/podcasts/ -d '{"title":"- The Naked Scientists Podcast - Stripping Down Science","linkOnPodcastpedia":"http://www.podcastpedia.org/podcasts/792/-The-Naked-Scientists-Podcast-Stripping-Down-Science","feed":"feed_placeholder","description":"The Naked Scientists flagship science show brings you a lighthearted look at the latest scientific breakthroughs, interviews with the world top scientists, answers to your science questions and science experiments to try at home."}' |
отклик
|
1
|
curl -i -X POST -H "Content-Type:application/json" http://localhost:8888/demo-rest-jersey-spring/podcasts/ -d '{"title":"- The Naked Scientists Podcast - Stripping Down Science-new-title2","linkOnPodcastpedia":"http://www.podcastpedia.org/podcasts/792/-The-Naked-Scientists-Podcast-Stripping-Down-Science","description":"The Naked Scientists flagship science show brings you a lighthearted look at the latest scientific breakthroughs, interviews with the world top scientists, answers to your science questions and science experiments to try at home."}' |
2.1.4. POST тот же подкаст, что и раньше, чтобы получить — 409 (КОНФЛИКТ)
Запрос
|
1
|
curl -i -X POST -H "Content-Type:application/json" http://localhost:8888/demo-rest-jersey-spring/podcasts/ -d '{"title":"- The Naked Scientists Podcast - Stripping Down Science","linkOnPodcastpedia":"http://www.podcastpedia.org/podcasts/792/-The-Naked-Scientists-Podcast-Stripping-Down-Science","feed":"feed_placeholder","description":"The Naked Scientists flagship science show brings you a lighthearted look at the latest scientific breakthroughs, interviews with the world top scientists, answers to your science questions and science experiments to try at home."}' |
отклик
|
01
02
03
04
05
06
07
08
09
10
11
|
HTTP/1.1 409 ConflictDate: Tue, 25 Nov 2014 15:58:39 GMTServer: Jetty(9.0.7.v20131107)Content-Type: application/jsonAccess-Control-Allow-Origin: *Access-Control-Allow-Methods: GET, POST, DELETE, PUTAccess-Control-Allow-Headers: X-Requested-With, Content-Type, X-CodingpediaVary: Accept-EncodingContent-Length: 300{"status":409,"code":409,"message":"Podcast with feed already existing in the database with the id 1","link":"http://www.codingpedia.org/ama/tutorial-rest-api-design-and-implementation-in-java-with-jersey-and-spring/","developerMessage":"Please verify that the feed and title are properly generated"} |
2.1.5. PUT новый подкаст на месте — 201 (СОЗДАНО)
Запрос
|
1
|
curl -i -X PUT -H "Content-Type:application/json" http://localhost:8888/demo-rest-jersey-spring/podcasts/2 -d '{"id":2,"title":"Quarks & Co - zum Mitnehmen","linkOnPodcastpedia":"http://www.podcastpedia.org/quarks","feed":"http://podcast.wdr.de/quarks.xml","description":"Quarks & Co: Das Wissenschaftsmagazin"}' |
отклик
|
01
02
03
04
05
06
07
08
09
10
11
|
HTTP/1.1 201 CreatedLocation: http://localhost:8888/demo-rest-jersey-spring/podcasts/2Content-Type: text/htmlAccess-Control-Allow-Origin: *Access-Control-Allow-Methods: GET, POST, DELETE, PUTAccess-Control-Allow-Headers: X-Requested-With, Content-Type, X-CodingpediaVary: Accept-EncodingContent-Length: 60Server: Jetty(9.0.7.v20131107)A new podcast has been created AT THE LOCATION you specified |
2.2. Читайте ресурс подкаста
2.2.1. ПОЛУЧИТЬ новый вставленный подкаст — 200 (ОК)
Запрос
|
1
|
curl -v -H "Accept:application/json" http://localhost:8888/demo-rest-jersey-spring/podcasts/1 | python -m json.tool |
отклик
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
< HTTP/1.1 200 OK< Access-Control-Allow-Headers: X-extra-header< Access-Control-Allow-Headers: X-Requested-With, Content-Type, X-Codingpedia< Allow: OPTIONS< Content-Type: application/json< Access-Control-Allow-Origin: *< Access-Control-Allow-Methods: GET, POST, DELETE, PUT< Vary: Accept-Encoding< Content-Length: 192* Server Jetty(9.0.7.v20131107) is not blacklisted< Server: Jetty(9.0.7.v20131107)<{ [data not shown]* STATE: PERFORM => DONE handle 0x600056180; line 1626 (connection #0)100 192 100 192 0 0 2766 0 --:--:-- --:--:-- --:--:-- 3254* Connection #0 to host localhost left intact* Expire cleared{ "id": 1, "insertionDate": "2014-06-05T22:35:34.00+0200", "title": "Quarks & Co - zum Mitnehmen"} |
2.2.2. GET подкасты отсортированы по дате добавления DESC — 200 (ОК)
Запрос
|
1
|
curl -v -H "Accept:application/json" http://localhost:8888/demo-rest-jersey-spring/podcasts?orderByInsertionDate=DESC | python -m json.tool |
отклик
Довольно отформатированный ответ
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
< HTTP/1.1 200 OK< Content-Type: application/json< Access-Control-Allow-Origin: *< Access-Control-Allow-Methods: GET, POST, DELETE, PUT< Access-Control-Allow-Headers: X-Requested-With, Content-Type, X-Codingpedia< Vary: Accept-Encoding< Content-Length: 419* Server Jetty(9.0.7.v20131107) is not blacklisted< Server: Jetty(9.0.7.v20131107)< 0 419 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0{ [data not shown]* STATE: PERFORM => DONE handle 0x600056180; line 1626 (connection #0)100 419 100 419 0 0 6044 0 --:--:-- --:--:-- --:--:-- 6983* Connection #0 to host localhost left intact* Expire cleared[ { "id": 1, "insertionDate": "2014-06-05T22:35:34.00+0200", "title": "Quarks & Co - zum Mitnehmen" }, { "id": 2, "insertionDate": "2014-06-05T22:35:34.00+0200", "title": "Day in Tech History" }] |
2,3. Обновить ресурс подкаста
2.3.1. PUT не «полный» подкаст для полного обновления — 400 (BAD_REQUEST)
Запрос
|
1
|
curl -v -H "Content-Type:application/json" -X PUT http://localhost:8888/demo-rest-jersey-spring/podcasts/2 -d '{"id":2, "title":"Quarks & Co - zum Mitnehmen","linkOnPodcastpedia":"http://www.podcastpedia.org/quarks","feed":"http://podcast.wdr.de/quarks.xml"}' |
отклик
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
< HTTP/1.1 400 Bad Request< Content-Type: application/json< Access-Control-Allow-Origin: *< Access-Control-Allow-Methods: GET, POST, DELETE, PUT< Access-Control-Allow-Headers: X-Requested-With, Content-Type, X-Codingpedia< Vary: Accept-Encoding< Content-Length: 290* Server Jetty(9.0.7.v20131107) is not blacklisted< Server: Jetty(9.0.7.v20131107)<* STATE: PERFORM => DONE handle 0x600056180; line 1626 (connection #0)* Connection #0 to host localhost left intact* Expire cleared{"status":400,"code":400,"message":"Please specify all properties for Full UPDATE","link":"http://www.codingpedia.org/ama/tutorial-rest-api-design-and-implementation-in-java-with-jersey-and-spring/","developerMessage":"required properties - id, title, feed, lnkOnPodcastpedia, description"} |
2.3.2. PUT подкаст для полного обновления — 200 (ОК)
Запрос
|
1
|
$ curl -v -H "Content-Type:application/json" -X PUT http://localhost:8888/demo-rest-jersey-spring/podcasts/2 -d '{"id":2, "title":"Quarks & Co - zum Mitnehmen","linkOnPodcastpedia":"http://www.podcastpedia.org/quarks","feed":"http://podcast.wdr.de/quarks.xml", "description":"Quarks & Co: Das Wissenschaftsmagazin"}' |
отклик
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
< HTTP/1.1 200 OK< Location: http://localhost:8888/demo-rest-jersey-spring/podcasts/2< Content-Type: text/html< Access-Control-Allow-Origin: *< Access-Control-Allow-Methods: GET, POST, DELETE, PUT< Access-Control-Allow-Headers: X-Requested-With, Content-Type, X-Codingpedia< Vary: Accept-Encoding< Content-Length: 86* Server Jetty(9.0.7.v20131107) is not blacklisted< Server: Jetty(9.0.7.v20131107)<* STATE: PERFORM => DONE handle 0x600056180; line 1626 (connection #0)* Connection #0 to host localhost left intact* Expire clearedThe podcast you specified has been fully updated created AT THE LOCATION you specified |
2.3.3. POST (частичное обновление) для несуществующего подкаста — 404 (NOT_FOUND)
Запрос
|
1
|
$ curl -v -H "Content-Type:application/json" -X POST http://localhost:8888/demo-rest-jersey-spring/podcasts/3 -d '{"title":"Quarks & Co - zum Mitnehmen - GREAT PODCAST"}' | python -m json.tool |
отклик
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
< HTTP/1.1 404 Not Found< Content-Type: application/json< Access-Control-Allow-Origin: *< Access-Control-Allow-Methods: GET, POST, DELETE, PUT< Access-Control-Allow-Headers: X-Requested-With, Content-Type, X-Codingpedia< Vary: Accept-Encoding< Content-Length: 306* Server Jetty(9.0.7.v20131107) is not blacklisted< Server: Jetty(9.0.7.v20131107)<{ [data not shown]* STATE: PERFORM => DONE handle 0x600056180; line 1626 (connection #0)100 361 100 306 100 55 9069 1630 --:--:-- --:--:-- --:--:-- 13304* Connection #0 to host localhost left intact* Expire cleared{ "code": 404, "developerMessage": "Please verify existence of data in the database for the id - 3", "message": "The resource you are trying to update does not exist in the database", "status": 404} |
2.3.4. POST (частичное обновление) подкаста — 200 (ОК)
Запрос
|
1
|
$ curl -v -H "Content-Type:application/json" -X POST http://localhost:8888/demo-rest-jersey-spring/podcasts/2 -d '{"title":"Quarks & Co - zum Mitnehmen - GREAT PODCAST"}' |
отклик
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
< HTTP/1.1 200 OK< Content-Type: text/html< Access-Control-Allow-Origin: *< Access-Control-Allow-Methods: GET, POST, DELETE, PUT< Access-Control-Allow-Headers: X-Requested-With, Content-Type, X-Codingpedia< Vary: Accept-Encoding< Content-Length: 55* Server Jetty(9.0.7.v20131107) is not blacklisted< Server: Jetty(9.0.7.v20131107)<* STATE: PERFORM => DONE handle 0x600056180; line 1626 (connection #0)* Connection #0 to host localhost left intact* Expire clearedThe podcast you specified has been successfully updated |
2,4. УДАЛИТЬ ресурс
2.4.1. УДАЛИТЬ второй вставленный подкаст — 204 (NO_CONTENT)
Запрос
|
1
|
$ curl -v -X DELETE http://localhost:8888/demo-rest-jersey-spring/podcasts/2 |
отклик
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
< HTTP/1.1 204 No Content< Content-Type: text/html< Access-Control-Allow-Origin: *< Access-Control-Allow-Methods: GET, POST, DELETE, PUT< Access-Control-Allow-Headers: X-Requested-With, Content-Type, X-Codingpedia< Vary: Accept-Encoding* Server Jetty(9.0.7.v20131107) is not blacklisted< Server: Jetty(9.0.7.v20131107)<* Excess found in a non pipelined read: excess = 42 url = /demo-rest-jersey-spring/podcasts/2 (zero-length body)* STATE: PERFORM => DONE handle 0x600056180; line 1626 (connection #0)* Connection #0 to host localhost left intact* Expire cleared |
2.4.2. ПОЛУЧИТЬ удаленный подкаст — 404 (NOT_FOUND)
Запрос
|
1
|
curl -v http://localhost:8888/demo-rest-jersey-spring/podcasts/2 | python -m json.tool |
отклик
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
< HTTP/1.1 404 Not Found< Content-Type: application/json< Access-Control-Allow-Origin: *< Access-Control-Allow-Methods: GET, POST, DELETE, PUT< Access-Control-Allow-Headers: X-Requested-With, Content-Type, X-Codingpedia< Vary: Accept-Encoding< Content-Length: 306* Server Jetty(9.0.7.v20131107) is not blacklisted< Server: Jetty(9.0.7.v20131107)<{ [data not shown]* STATE: PERFORM => DONE handle 0x600056180; line 1626 (connection #0)100 306 100 306 0 0 8916 0 --:--:-- --:--:-- --:--:-- 13304* Connection #0 to host localhost left intact* Expire cleared{ "code": 404, "developerMessage": "Verify the existence of the podcast with the id 2 in the database", "message": "The podcast you requested with id 2 was not found in the database", "status": 404} |
2.5. Бонусные операции
2.5.1. Добавить подкаст из формы заявки, urlencoded
Запрос
POST с urlencoded
|
1
|
curl -v --data-urlencode "title=Day in Tech History" --data-urlencode "linkOnPodcastpedia=http://www.podcastpedia.org/podcasts/766/Day-in-Tech-History" --data-urlencode "feed=http://www.dayintechhistory.com/feed/podcast" |
отклик
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
< HTTP/1.1 201 Created< Location: http://localhost:8888/demo-rest-jersey-spring/podcasts/null< Content-Type: text/html< Access-Control-Allow-Origin: *< Access-Control-Allow-Methods: GET, POST, DELETE, PUT< Access-Control-Allow-Headers: X-Requested-With, Content-Type, X-Codingpedia< Vary: Accept-Encoding< Content-Length: 81* Server Jetty(9.0.7.v20131107) is not blacklisted< Server: Jetty(9.0.7.v20131107)<* STATE: PERFORM => DONE handle 0x600056180; line 1626 (connection #0)* Connection #0 to host localhost left intact* Expire clearedA new podcast/resource has been created at /demo-rest-jersey-spring/podcasts/null |
Замечания:
Я все еще в начале использования curl, поэтому, если у вас есть какие-либо предложения, оставьте комментарий. Спасибо.
Ресурсы
| Ссылка: | Как протестировать REST API из командной строки с помощью curl от нашего партнера по JCG Адриана Матея в блоге Codingpedia.org . |