メインコンテンツまでスキップ

GET リクエストを送信する (http.get)

宣言

HTTP ステータスコード, レスポンスヘッダーの JSON テキスト, レスポンスボディ = http.get(URL [, タイムアウト秒数, リクエストヘッダー, URL を ESCAPE しない ])

宣言(名前付き引数)

20250625 から対応。進捗パラメータは 20260402 以降のバージョンで対応

HTTP ステータスコード, レスポンスヘッダーの JSON テキスト, レスポンスボディ = http.get{
url = URL;
timeout = タイムアウト秒数;
headers = リクエストヘッダー;
params = Query パラメータ;
download_file = リクエスト成功時のレスポンスボディ保存先ファイルパス;
progress = 進捗コールバック関数;
progress_interval_ms = 進捗コールバック間隔(ミリ秒);
}

パラメータ

  • URL
    文字列型。リクエスト先の URL。このメソッドはデフォルトで URL にパーセント escape 処理を行う。不要な場合は URL を ESCAPE しない パラメータの説明を参照
  • タイムアウト秒数
    数値型の省略可能なパラメータ。リクエストのタイムアウト時間を秒単位で指定する。デフォルトは 10
  • リクエストヘッダー
    テーブル型の省略可能なパラメータ。送信するリクエストのヘッダー情報を {field1 = value1, field2 = value2, ...} の形式で指定する。デフォルトは {}
  • Query パラメータ
    テーブル型の省略可能なパラメータ。送信するリクエストの Query パラメータを {field1 = value1, field2 = value2, ...} の形式で指定する。デフォルトは {}
  • リクエスト成功時のレスポンスボディ保存先ファイルパス
    文字列型の省略可能なパラメータ。このパラメータを指定した場合、リクエスト成功後のレスポンスボディは保存先のファイルパスになる
  • 進捗コールバック関数
    関数型の省略可能なパラメータ。20260402 以降のバージョンで対応。リクエストの進捗が変化したときに呼び出され、コールバック関数の最初の引数に現在の進捗情報が渡される
  • 進捗コールバック間隔(ミリ秒)
    整数型の省略可能なパラメータ。20260402 以降のバージョンで対応。進捗コールバックを呼び出す間隔をミリ秒単位で指定する
  • URL を ESCAPE しない
    ブール型の省略可能なパラメータ。true を指定すると URL を escape せずに直接リクエストする。デフォルトは false
    URL に独自の escape 処理を行う場合は、lcurl モジュールeasy:escapeeasy:unescape を参照

戻り値

  • HTTP ステータスコード
    整数型。今回のリクエストの http ステータスコードを返し、タイムアウトした場合は -1 を返す
  • レスポンスヘッダーの JSON テキスト
    文字列型または nil。リクエスト完了時に JSON 形式のヘッダー情報を返し、タイムアウトした場合は nil を返す
  • レスポンスボディ
    文字列型または nil。リクエスト完了時に取得した内容を返す。レスポンスボディをファイルに保存した場合、この値はファイルパスになる。タイムアウトした場合は nil を返す

説明

HTTP/1.1 プロトコルの GET メソッドを使用してネットワークリソースを取得する
この関数はリソースをディスクに保存しない。容量の大きいネットワークリソースをダウンロードする場合は、http.download の使用を推奨
この関数は処理を譲ることがある。関数が戻る前に、ほかのスレッドに実行の機会が与えられる場合がある
サーバーのプロトコルバージョンが HTTP/1.0 または HTTP/0.9 の場合は、代わりに httpGet メソッドを使用できる

レスポンスボディ = httpGet(URL, タイムアウト秒数)

進捗コールバック関数が受け取る info の構造は次のとおり:

{
count_of_bytes_sent = 送信済みバイト数;
count_of_bytes_expected_to_send = 送信予定バイト数;
count_of_bytes_received = 受信済みバイト数;
count_of_bytes_expected_to_receive = 受信予定バイト数;
}

local code, res_headers, body = http.get("https://httpbin.org/get?hello=world&你好=世界", 15, {
["User-Agent"] = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)"; -- IE8 のリクエストをエミュレート
["Cookie"] = "a=1; b=2; c=3"; -- Cookie も送信
})
if code == 200 then -- 返されたステータスコードが HTTP_OK の場合
sys.alert(body)
end

注記:上記のコードでは、この章で扱っていない関数 sys.alert を使用している

例(名前付き引数)

local code, res_headers, body = http.get{
url = "https://httpbin.org/get";
timeout = 15;
headers = {
["User-Agent"] = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)"; -- IE8 のリクエストをエミュレート
["Cookie"] = "a=1; b=2; c=3"; -- Cookie も送信
};
params = {
["hello"] = "world";
["你好"] = "世界";
};
}
if code == 200 then -- 返されたステータスコードが HTTP_OK の場合
sys.alert(body)
end

注記:上記のコードでは、この章で扱っていない関数 sys.alert を使用している

http.get をラップしてグローバル IP を取得する例

function get_ip()
local done = false
thread.dispatch(function()
while (true) do
if (done) then
sys.toast("", -1)
return
else
sys.toast("正在获取 IP 地址...", device.front_orien())
end
sys.msleep(2000)
end
end)
while (true) do
local c, h, b = http.get("https://ip.chinaz.com/?ts="..tostring(sys.rnd()), 60)
if (c==200) then
sys.toast("", -1)
done = true
return b:match('您的本机IP地址:(%d%d?%d?%.%d%d?%d?%.%d%d?%d?%.%d%d?%d?)')
end
end
end
--
-- 上記のコードを自身のスクリプトの先頭にコピーしてから、スクリプト内で使用する
sys.alert(get_ip())

注記:上記のコードでは、この章で扱っていない関数 sys.alertsys.toastsys.msleepsys.rndthread.dispatchdevice.front_orien を使用している