iT邦幫忙

0

有沒有不使用網址 傳遞 GET 請求 及參數的方法呢?

本魯在很久以前有使用PHP寫過一些網頁 所以大概知道 GET 跟 POST 的用法 但那是在大家還把 HTML JS 跟PHP 混在一起寫的年代.....

最近心血朝來又回來玩PHP但是發現現在好像很流行寫 API 所以決定開始來學習XD

目前學習到使用 file_get_contents 來獲取請求所附帶的資料

$data = file_get_contents("php://input");
            
if(!isset($data))
    return null;
$jsonData = json_decode($data , true);
foreach( $jsonData as $k =>$v)
{
    echo "$k / $v<br>";
}

但是 file_get_contents 拿不到從網址帶來的GET參數
(GET參數 使用 $_Get['參數']取得這個本魯了解 XD)

想問的是 是否有發送 GET請求 然後附帶的參數 用另外的方法讓 file_get_contents 可以取得呢?

如果說為什麼要這樣做 大概是因為想要讓取資料的方式 有一致性吧@@

另外 CODE怎麼讓他高亮= =?

看更多先前的討論...收起先前的討論...
weiclin iT邦高手 4 級 ‧ 2018-09-07 16:01:15 檢舉
請你去分清楚什麼東西該用 GET 什麼東西該用 POST(包含php://input), 你就不會再問這種問題了
weiclin iT邦高手 4 級 ‧ 2018-09-07 16:08:22 檢舉
而且真的要做, 直接 array_merge 不就好了
wingkawa iT邦新手 4 級 ‧ 2018-09-07 16:27:59 檢舉
https://markdown.tw/
補一下要highlight的話用markdown的語法
```
// some code
```
或單行用
`somecode`
weiclin 大 感謝你的回答 : ) 什麼東西該用 GET 什麼東西該用 POST 這部分我還真的不是很清楚 網路上搜尋也幾乎都是用法的教學 不知道大大能不能提供關鍵字?
另外 我看API 'GET' method的用途在於請求資源 但是如果只是要請求資源的話 那能不能用別的方式傳遞參數才問這個問題的QQ
最後 直接 array_merge 是什麼意思壓XD
wingkawa 大 感恩 已高亮 XD
weiclin iT邦高手 4 級 ‧ 2018-09-07 16:40:56 檢舉
這樣:
$allData = array_merge($jsonData, $_GET);
但是同樣名稱的資料被蓋掉別找我要
weiclin大 這樣GET的參數還是從網址來壓 XD
所以真的沒有不從網址傳遞GET請求的辦法嗎 QQ
weiclin iT邦高手 4 級 ‧ 2018-09-07 16:55:44 檢舉
你越問我越糊塗, 你現在是想知道怎麼把網址從 example.com/api.php?a=foo&b=bar
變成 example.com/api/foo/bar 這樣嗎
weiclin iT邦高手 4 級 ‧ 2018-09-07 16:58:16 檢舉
還是說你要用 GET method 又不想加上 query string?
那就在 body 裡面放資料啊, 但是你最好先看完這裡的討論
https://stackoverflow.com/questions/978061/http-get-with-request-body
weiclin 大 我想問是GET method 又不想加上 query string 的方法沒錯 但這看來不是個好主意 所以我還是乖乖地使用網址傳遞參數就好了
感謝你的解答
froce iT邦大師 5 級 ‧ 2018-09-07 17:39:13 檢舉
我倒蠻好奇你怎麼會有這個想法,用post不就結了?
froce 大 是因為要實作 RESTFUI API 啦 XD
POST 跟 GET 代表不同的請求 其他不是還有 PUT 跟 DELETE 什麼的....
不過因為剛開始學習 不是很懂 所以會有很多奇怪的想法 像是 用 API 來實踐 MVC框架之類的.....
weiclin iT邦高手 4 級 ‧ 2018-09-07 22:10:16 檢舉
不是說一定不行, 只是你要這樣弄最好有個好理由
weiclin大 就如同你說的其實也沒什麼理由一定要這樣處理 只是剛好靈光一閃的想法想試試看有沒有別的作法XD
但是既然都問了 那如果真的要在送出GET請求的時候順便在BODY塞資料的話 具體做法是什麼呢?
froce iT邦大師 5 級 ‧ 2018-09-08 12:13:54 檢舉
python有HTTP.client模組,其中的request方法,應該可以做到。
https://docs.python.org/3.0/library/http.client.html
requests裡也有一個request方法可以做低階的發送動作,應該也可以做。
http://docs.python-requests.org/en/master/api/

php應該也有類似模組的低階方法可以發送。

但是像curl之類的,應該是規規矩矩的只要有message body就會當成post送出。
froce大 感謝你的回答
我再自己研究看看 XD

2 個回答

4
weiclin
iT邦高手 4 級 ‧ 2018-09-08 18:05:04
最佳解答

三個檔案, 一個 api, 另外兩個用不同方法送 request

api.php

$input = file_get_contents('php://input');

echo "method: {$_SERVER['REQUEST_METHOD']}\n";
echo "content type: {$_SERVER['CONTENT_TYPE']}\n";
if (empty($input)) {
    echo "no data";
} else {
    $data = json_decode($input, true);
    echo "json value = ", $data['value'];
}

curl.php

$json = json_encode(['value' => 'from curl']);

$options = [
    CURLOPT_URL => "http://localhost/api.php",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POSTFIELDS => $json,
    CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
    CURLOPT_CUSTOMREQUEST => "GET"
];

$ch = curl_init();
curl_setopt_array($ch, $options);

$result = curl_exec($ch);
curl_close($ch);

echo $result, "\n";

stream.php

$client = stream_socket_client("tcp://localhost");

$json = json_encode(['value' => 'from stream_socket_client']);

$headers = [
    "GET /api.php HTTP/1.0",
    "Content-Type: application/json",
    "Content-Length:" . strlen($json)
];

$request = implode("\r\n", $headers) . "\r\n\r\n" . $json;
fwrite($client, $request);
$reply = stream_get_contents($client);
fclose($client);

$body = substr($reply, strpos($reply, "\r\n\r\n") + 4);
echo "result: {$body}\n";

weiclin大 非常感謝你的解答
看到好多沒用過的函式 小魯會好好研究的QQ

1

現在的入門者,學習程式的態度只求快速可使用,
始終沒有理解背後這樣操作的實質意涵,
那不叫寫程式,只是敷衍交代而已,
如果從態度上就犯了致命錯誤,學什麼都只做表面功夫,
無法真正的學習到一項技能

大大說的是 小魯受教了 Orz

我要發表回答

立即登入回答