[LINUX] Un article qui essaie juste une petite requête HTTP avec la commande curl

introduction

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[Pour la phobie de l'écran noir] Je veux en savoir plus sur Linux et les shells, alors je l'ai illustré de manière approximative

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.

Qu'est-ce que la commande curl?

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).

Environnement et version dans cet article

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!

Utilisation basique de curl

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="&#19990;…
... 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

Je veux l'essayer rapidement pour voir comment cela fonctionne! (Tu peux l'essayer!)

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é!

スクリーンショット 2020-03-30 21.46.55.png

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.

Vous pouvez faire beaucoup de choses en ajoutant des options après curl!

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.

[Changement de méthode] curl -X {méthode de requête} "URL"

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"
}

[Changer l'en-tête] curl -H "{paramètre}": "{valeur}"

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"!

[Changement de contenu] curl -X POST -d ‘{“ parameter ”}: {“ value ”}”

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!

[Sortie de communication détaillée] curl -v

-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.

[Changer le code de fin] curl -f

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.

スクリーンショット 2020-03-30 23.25.22.png

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!

en conclusion

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

Un article qui essaie juste une petite requête HTTP avec la commande curl
Article qui vous aidera à comprendre un peu l'algorithme de collision de sphères rigides
Vérifiez la réponse du code d'état HTTP avec la commande curl (#Linux #Shell)
Accordez un jeton d'accès avec la commande curl et POST l'API
Utilisez la commande pip dans un environnement proxy HTTP qui nécessite une authentification
Une application Web qui ne fait que Hello World avec le package net / http de Go
Un modèle qui identifie la guitare avec fast.ai
Un script qui ne reçoit qu'un flux RSS
Une histoire qui a eu du mal avec l'ensemble commun HTTP_PROXY = ~
Un mémo que j'ai touché au magasin de données avec python
Un exemple de mécanisme qui renvoie une prédiction par HTTP à partir du résultat de l'apprentissage automatique
Comparez HTTP GET / POST avec cURL (commande) et Python (programmation)
Obtenez UNIXTIME au début d'aujourd'hui avec une commande
Créez un exemple de scène semblable à un jeu avec juste le script Blender 2.80
Un script shell qui envoie simplement le résultat de l'exécution SQL
Un programme qui appuie et relâche simplement la touche Échap
[Golang] Un programme qui détermine le tour avec des nombres aléatoires
Créez une application qui recherche uniquement à l'aide de l'API de recherche personnalisée Google avec Python 3.3.1 dans Bottle