[英]How to send raw data with curl GET in PHP?
我正在開發REST API,盡管很容易為cURL中的POST請求設置原始JSON數據
$payload = json_encode(array("user" => $data));
//attach encoded JSON string to the POST fields
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
我無法弄清楚如何使用GET請求發送此類數據。
是否有類似CURLOPT_GETFIELDS
或CURLOPT_RAWDATA
東西? 使用GET請求發送JSON的目的是傳遞一些參數。
我不希望將formdata添加到請求中,我希望發布JSON,以便可以在接收方上對其進行解析。
謝謝!
編輯:
基於評論,我想避免混淆,因此生成的請求應如下所示:
GET / HTTP/1.1
Host: 127.0.0.1:3000
Content-Type: application/json
Accept: application/json
Host: 127.0.0.1:3000
content-length: 13
Connection: keep-alive
cache-control: no-cache
{
"a": "b"
}
如您所見,此處的GET請求包含數據,並且已被Web服務器解析並完美運行。 如何使用cURL做到這一點?
GET請求沒有主體,這就是整個想法:您只是從服務器中獲取某些內容,而不是向其中發布內容。 從RFC 7231 :
GET請求消息中的有效負載沒有定義的語義。 在GET請求上發送有效內容正文可能會導致某些現有實現拒絕該請求。
換句話說,一個GET請求可以有數據,但沒有。 從規范的早期開始 ,其中GET被定義為一種安全方法:
如果請求方法的定義語義本質上是只讀的,則將其視為“安全”。 也就是說,由於將安全方法應用於目標資源,客戶端不會請求也不會期望原始服務器上的任何狀態更改。
...
在本規范定義的請求方法中,GET,HEAD,OPTIONS和TRACE方法被定義為安全的。
如果您確實希望在GET請求中包含JSON(並將其發送到合理實施的服務器資源),那么它唯一可以放在的地方就是URI中作為查詢字符串的一部分。 對於GET請求,我發現使用file_get_contents
比處理cURL容易得多。
<?php
$payload = json_encode(["user" => $data]);
$url_data = http_build_query([
"json" => $payload
]);
$url = "https://some.example/endpoint.php?" . $url_data;
$result = file_get_contents($url);
如果要將其發送到不合理實現的服務器資源,並且違反了HTTP RFC的精神,則可以執行以下操作:
<?php
$url = "https://some.example/endpoint.php";
$payload = json_encode(["user" => $data]);
$ctx = stream_context_create(["http" => [
"header"=>"Content-Type: application/json",
"content"=>$payload
]]);
$result = file_get_contents($url, false, $ctx);
如果確定要專門使用cURL進行此操作,則可以將CURLOPT_CUSTOMREQUEST
選項設置為“ GET”並將數據與CURLOPT_POSTDATA
設置為好運。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.