curl
जब मैं सर्वर को अनुरोध भेज रहा हूं तो मैं अनुरोध हेडर देखना चाहता हूं । मैं कैसे जांच कर सकता हूं?
curl
जब मैं सर्वर को अनुरोध भेज रहा हूं तो मैं अनुरोध हेडर देखना चाहता हूं । मैं कैसे जांच कर सकता हूं?
जवाबों:
मुझे लगता curl -v
है कि सबसे आसान है। यह अनुरोध हेडर ('>' के साथ उपसर्गों वाली पंक्तियों) को किसी फ़ाइल में लिखे बिना थूक देगा:
$ curl -v -I -H "Testing: Test header so you see this works" http://stackoverflow.com/
* About to connect() to stackoverflow.com port 80 (#0)
* Trying 69.59.196.211... connected
* Connected to stackoverflow.com (69.59.196.211) port 80 (#0)
> HEAD / HTTP/1.1
> User-Agent: curl/7.16.3 (i686-pc-cygwin) libcurl/7.16.3 OpenSSL/0.9.8h zlib/1.2.3 libssh2/0.15-CVS
> Host: stackoverflow.com
> Accept: */*
> Testing: Test header so you see this works
>
< HTTP/1.0 200 OK
...
curl -Ivs http://example.com > /dev/null
: -I
एक के लिए HEAD
अनुरोध, -v
भेजे गए शीर्ष लेख को दिखाने के लिए, -s
, छिपाने प्रगति बार के लिए > /dev/null
केवल -v उत्पादन को दिखाने के लिए, दोहराव से बचने।
-D -
साफ- सुथरा था, लेकिन मेरे लिए उपयोगी नहीं था क्योंकि यह केवल हेडर को दोहराता था जो -v
पहले से ही प्रदर्शित थे। यदि आप उन्हें स्वचालित मशीन की खपत के लिए उपसर्ग चाहते हैं, तो शायद यह उस मामले में बेहतर होगा, लेकिन मैं केवल यह देखना चाहता था कि क्या समस्या अधिक विस्तार से थी।
curl -v https://www.example.com
; दूसरा, यह CONNECT
अनुरोध को भी प्रिंट करता है यदि आप HTTP प्रॉक्सी के माध्यम से साइट पर जा रहे हैं , जैसे कि curl --proxy my-proxy:8080 http://www.example.com
। मेरा मानना है कि इस उत्तर में इन दोनों विशेषताओं के कुछ उदाहरणों का उल्लेख किया जाए तो यह और अधिक उपयोगकर्ताओं की मदद करेगा।
-I
आधुनिक दुनिया में उपयोग न करें , जब लोग हेडर देखने के बारे में पूछते हैं, तो वे शायद एपीआई के बारे में बात कर रहे हैं। और अगर आप इसका उपयोग करते हैं कि "मैं -I
अपनी अपाचे वेबसर्वर के साथ हेडर देखने के लिए उपयोग करता हूं" मानसिकता, तो आप एक HEAD
विधि के खिलाफ विकसित होने में बहुत समय बर्बाद करने जा रहे हैं जब आप शायद उपयोग करने का मतलब रखते हैं GET
। लोगों को इस्तेमाल करने के लिए कहना बंद करें -I
। अगर वे चाहते हैं HEAD
, तो -X HEAD
(
यह प्रश्न निर्दिष्ट नहीं करता है कि कमांड लाइन कमांड का नाम curl
मतलब है या संपूर्ण cURL लाइब्रेरी है।
CURL लाइब्रेरी का उपयोग करने वाला निम्न PHP कोड HTTP पद्धति (जैसे "GET", "POST", "विकल्प") के रूप में पहला पैरामीटर और URL के रूप में दूसरा पैरामीटर का उपयोग करता है।
<?php
$ch = curl_init();
$f = tmpfile(); # will be automatically removed after fclose()
curl_setopt_array($ch, array(
CURLOPT_CUSTOMREQUEST => $argv[1],
CURLOPT_URL => $argv[2],
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_FOLLOWLOCATION => 0,
CURLOPT_VERBOSE => 1,
CURLOPT_HEADER => 0,
CURLOPT_CONNECTTIMEOUT => 5,
CURLOPT_TIMEOUT => 30,
CURLOPT_STDERR => $f,
));
$response = curl_exec($ch);
fseek($f, 0);
echo fread($f, 32*1024); # output up to 32 KB cURL verbose log
fclose($f);
curl_close($ch);
echo $response;
उदाहरण उपयोग:
php curl-test.php OPTIONS https://google.com
ध्यान दें कि परिणाम लगभग कमांड लाइन के समान हैं
curl -v -s -o - -X OPTIONS https://google.com
CURLOPT_WRITEHEADER
और CURLOPT_FILE
खाली हैं।
php?
मेरे आउटगोइंग हेडर (php के साथ कर्ल) को देखने का एकमात्र तरीका निम्नलिखित विकल्पों का उपयोग कर रहा था:
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
अपना डिबग जानकारी प्राप्त करना:
$data = curl_exec($ch);
var_dump($data);
var_dump(curl_getinfo($ch));
var_dump $data
प्रतिक्रिया शीर्षकों के साथ-साथ प्रतिक्रिया निकाय भी लौटाएगा। Var_dump curl_getinfo($ch)
आपको अनुरोध शीर्षलेख देगा।
CURLOPT_HEADER
प्रतिक्रिया शीर्षलेख है - CURLINFO_HEADER_OUT
अनुरोध शीर्षलेख है। यह वही है जो ओपी के लिए पूछ रहा है :)
कर्ल--trace-ascii
करने का विकल्प अनुरोध हेडर, साथ ही प्रतिक्रिया हेडर और प्रतिक्रिया बॉडी दिखाएगा।
उदाहरण के लिए, कमांड
curl --trace-ascii curl.trace http://www.google.com/
एक फ़ाइल बनाता है curl.trace
जो इस प्रकार है:
== Info: About to connect() to www.google.com port 80 (#0)
== Info: Trying 209.85.229.104... == Info: connected
== Info: Connected to www.google.com (209.85.229.104) port 80 (#0)
=> Send header, 145 bytes (0x91)
0000: GET / HTTP/1.1
0010: User-Agent: curl/7.16.3 (powerpc-apple-darwin9.0) libcurl/7.16.3
0050: OpenSSL/0.9.7l zlib/1.2.3
006c: Host: www.google.com
0082: Accept: */*
008f:
इसे एक प्रतिक्रिया भी मिली (302 प्रतिक्रिया, सटीक लेकिन अप्रासंगिक होने के लिए) जिसे लॉग किया गया था।
यदि आप केवल प्रतिक्रिया शीर्षलेख सहेजना चाहते हैं, तो --dump-header
विकल्प का उपयोग करें :
curl -D file url
curl --dump-header file url
यदि आपको उपलब्ध विकल्पों के बारे में अधिक जानकारी की आवश्यकता है, तो इसका उपयोग करें curl --help | less
(यह आउटपुट के कुछ सौ लाइनों का उत्पादन करता है लेकिन बहुत सारे विकल्पों का उल्लेख करता है)। या मैनुअल पेज ढूंढें जहां विकल्पों का क्या अर्थ है, इसकी अधिक व्याख्या है।
curl --trace-ascii {फ़ाइल नाम} या फ़ाइल नाम के बजाय एक एकल डैश का उपयोग करके इसे stdout पर भेजा जाए:
curl --trace-ascii - {URL}
यदि आप libcurl का उपयोग कर रहे हैं तो CURLOPT_DEBUGFUNCTION
यह आपको दिखाता है कि सब कुछ कर्ल भेजता है और प्राप्त करता है, जिसमें कुछ अतिरिक्त जानकारी डाली जाती है।
मैंने यहां जवाबों की कोशिश की और पाया कि सबसे उपयोगी और आसान एक उत्तर के रूप में अभी तक सूचीबद्ध नहीं है, लेकिन यह है:
curl -v https://example.com/path
यह REQUEST हेडर के साथ-साथ RESPONSE हेडर और अन्य उपयोगी जैसे कि SSL सर्टिफिकेट को प्रिंट करता है और क्या मौजूदा टीसीपी कनेक्शन का पुन: उपयोग किया गया है। -v
झंडा पुनः निर्देश का पालन करने के लिए और HTTP प्रमाणीकरण के लिए शीघ्र ही निश्चित रूप से अन्य झंडे,, साथ जोड़ा जा सकता:
curl -vL --user my_username https://example.com/path
उम्मीद है की यह मदद करेगा।
नीचे दिए गए एक कमांड की तरह तीन खंड दिखाई देंगे: अनुरोध हेडर, प्रतिक्रिया हेडर और डेटा (CRLF द्वारा अलग)। यह तकनीकी जानकारी और कर्ल द्वारा जोड़े गए वाक्यात्मक शोर से बचा जाता है।
curl -vs www.stackoverflow.com 2>&1 | sed '/^* /d; /bytes data]$/d; s/> //; s/< //'
कमांड निम्न आउटपुट का उत्पादन करेगी:
GET / HTTP/1.1
Host: www.stackoverflow.com
User-Agent: curl/7.54.0
Accept: */*
HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=UTF-8
Location: https://stackoverflow.com/
Content-Length: 149
Accept-Ranges: bytes
Date: Wed, 16 Jan 2019 20:28:56 GMT
Via: 1.1 varnish
Connection: keep-alive
X-Served-By: cache-bma1622-BMA
X-Cache: MISS
X-Cache-Hits: 0
X-Timer: S1547670537.588756,VS0,VE105
Vary: Fastly-SSL
X-DNS-Prefetch-Control: off
Set-Cookie: prov=e4b211f7-ae13-dad3-9720-167742a5dff8; domain=.stackoverflow.com; expires=Fri, 01-Jan-2055 00:00:00 GMT; path=/; HttpOnly
<head><title>Document Moved</title></head>
<body><h1>Object Moved</h1>This document may be found <a HREF="https://stackoverflow.com/">here</a></body>
विवरण:
-vs
- हेडर (-v) जोड़ें, लेकिन प्रगति बार (-s) को हटा दें2>&1
- स्टैडआउट और स्टेडर को सिंगल स्टडआउट में मिलाएंsed
- नीचे दिए गए आदेशों का उपयोग करके कर्ल द्वारा निर्मित प्रतिक्रिया को संपादित करें/^* /d
- '*' (तकनीकी जानकारी) से शुरू होने वाली लाइनें हटाएं/bytes data]$/d
- 'बाइट्स डेटा]' (तकनीकी जानकारी) के साथ समाप्त होने वाली लाइनें हटाएंs/> //
- '>' उपसर्ग निकालेंs/< //
- '<' उपसर्ग निकालेंमुझे पता है कि यह थोड़ा देर से है, लेकिन ऐसा करने के लिए मेरा पसंदीदा तरीका है netcat
, जैसा कि आप वास्तव में curl
भेजते हैं; यह उन विकल्पों --trace
या --trace-ascii
विकल्पों से भिन्न हो सकता है जो गैर-ASCII वर्णों को ठीक से नहीं दिखाएंगे (वे केवल डॉट्स के रूप में प्रदर्शित होते हैं या डिकोड किए जाने की आवश्यकता होती है)।
आप दो टर्मिनल विंडो खोलकर इसे बहुत आसानी से कर सकते हैं, पहले प्रकार में:
nc -l localhost 12345
यह आपके स्थानीय मशीन के पोर्ट 12345 पर एक सुनने की प्रक्रिया को खोलता है।
दूसरे टर्मिनल विंडो में अपना कर्ल कमांड दर्ज करें, उदाहरण के लिए:
curl --form 'foo=bar' localhost:12345
पहले टर्मिनल विंडो में आपको वही दिखाई देगा जो अनुरोध में भेजा गया है।
अब निश्चित रूप nc
से प्रतिक्रिया में कुछ भी नहीं भेजेंगे (जब तक कि आप इसे अपने आप में टाइप न करें), इसलिए आपको कर्ल कमांड (नियंत्रण-सी) को बाधित करने और प्रत्येक परीक्षण के लिए प्रक्रिया को दोहराने की आवश्यकता होगी।
हालाँकि, यह आपके अनुरोध को डीबग करने के लिए एक उपयोगी विकल्प है, क्योंकि आप कहीं भी एक गोल-यात्रा को शामिल नहीं कर रहे हैं, या कहीं फर्जी, पुनरावृत्ति अनुरोधों का उत्पादन नहीं कर रहे हैं जब तक कि आप इसे सही नहीं पाते; एक बार जब आप कमांड से खुश हो जाते हैं, तो बस इसे एक वैध URL पर पुनर्निर्देशित करें और आप जाने के लिए अच्छे हैं।
आप किसी भी cURL लाइब्रेरी के लिए भी ऐसा कर सकते हैं, बस स्थानीय nc
श्रोता को इंगित करने के लिए अपने अनुरोध को तब तक संपादित करें जब तक आप इससे खुश न हों।
कर्ल -s -v -o / dev / null -H "Testheader: परीक्षण" http://www.example.com
-I
यदि आप एक HEAD अनुरोध भेजना चाहते हैं और एक GET अनुरोध नहीं तो आप विकल्प का उपयोग भी कर सकते हैं।
यहाँ कुकीज़ के साथ पोस्ट प्रश्न बनाने के लिए php में मेरा http क्लाइंट है:
function http_login_client($url, $params = "", $cookies_send = "" ){
// Vars
$cookies = array();
$headers = getallheaders();
// Perform a http post request to $ur1 using $params
$ch = curl_init($url);
$options = array( CURLOPT_POST => 1,
CURLINFO_HEADER_OUT => true,
CURLOPT_POSTFIELDS => $params,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_HEADER => 1,
CURLOPT_COOKIE => $cookies_send,
CURLOPT_USERAGENT => $headers['User-Agent']
);
curl_setopt_array($ch, $options);
$response = curl_exec($ch);
/// डेबग जानकारी प्रतिध्वनि $ प्रतिक्रिया; var_dump (curl_getinfo ($ ch)); ///
// Parse response and read cookies
preg_match_all('/^Set-Cookie: (.*?)=(.*?);/m', $response, $matches);
// Build an array with cookies
foreach( $matches[1] as $index => $cookie )
$cookies[$cookie] = $matches[2][$index];
return $cookies;
} // end http_login_client
आप इसका उपयोग करके देख सकते हैं -iv
$> curl -ivH "apikey:ad9ff3d36888957" --form "file=@/home/mar/workspace/images/8.jpg" --form "language=eng" --form "isOverlayRequired=true" https://api.ocr.space/Parse/Image
Https://http-tools.appspot.com/reflect-http-request/some-unique-id पर एक नमूना अनुरोध करें और देखें कि इस अनुरोध में क्या है (अनुरोध हैडर, अनुरोध निकाय, अनुरोध पैरामीटर) इसके संबंधित खोज यूआरएल https: // : //http-tools.appspot.com/reflect-http-request-finder/some-unique-id । आप इसके बजाय किसी भी स्ट्रिंग का उपयोग कर सकते हैं some-unique-id
, अधिक जानकारी के लिए https://http-tools.appspot.com देखें।