簡體   English   中英

如何在PHP中使用curl GET發送原始數據?

[英]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_GETFIELDSCURLOPT_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM