[LINUX] Ein Artikel, der nur eine kleine HTTP-Anfrage mit dem Befehl curl versucht

Einführung

Hallo! Lange nicht gesehen. Ich möchte einen "Stapel erstellen, der JSON nur an den App-Server sendet, wenn er ausgeführt wird" [^ 1].

[^ 1]: Dieser Artikel ist eine Fortsetzung des folgenden Artikels, aber wenn Sie "Was ist Linux oder Shell?" Wissen, können Sie ihn auch aus diesem Artikel lesen[Für Black-Screen-Phobie] Ich möchte etwas über Linux und Shells wissen, deshalb habe ich sie lose illustriert

Als ich meinen Senior fragte, wie er es implementieren soll, sagte er: "Das ist richtig, Curl-Wahl", also habe ich den Curl-Befehl nachgeschlagen und einen Stapel erstellt!

Ich möchte das Wissen, das ich damals gewonnen habe, zusammenfassen.

In diesem Artikel werde ich die Grundlagen des Lockens in der folgenden Reihenfolge vorstellen.

--Was ist der Curl-Befehl?

Was ist der Curl-Befehl?

Der curl-Befehl ist ** verschieden, wie in diesem Artikel eingeführt. Ein Befehl, mit dem Sie ** Daten mithilfe eines Protokolls übertragen können.

Es unterstützt verschiedene Kommunikationsprotokolle wie HTTPS, FTP, Telnet, SMTP, IMAP und POP3 sowie HTTP GET und POST.

Ich denke, dass es von Anfang an in den letzten Terminals enthalten ist und der Befehl curl sofort im Terminal verwendet werden kann, aber wenn es nicht enthalten ist, Installation erforderlich / 53bca48416030ed2c599).

Umgebung und Version in diesem Artikel

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

Wenn Sie sich nur die Versionsinformationen anhören, werden auch die unterstützten Protokolle und Versionsfunktionen angezeigt.

Dieses Mal verwenden wir nur die HTTP-Kommunikation zwischen den Protokollen!

Grundlegende Verwendung von Curl

Die Grundform des Befehls curl lautet wie folgt.

$ curl {URL}

Jetzt können Sie den Inhalt der URL auf der Konsole anzeigen.

Lassen Sie uns versuchen, Google zu locken.

$ curl https://www.google.com/

<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ja"><head><meta content="&#19990;…
... weggelassen ...
…google.pmc=JSON.parse(pmc);})();</script></body></html>

Wenn Sie Google mit Curl erhalten, erhalten Sie dieses schrecklich lange HTML.

Die Antwort von Google ist lang und ich verstehe nicht! Es kommt nicht mit einer Stecknadel! Wenn ja, warum nicht auf die Homepage von Hiroshi Abe verweisen?

$ curl http://abehiroshi.la.coocan.jp/

<html>
<head>
... weggelassen ...
<title>Hiroshi Abes Homepage</title>
</head>
... weggelassen ...
  <body></body>
... weggelassen ...
</html>

Wenn Sie einen einfachen und schönen HTML-Code wie den oben genannten erhalten, können Sie loslegen! (Auch wenn der Titel verstümmelt ist, ist es in Ordnung, weil die Kommunikation selbst gut funktioniertHiroshi Abe's Homepage F12 / Option + Befehl + I. Bitte drücken Sie und vergleichen Sie den Inhalt!)

Wenn eine Meldung wie die folgende angezeigt wird, ist Curl möglicherweise nicht standardmäßig enthalten. Versuchen Sie daher, sie zu installieren (https://qiita.com/fuwamaki/items/53bca48416030ed2c599).

zsh: command not found: curl

Ich möchte es schnell ausprobieren, um zu sehen, wie es funktioniert! (Du kannst es versuchen!)

Jetzt werde ich einen Curl-Befehl schreiben, aber ist es Ihnen egal, welche Art von Antwort Sie erhalten, wenn Sie tatsächlich mit dem App-Server kommunizieren?

Wenn Sie es nur kurz ausprobieren möchten, können Sie sich Google und andere berühmte Websites ansehen.

"Was wird zurückgegeben, wenn ein Fehler auftritt?" "Ich bekomme gerade, aber ich möchte wirklich POST ... [^ 2]"

In Zeiten wie diesen sollten Sie sich nicht für immer auf Mr. Abe verlassen ...

[^ 2]: Der Unterschied zwischen GET und POST ist leicht zu verstehen dieser Qiita-Artikel!

In einem solchen Fall wird httpbin empfohlen!

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

Dies ist eine Website, die verschiedene Antworten zurückgibt, wenn Sie eine HTTP-Anfrage stellen. Sie können leicht überprüfen, ob die Anforderung korrekt geschrieben ist und ob die HTTP-Kommunikation ordnungsgemäß ausgeführt werden kann!

Sie können auch GET bzw. POST durchführen, indem Sie die URL ein wenig ändern, und Sie können den Endcode willkürlich auf 400 oder 500 setzen. Dieser Webdienst ist nicht auf Curl beschränkt, sondern wird empfohlen, wenn Sie nur den Code ausprobieren möchten, der mit HTTP / HTTPS kommuniziert.

Auch in diesem Artikel werde ich httpbin verwenden.

Sie können viele Dinge tun, indem Sie nach dem Einrollen Optionen hinzufügen!

Nun, bis jetzt habe ich mit einfachen, orthodoxen, schönen und reinen Curl-Befehlen gespielt, aber tatsächlich können Sie ** Optionen ** hinter Curl setzen!

Auf diese Weise können verschiedene detaillierte Einstellungen vorgenommen werden, z. B. die ordnungsgemäße Verwendung von GET und POST, die detaillierte Einstellung von Header, Body und Antwort sowie die Nichtanzeige der Fehlermeldung.

[Methodenänderung] curl -X {Anforderungsmethode} "URL"

Versuchen wir zunächst die einfachste Änderung der Anforderungsmethode.

Wenn Sie wie im Beispiel von Google keine Optionen hinzufügen, handelt es sich um eine GET-Methode. Wenn Sie jedoch eine Anforderungsmethode explizit angeben möchten **, [-X {Anforderungsmethode} "URL"](https: // Sie können es mit curl.haxx.se/docs/manpage.html#-X) ändern.

##########
#GET-Methode
# (curl http://httpbin.org/Gleiches Ergebnis wie 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"
}

Hier ist ein Beispiel für die POST-Methode [^ 3].

[^ 3]: In httpbin wird der Ursprung usw. in der Antwort angegeben, damit das Debuggen usw. bequem ist. Da jedoch persönliche Informationen vorhanden sind, werden diese im Artikel ausgeblendet!

##########
#POST-Methode
##########

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

[Header ändern] curl -H “{parameter}”: “{value}”

Fügen Sie ** HTTP-Header ** hinzu, indem Sie [-H “{parameter}”: “{value}”] hinzufügen (https://curl.haxx.se/docs/manpage.html#-H) Ich kann. (Von hier aus werde ich es mit der POST-Methode versuchen!)

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

Was denken Sie?

Wenn Sie es sorgfältig mit dem vorherigen vergleichen, können Sie sehen, dass sich das Element "Akzeptieren" in "Überschriften" geändert hat!

Im vorherigen Beispiel mit nur -X war es "Accept": "* / *", aber in dieser Zeit -X -H ist es "Accept": "application / json"!

[Inhaltsänderung] curl -X POST -d ‘{“ Parameter ”}: {“ Wert ”}’

Senden wir nun den JSON mit der POST-Methode!

Durch Hinzufügen von "content-type: application / json" zum HTTP-Header und Hinzufügen der Option -d zur POST-Methode Sie können ** Daten im JSON-Format mit der POST-Methode anfordern **.

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

Apropos Frühstück ist Miso-Suppe und Apropos Snacks ist Karl!

[Detaillierte Kommunikationsausgabe] curl -v

-v Option ist eine Option zur ** Ausgabe von HTTP-Kommunikationsdetails **.

Da Sie den Anforderungsheader, den Antwortheader und den Text sehen können, ist es praktisch, ihn beim Debuggen hinzuzufügen.

$ 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

Die 0 in dieser letzten Zeile ist der Endcode für den Linux-Befehl.

Der Linux-Befehl gibt bei normaler Beendigung 0 und eine positive Ganzzahl von 1 bis 255 bei abnormaler Beendigung zurück, aber Curl ist HTTP-Kommunikation. Selbst wenn manchmal ein Fehler der Serie 400 oder ein Fehler der Serie 500 auftritt, ist der Endcode manchmal 0.

Dies ist eine Art Befehl, mit dem Sie aussehen, als wären Sie erfolgreich. Ich weiß es nicht.

[Endcode ändern] curl -f

Es ist eine Fehlerverdeckung, die normal endet, selbst wenn ein Fehler auftritt. Wenn Sie jedoch -f Option hinzufügen, wird sie abnormal beendet Es endet mit dem Endcode 22! Yay!

Verwenden Sie die Statuscodes in httpbin.

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

Erster Fehler ohne Option -f

##########
# 400
##########
$ curl -X POST "http://httpbin.org/status/400" -H "accept: text/plain"

#Es kommt nichts heraus ... Hast du Erfolg gehabt? Hast du versagt? (Eigentlich scheitert es mit 400 Fehlern)
# echo $?Der Befehl kann den Endcode des zuletzt ausgeführten Befehls anzeigen.

$ echo $?
0

Du siehst ... ich liege sofort ...

Wenn Sie jedoch -f hinzufügen, wird ein Fehler ordnungsgemäß ausgegeben!

##########
# 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! Einfach zu verstehen!
# echo $?Überprüfen Sie es mit einem Befehl.

$ echo $?
22

Yatter! !! !! !!

Unabhängig davon, ob es sich um 404 oder 500 handelt, werden der Curl-Fehlercode und der HTTP-Fehlercode angezeigt, sodass es sehr einfach zu verstehen ist!

$ 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

Curl -f allein ist jedoch nicht ausfallsicher, und Authentifizierungsfehler wie 401- und 407-Fehler können ignoriert werden Beschreibung des offiziellen Dokuments. Es gibt auch HTML # -f).

Daher [Curl -sS hinzufügen und Fehlermeldung nur anzeigen, wenn ein Fehler vorliegt](https://superuser.com/questions/590099/can-i-make-curl-fail-with-an-exitcode-different-than -0-if-the-http-status-code-i) Es scheint auch einen Weg zu geben!

abschließend

Locken schwer ...! Ich hatte nicht das Konzept eines Endcodes, also war ich von all den neuen Dingen überrascht!

Auch wenn Sie irgendwelche Missverständnisse haben, würde ich es begrüßen, wenn Sie mich wissen lassen könnten ...! > < Danke.

Übrigens wurde der "Stapel, der JSON bei seiner Ausführung nur an den App-Server sendet" erfolgreich abgeschlossen. Ich denke, ich werde im Ramen-Shop etwas trinken, der im vorherigen Artikel vorgestellt wurde!

Vielen Dank für alle Ihre Kommentare! Ich werde 500 Millionen Tassen essen ~

Recommended Posts

Ein Artikel, der nur eine kleine HTTP-Anfrage mit dem Befehl curl versucht
Artikel, der Ihnen hilft, den Kollisionsalgorithmus für starre Kugeln ein wenig zu verstehen
Überprüfen Sie die Antwort des HTTP-Statuscodes mit dem Befehl curl (#Linux #Shell).
Gewähren Sie mit dem Befehl curl ein Zugriffstoken und POSTEN Sie die API
Verwenden Sie den Befehl pip in einer HTTP-Proxy-Umgebung, für die eine Authentifizierung erforderlich ist
Eine Web-App, die Hello World nur mit dem net / http-Paket von Go ausführt
Ein Modell, das die Gitarre mit fast.ai identifiziert
Ein Skript, das nur einen RSS-Feed erhält
Die Geschichte, eine harte Zeit mit der gemeinsamen Menge HTTP_PROXY = ~ zu haben
Ein Memo, dass ich den Datenspeicher mit Python berührt habe
Ein Beispiel für einen Mechanismus, der eine Vorhersage von HTTP aus dem Ergebnis des maschinellen Lernens zurückgibt
Vergleichen Sie HTTP GET / POST mit cURL (Befehl) und Python (Programmierung).
Holen Sie sich UNIXTIME zu Beginn des heutigen Tages mit einem Befehl
Erstellen Sie mit dem Blender 2.80-Skript eine beispielhafte spielähnliche Phase
Ein Shell-Skript, das nur das Ergebnis der SQL-Ausführung per E-Mail sendet
Ein Programm, das nur die Esc-Taste drückt und loslässt
[Golang] Ein Programm, das die Runde mit Zufallszahlen bestimmt
Erstellen Sie eine Anwendung, die nur mit der Google Custom Search-API mit Python 3.3.1 in Bottle sucht