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
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?
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).
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!
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="世…
... 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 funktioniert'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
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!
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.
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.
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"
}
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"!
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!
-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.
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.
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!
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