network / convert

curl → Fetch API 変換

curlコマンドをFetch API・Axios・Python requestsのコードに変換します。-X/-H/-d/-uオプションに対応。入力はブラウザ内でのみ処理されます。

サンプル:
// 変換ボタンを押すと結果がここに表示されます

使い方

01
  1. 左側のテキストエリアにcurlコマンドをペーストしてください
  2. 出力形式(Fetch API・Axios・Python requests)をタブで選択します
  3. 「変換」ボタンを押すと右側にコードが生成されます
  4. 「コピー」ボタンで生成されたコードをクリップボードにコピーできます
  5. サンプルボタンから代表的なcurlコマンドをワンクリックで入力できます

実装コード

02

コアロジックはブラウザ標準APIのみで実装しています。外部ライブラリは不要で、そのままコピーしてご利用いただけます。parseCurl でcurl引数をトークン解析し、 toFetch で各形式に変換します。

function parseCurl(cmd: string): ParsedCurl {
  const tokens = tokenize(cmd.replace(/\\\n/g, ' ').trim())
  let i = 0
  if (tokens[i]?.toLowerCase() === 'curl') i++

  let url = '', method = ''
  const headers: Record<string, string> = {}
  let body: string | null = null

  while (i < tokens.length) {
    const tok = tokens[i]
    if (tok === '-X' || tok === '--request') {
      method = tokens[++i] ?? 'GET'; i++
    } else if (tok === '-H' || tok === '--header') {
      const h = tokens[++i] ?? ''; i++
      const idx = h.indexOf(':')
      if (idx > 0) headers[h.slice(0, idx).trim()] = h.slice(idx + 1).trim()
    } else if (tok === '-d' || tok === '--data' || tok === '--data-raw') {
      body = tokens[++i] ?? ''; i++
    } else if (!tok.startsWith('-')) {
      url = tok; i++
    } else { i++ }
  }
  if (!method) method = body ? 'POST' : 'GET'
  const ct = headers['Content-Type'] || ''
  return { url, method: method.toUpperCase(), headers, body, isJson: ct.includes('json') }
}

function toFetch(parsed: ParsedCurl): string {
  const { url, method, headers, body } = parsed
  const opts: string[] = []
  if (method !== 'GET') opts.push(`  method: '${method}'`)
  if (Object.keys(headers).length > 0) {
    const lines = Object.entries(headers).map(([k, v]) => `    '${k}': '${v}'`)
    opts.push(`  headers: {\n${lines.join(',\n')}\n  }`)
  }
  if (body !== null) opts.push(`  body: ${JSON.stringify(body)}`)
  if (opts.length === 0) return `const response = await fetch('${url}');\nconst data = await response.json();`
  return `const response = await fetch('${url}', {\n${opts.join(',\n')},\n});\nconst data = await response.json();`
}

よくある使用例・注意点

03
curlオプションの対応範囲
-X(メソッド指定)、-H(ヘッダー)、-d / --data / --data-raw / --data-binary(リクエストボディ)、--json(JSONボディ+ヘッダー自動付与)、-u(Basic認証)に対応しています。--compressed・-L・-sなどの転送制御オプションは無視されます。
認証情報の扱い
-u user:pass を指定すると Authorization: Basic ヘッダーに自動変換します。Bearer トークンは -H で直接指定してください。変換後のコードに認証情報がそのまま含まれるため、コードをコミットする際はトークンを環境変数に置き換えることを強くお勧めします。
複数行curlコマンド
バックスラッシュ(\\)で改行した複数行のcurlコマンドにも対応しています。ターミナルからそのままコピーして貼り付けることができます。ただし、シェルの変数展開($VAR)はそのままの文字列として扱われます。
変換の制限事項
--form(マルチパートフォーム)、--cert(クライアント証明書)、--proxy などの高度なオプションは現在未対応です。また、Content-Type が application/json の場合のみボディをJSONとして解釈します。フォームデータ(application/x-www-form-urlencoded)はそのまま文字列として出力されます。

関連ツール

04
URLパーサーHTTPステータスコード一覧URLエンコード

ソースコード

05

このツールのソースコード(テストコードを含む)はGitHubで公開しています。 MITライセンスで自由に利用・改変できます。

GitHub でコードを見る →