canonical_id: "http_request"
display_name: "HTTP 請求"
category: "api"
version: "v1"
wasi_target: "preview1"
stability: "floating"
runtime_compat:
  - "cf-workers"
  - "workerd"
  - "wazero"
constraints:
  max_size_kb: 2048
  max_cold_start_ms: 50
  no_network_syscall: false
  no_filesystem_syscall: true
  io_model: "stdin_stdout_json"
input_schema:
  type: object
  required: [url]
  properties:
    url:
      type: string
      description: 目標 URL（必填）
    method:
      type: string
      description: HTTP 方法（GET / POST / PUT / DELETE 等），預設 GET
      default: GET
    headers:
      type: object
      description: 自訂 HTTP headers（key-value 物件）
      additionalProperties:
        type: string
    body:
      type: string
      description: 模式 A — body 字串（自行 stringify 後傳）
    body_json:
      type: object
      description: 模式 B — body 物件，零件內部 JSON.stringify（yaml 端不用手組字串）
output_schema:
  type: object
  properties:
    success:
      type: boolean
    data:
      type: object
      properties:
        body:
          type: string
          description: HTTP 回應 body（字串）
gherkin_tests:
  - scenario: "缺少 url"
    given: '{"method":"GET"}'
    then_contains: '{"success":false'
  - scenario: "基本 GET 請求"
    given: '{"url":"https://example.com"}'
    then_contains: '{"success":true'
tags: [integration, http, request, api]
description: "發送任意 HTTP 請求並回傳 status 與 body。透過 host function 呼叫，.wasm 本身不含網路 syscall。headers 由用戶手動填入。"
config_example: |
  http_call:                     # 節點名稱（可自訂）
    url: ""                      # 目標 URL（必填）
    method: "GET"                # HTTP 方法（選填，預設 GET）
    headers:                     # 自訂 headers（選填，用戶手動填入）
      Content-Type: "application/json"
      Authorization: "Bearer <your_token>"
    body: {}                     # 請求 body（選填）
