salut! ça fait longtemps. Je veux créer un "lot qui envoie simplement JSON au serveur d'application lorsqu'il est exécuté" [^ 1].
[^ 1]: Cet article est la suite de l'article suivant, mais si vous savez "Qu'est-ce que Linux ou shell?", Vous pouvez également le lire à partir de cet article
Quand j'ai demandé à mon senior comment l'implémenter, il a dit: "C'est vrai, curl choice", j'ai donc recherché la commande curl et créé un lot!
Je voudrais résumer les connaissances que j'ai acquises à l'époque.
Dans cet article, je présenterai les bases de curl dans l'ordre suivant.
La commande curl est ** diverse, comme présenté dans cet article. Une commande qui vous permet de ** transférer des données à l'aide d'un protocole.
Il prend en charge divers protocoles de communication tels que HTTPS, FTP, Telnet, SMTP, IMAP et POP3 ainsi que HTTP GET et POST.
Je pense qu'il est inclus dans les terminaux récents depuis le début et que la commande curl peut être utilisée immédiatement dans le terminal, mais si elle n'est pas incluse, L'installation est requise / 53bca48416030ed2c599).
macOS Catalina curl 7.64.1
$ curl --version
curl 7.64.1 (x86_64-apple-darwin19.0) libcurl/7.64.1 (SecureTransport) LibreSSL/2.8.3 zlib/1.2.11 nghttp2/1.39.2
Release-Date: 2019-03-27
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS GSS-API HTTP2 HTTPS-proxy IPv6 Kerberos Largefile libz MultiSSL NTLM NTLM_WB SPNEGO SSL UnixSockets
Juste en écoutant les informations de version, les protocoles pris en charge et les fonctionnalités de version sont également affichés, ce qui est gentil!
Cette fois, nous n'utiliserons que la communication HTTP entre les protocoles!
La forme de base de la commande curl est la suivante.
$ curl {URL}
Vous pouvez maintenant afficher le contenu de l'URL sur la console.
Essayons de curl Google.
$ curl https://www.google.com/
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ja"><head><meta content="世…
... Omis ...
…google.pmc=JSON.parse(pmc);})();</script></body></html>
Si vous obtenez Google avec curl, vous obtiendrez ce HTML terriblement long.
La réponse de Google est longue et je ne comprends pas! Il ne vient pas avec une épingle! Si tel est le cas, pourquoi ne pas consulter la page d'accueil de Hiroshi Abe?
$ curl http://abehiroshi.la.coocan.jp/
<html>
<head>
... Omis ...
<title>Page d'accueil de Hiroshi Abe</title>
</head>
... Omis ...
<body></body>
... Omis ...
</html>
Si vous obtenez un HTML simple et beau comme celui ci-dessus, vous êtes prêt à partir! (Même si le titre est déformé, la communication elle-même fonctionne bien, donc ça va! Veuillez appuyer et comparer le contenu!)
Si vous voyez un message comme celui ci-dessous, curl peut ne pas être inclus par défaut, veuillez donc essayer l'installation (https://qiita.com/fuwamaki/items/53bca48416030ed2c599).
zsh: command not found: curl
Maintenant, je vais écrire une commande curl, mais ne vous souciez-vous pas du type de réponse que vous obtenez lorsque vous communiquez réellement avec le serveur d'application?
Si vous voulez juste l'essayer rapidement, vous pouvez jeter un œil à Google et à d'autres sites célèbres.
"Qu'est-ce qui sera renvoyé lorsqu'une erreur se produit?" "Je ne fais que commencer, mais je veux vraiment POSTER ... [^ 2]"
Dans des moments comme celui-ci, vous ne devriez pas toujours compter sur M. Abe ...
[^ 2]: La différence entre GET et POST est facile à comprendre cet article Qiita!
Dans un tel cas, httpbin est recommandé!
Il s'agit d'un site Web qui renvoie diverses réponses lorsque vous effectuez une requête HTTP. Vous pouvez facilement vérifier si la requête est écrite correctement et si elle peut effectuer correctement la communication HTTP!
Vous pouvez également GET et POST respectivement en modifiant légèrement l'URL et vous pouvez définir arbitrairement le code de fin sur 400 ou 500. Non limité à curl, ce service Web est recommandé lorsque vous souhaitez tester uniquement le code qui communique avec HTTP / HTTPS.
Dans cet article également, j'utiliserai httpbin.
Eh bien, jusqu'à présent, j'ai joué avec des commandes curl simples, orthodoxes, belles et pures, mais en fait, vous pouvez définir des ** options ** derrière curl!
Cela permet d'effectuer divers paramètres détaillés, tels que l'utilisation correcte de GET et POST, la définition de l'en-tête, du corps et de la réponse en détail, et de ne pas afficher le message d'erreur.
Tout d'abord, essayons le changement de méthode de requête le plus simple.
Comme dans l'exemple de Google, si vous n'ajoutez aucune option, ce sera une méthode GET, mais si vous souhaitez spécifier une méthode de requête explicitement **, [-X {request method} “URL”](https: // Vous pouvez le modifier avec curl.haxx.se/docs/manpage.html#-X).
##########
#Méthode GET
# (curl http://httpbin.org/Même résultat que get)
##########
$ curl -X GET "http://httpbin.org/get"
{
"args": {},
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "curl/7.64.1",
"X-Amzn-Trace-Id": "Root=12345678901234567890"
},
"origin": "xxx.xxx.xxx.xxx",
"url": "http://httpbin.org/get"
}
Voici un exemple de la méthode POST [^ 3].
[^ 3]: Dans httpbin, l'origine etc. est mis dans la réponse pour que cela soit pratique pour le débogage etc., mais comme il y a des informations personnelles, elles sont cachées dans l'article!
##########
#Méthode POST
##########
$ curl -X POST "http://httpbin.org/post"
{
"args": {},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "curl/7.64.1",
"X-Amzn-Trace-Id": "Root=12345678901234567890"
},
"json": null,
"origin": "xxx.xxx.xxx.xxx",
"url": "http://httpbin.org/post"
}
Ajoutez ** l'en-tête HTTP ** en ajoutant -H "{paramètre}": "{valeur}" Je peux. (De là, je vais l'essayer avec la méthode POST!)
$ curl -X POST "http://httpbin.org/post" -H "accept: application/json"
{
"args": {},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "application/json",
"Host": "httpbin.org",
"User-Agent": "curl/7.64.1",
"X-Amzn-Trace-Id": "Root=12345678901234567890"
},
"json": null,
"origin": "xxx.xxx.xxx.xxx",
"url": "http://httpbin.org/post"
}
Qu'est-ce que tu penses?
Si vous le comparez soigneusement avec le précédent, vous pouvez voir que l'élément "Accepter" dans "en-têtes" a changé!
Dans l'exemple précédent avec seulement -X, c'était "Accept": "* / *", mais à ce moment -X -H, c'est "Accept": "application / json"!
Maintenant, envoyons le JSON avec la méthode POST!
En ajoutant "content-type: application / json" à l'en-tête HTTP et en ajoutant -d option à la méthode POST Vous pouvez ** demander des données au format JSON avec la méthode POST **.
$ curl -H "content-type: application/json" -X POST -d'{"asa_gohan":"misosiru", "oyatsu":"karl"}' http://httpbin.org/post
{
"args": {},
"data": "{\"asa_gohan\":\"misosiru\", \"oyatsu\":\"karl\"}",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Content-Length": "41",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "curl/7.64.1",
"X-Amzn-Trace-Id": "Root=12345678901234567890"
},
"json": {
"asa_gohan": "misosiru",
"oyatsu": "karl"
},
"origin": "xxx.xxx.xxx.xxx",
"url": "http://httpbin.org/post"
}
Parler de petit-déjeuner, c'est de la soupe miso, et parler de collations, c'est karl!
-v option est une option pour ** afficher les détails de communication HTTP **.
Puisque vous pouvez voir l'en-tête de la demande, l'en-tête de la réponse et le corps, il est pratique de l'ajouter lors du débogage.
$ curl -v -H "content-type: application/json" -X POST -d'{"asa_gohan":"misosiru", "oyatsu":"karl"}' http://httpbin.org/post
* Trying xxx.xxx.xxx.xxx...
* TCP_NODELAY set
* Connected to httpbin.org (xxx.xxx.xxx.xxx) port xx (xx)
> POST /post HTTP/1.1
> Host: httpbin.org
> User-Agent: curl/7.64.1
> Accept: */*
> content-type: application/json
> Content-Length: 41
>
* upload completely sent off: 41 out of 41 bytes
< HTTP/1.1 200 OK
< Date: Mon, 30 Mar 2020 xx:xx:xx GMT
< Content-Type: application/json
< Content-Length: 486
< Connection: keep-alive
< Server: xxxxxxxx/xxxxxxxx
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Credentials: true
<
{
"args": {},
"data": "{\"asa_gohan\":\"misosiru\", \"oyatsu\":\"karl\"}",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Content-Length": "41",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "curl/7.64.1",
"X-Amzn-Trace-Id": "Root=12345678901234567890"
},
"json": {
"asa_gohan": "misosiru",
"oyatsu": "karl"
},
"origin": "xxx.xxx.xxx.xxx",
"url": "http://httpbin.org/post"
}
* Connection #0 to host httpbin.org left intact
* Closing connection 0
Le 0 sur cette dernière ligne est le code de fin de la commande Linux.
La commande Linux renvoie 0 à la fin normale et un entier positif de 1 à 255 à la fin anormale, mais curl est une communication HTTP. Parfois, même si une erreur de série 400 ou une erreur de série 500 se produit, le code de fin sera 0.
C'est un type de commande qui vous donne l'impression que vous avez réussi. Je ne sais pas.
C'est une erreur de dissimulation man curl qui se termine normalement même si une erreur se produit, mais si vous ajoutez -f option, cela se terminera anormalement Il se termine par le code de fin 22! Yay!
Utilisez les codes d'état dans httpbin.
Première erreur sans l'option -f
##########
# 400
##########
$ curl -X POST "http://httpbin.org/status/400" -H "accept: text/plain"
#Rien ne sort ... Avez-vous réussi? Avez-vous échoué? (En fait, il échoue avec 400 erreurs)
# echo $?La commande peut afficher le code de fin de la dernière commande exécutée.
$ echo $?
0
Vous voyez ... je mens tout de suite ...
Cependant, si vous ajoutez -f, il lancera une erreur correctement!
##########
# 400
##########
$ curl -f -X POST "http://httpbin.org/status/400" -H "accept: text/plain"
curl: (22) The requested URL returned error: 400 BAD REQUEST
#Yay! Facile à comprendre!
# echo $?Vérifiez-le avec une commande.
$ echo $?
22
Yatter! !! !! !!
Qu'il s'agisse de 404 ou 500, le code d'erreur curl et le code d'erreur HTTP sont affichés, il est donc très facile à comprendre!
$ curl -f -X POST "http://httpbin.org/status/404" -H "accept: text/plain"
curl: (22) The requested URL returned error: 404 NOT FOUND
$ curl -f -X POST "http://httpbin.org/status/500" -H "accept: text/plain"
curl: (22) The requested URL returned error: 500 INTERNAL SERVER ERROR
Cependant, curl -f seul n'est pas fiable et les erreurs d'authentification telles que les erreurs 401 et 407 peuvent être ignorées [Description officielle du document](https://curl.haxx.se/docs/manpage. Il existe également html # -f).
Par conséquent, [Ajouter curl -sS et afficher le message d'erreur uniquement lorsqu'il y a une erreur](https://superuser.com/questions/590099/can-i-make-curl-fail-with-an-exitcode-different-than -0-if-the-http-status-code-i) Il semble y avoir un moyen aussi!
curl difficile ...! Je n'avais pas le concept de code de fin en particulier, donc j'ai été surpris par toutes les nouveautés!
Aussi, si vous avez des malentendus, je vous serais reconnaissant de bien vouloir me le faire savoir ...! > < Merci.
Au fait, le "lot qui envoie juste JSON au serveur de l'application lorsqu'il est exécuté" a été terminé avec succès, donc je pense que je vais prendre un verre à la boutique de ramen présentée dans l'article précédent!
Merci pour tous vos commentaires! Je vais manger 500 millions de tasses ~
Recommended Posts