0Pricing
Lua Academy · レッスン

HTTPリクエスト

Webリソースを取得します。

「HTTPリクエスト」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。

socket.http モジュール

LuaSocketには、socket.httpに高レベルのHTTPクライアントが含まれています。これは低レベルのTCPを基盤としながら、リクエストの形式、ヘッダー、チャンクのデコードを自動的に処理します。

このクライアントは、通常のTCP上でHTTP/1.1を使用します。HTTPSには、LuaSecに付属するssl.httpsモジュールが必要です。

local http = require("socket.http")
print(http.PORT)

単純なGET

最も簡単な形式では、URLを受け取り、本文、ステータスコード、レスポンスヘッダー、ステータス行を返します。

ステータスコード200は成功を意味します。本文がnilの場合は、HTTPエラーではなくトランスポートレベルの失敗を示します。

local http = require("socket.http")
local body, code, headers = http.request("http://example.com/")
print(code, #body)

ステータスの確認

本文を信頼する前に、必ず数値のcodeを確認してください。404でも本文(エラーページ)は返るため、TCPレベルでは呼び出しに成功しています。

4番目の戻り値は、"HTTP/1.1 200 OK"のようなステータス行の文字列で、ログ出力に役立ちます。

local body, code, headers, status = http.request(url)
if code == 200 then
  process(body)
else
  print("unexpected:", status)
end

ヘッダーの確認

返されるheadersテーブルのキーは小文字化されているため、サーバー側での大文字・小文字にかかわらず、headers["content-type"]で読み取れます。

一般的なフィールドには、content-length、content-type、リダイレクト先を示すlocationがあります。

local body, code, headers = http.request(url)
print(headers["content-type"])
print(headers["content-length"])

汎用的なリクエスト形式

http.requestにテーブルを渡すと、メソッド、カスタムヘッダー、リクエスト本文のソース、レスポンスのシンクを自由に指定できます。

この形式は本文ではなく1と、コード、ヘッダー、ステータスを返します。本文はシンクを使って自分で収集します。

local http = require("socket.http")
local ltn12 = require("ltn12")
local chunks = {}
http.request{
  url = "http://example.com/",
  sink = ltn12.sink.table(chunks)
}

POSTの送信

POSTでは、method = "POST"を設定し、本文を持つsourceを指定して、content-lengthを設定します。ltn12.source.stringヘルパーを使うと、Luaの文字列をソースとして扱えます。

ペイロードに合わせてcontent-typeを設定します。たとえば、JSONの場合はapplication/jsonを指定します。

local body = "{\"name\":\"Lua\"}"
http.request{
  url = url,
  method = "POST",
  source = ltn12.source.string(body),
  headers = {
    ["content-type"] = "application/json",
    ["content-length"] = tostring(#body)
  }
}

ltn12による本文の収集

LuaSocketは、ltn12フィルターを通してデータをストリーム処理します。シンクはチャンクを消費し、ltn12.sink.table(t)はチャンクをテーブルに追加します。その後、table.concatで結合します。

このストリーミングモデルでは、すべてを一度にバッファリングする代わりに、大きなダウンロードでもメモリ使用量を抑えられます。

local ltn12 = require("ltn12")
local t = {}
http.request{ url = url, sink = ltn12.sink.table(t) }
local full = table.concat(t)

カスタムリクエストヘッダー

headersテーブルを使って、認証情報、ユーザーエージェント、Cookieを追加できます。LuaSocketが想定する形式に合わせて、キーは小文字にしてください。

たとえば、ベアラートークンやカスタムのuser-agentを送信すると、サーバーがクライアントを正しく識別できます。

http.request{
  url = url,
  headers = {
    ["authorization"] = "Bearer " .. token,
    ["user-agent"] = "lua-client/1.0"
  }
}

リダイレクトへの追従

デフォルトでは、socket.httpはGETのリダイレクトに自動的に追従します。リクエストテーブルでredirect = falseを指定すると、この動作を無効にして3xxレスポンスを自分で確認できます。

追従を無効にした場合は、headers["location"]を読み取って次のURLを取得します。

local body, code, headers = http.request{
  url = url,
  redirect = false
}
if code == 301 then print("moved to", headers["location"]) end

タイムアウトとHTTPS

処理が停止したダウンロードで永遠にブロックされないように、http.TIMEOUT = 10でHTTP呼び出しのグローバルタイムアウトを設定します。

socket.httpは平文通信 בלבדなので、https://のURLにはLuaSecのrequire("ssl.https")を使用します。そのAPIはsocket.httpとほぼ同じです。

local http = require("socket.http")
http.TIMEOUT = 10
-- for TLS:
local https = require("ssl.https")
local body, code = https.request("https://example.com/")

エラー処理

2つの失敗レイヤーを区別してください。トランスポートの失敗では、nilと、"connection refused"や"timeout"のようなエラー文字列が返ります。

アプリケーションの失敗では、4xxまたは5xxのコードとともに本文が返ります。堅牢なコードでは、まずnilの場合を確認し、その後ステータスコードに応じて分岐します。

local body, code = http.request(url)
if not body then
  print("transport error:", code)
elseif code >= 400 then
  print("http error:", code)
end

クイックチェック

http.requestの単純なURL形式が返す値を思い出してください。

復習

socket.httpモジュールについて学びました。本文・ステータスコード・ヘッダーを返す単純なGETリクエスト、ltn12のシンクとソースを使う汎用的なテーブル形式、POST本文、カスタムヘッダー、リダイレクト、タイムアウトについて扱いました。

また、トランスポートエラー(nil)とHTTPステータスエラーを区別し、HTTPSにはLuaSecのssl.httpsが必要であることも確認しました。これで、低レベルのTCPからHTTPまでのネットワーキングの学習は完了です。

よくある質問

「HTTPリクエスト」レッスンは無料ですか?

はい。「HTTPリクエスト」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。

「HTTPリクエスト」で何を学びますか?

Webリソースを取得します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Lua Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「HTTPリクエスト」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLua Academyレッスンでコードを書いて実行できますか?

はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. TCPの基本
  2. クライアントを構築する
  3. サーバーを構築する
  4. HTTPリクエスト
← Lua Academyに戻る