Einen curl-Befehl in Code umwandeln

Fügen Sie einen beliebigen cURL-Befehl ein – auch einen, den Sie direkt aus dem Netzwerk-Tab Ihres Browsers mit "Copy as cURL" eingefügt haben – und Sie erhalten dieselbe Anfrage in neun Sprachen. Der Befehl wird direkt auf der Seite analysiert: Methode, URL, Header und Body werden ausgelesen und anschließend neu gerendert. Das Ergebnis ist also die von Ihnen eingefügte Anfrage und nicht eine Vorlage mit Ihrer URL.

Worked example

This command:

curl -X POST 'https://funapi.dev/api/friends/v1/characters' \
  -H 'Authorization: Bearer qa-admin-token' \
  -H 'Content-Type: application/json' \
  -d '{"name":"Gunther","job":"Head barista"}'

is parsed as POST https://funapi.dev/api/friends/v1/characters with 2 header(s) and a 39-byte body, and converts to:

JavaScript (fetch)

const res = await fetch("https://funapi.dev/api/friends/v1/characters", {
  method: "POST",
  headers: {
    "Authorization": "Bearer qa-admin-token",
    "Content-Type": "application/json"
  },
  body: "{\"name\":\"Gunther\",\"job\":\"Head barista\"}"
});
console.log(res.status, await res.json());

JavaScript (axios)

import axios from 'axios';

const res = await axios({
  method: "post",
  url: "https://funapi.dev/api/friends/v1/characters",
  headers: {
    "Authorization": "Bearer qa-admin-token",
    "Content-Type": "application/json"
  },
  data: {"name":"Gunther","job":"Head barista"}
});
console.log(res.status, res.data);

Python (requests)

import requests

url = "https://funapi.dev/api/friends/v1/characters"
headers = {
    "Authorization": "Bearer qa-admin-token",
    "Content-Type": "application/json"
}
payload = {"name":"Gunther","job":"Head barista"}

res = requests.post(url, headers=headers, json=payload)
print(res.status_code, res.json())

Go (net/http)

package main

import (
	"fmt"
	"io"
	"net/http"
	"strings"
)

func main() {
	req, _ := http.NewRequest("POST", "https://funapi.dev/api/friends/v1/characters", strings.NewReader("{\"name\":\"Gunther\",\"job\":\"Head barista\"}"))
	req.Header.Set("Authorization", "Bearer qa-admin-token")
	req.Header.Set("Content-Type", "application/json")
	res, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	out, _ := io.ReadAll(res.Body)
	fmt.Println(res.StatusCode, string(out))
}

C# (HttpClient)

using var client = new HttpClient();
var req = new HttpRequestMessage(HttpMethod.Post, "https://funapi.dev/api/friends/v1/characters");
req.Headers.TryAddWithoutValidation("Authorization", "Bearer qa-admin-token");
req.Content = new StringContent("{\"name\":\"Gunther\",\"job\":\"Head barista\"}", Encoding.UTF8, "application/json");
var res = await client.SendAsync(req);
Console.WriteLine((int)res.StatusCode);
Console.WriteLine(await res.Content.ReadAsStringAsync());

Java (RestAssured)

given()
    .header("Authorization", "Bearer qa-admin-token")
    .header("Content-Type", "application/json")
    .body("{\"name\":\"Gunther\",\"job\":\"Head barista\"}")
.when()
    .post("https://funapi.dev/api/friends/v1/characters")
.then()
    .statusCode(200);

Dramatiker

import { test, expect } from '@playwright/test';

test('POST request', async ({ request }) => {
  const res = await request.post("https://funapi.dev/api/friends/v1/characters", {
  headers: {
    "Authorization": "Bearer qa-admin-token",
    "Content-Type": "application/json"
  },
  data: {"name":"Gunther","job":"Head barista"}
});
  expect(res.status()).toBe(200);
});

k6

import http from 'k6/http';
import { check } from 'k6';

export default function () {
  const res = http.request("POST", "https://funapi.dev/api/friends/v1/characters", "{\"name\":\"Gunther\",\"job\":\"Head barista\"}", { headers: {
    "Authorization": "Bearer qa-admin-token",
    "Content-Type": "application/json"
  } });
  check(res, { 'status is 200': r => r.status === 200 });
}

HTTPie

echo "{\"name\":\"Gunther\",\"job\":\"Head barista\"}" | http POST "https://funapi.dev/api/friends/v1/characters" Authorization:"Bearer qa-admin-token" Content-Type:"application/json"

Was es handhabt

Backslash-Zeilenfortsetzungen und die Caret-Form, die cmd.exe verwendet, einfache und doppelte Anführungszeichen mit Escape-Sequenzen, wiederholte -H-Header, wiederholte -d-Bodies, die auf die Art und Weise verbunden werden, wie curl sie verbindet, -u-Basisauthentifizierung, die in einen Authorization-Header normalisiert wird, und die Vielzahl von Flags, die eine devtools-Kopie mitbringt (--compressed, -s, -L, --max-time und ähnliche), die erkannt und verworfen werden, anstatt mit der URL verwechselt zu werden.

Die beiden Dinge, die es explizit macht

curl verwendet standardmäßig POST, wenn ein Body, aber keine Methode angegeben wird, und setzt einen Content-Type, den Sie nie angegeben haben. Alle anderen Clients in der Liste verhalten sich anders. Daher werden beide im Output explizit angegeben – ein impliziter POST-Request und ein impliziter Content-Type –, da der häufigste Grund für das Scheitern einer konvertierten Anfrage darin besteht, dass die implizite Hälfte des curl-Befehls fehlte.

Wenn es sich weigert

Ein unbekanntes Flag, das einen Wert annehmen könnte, bricht die Konvertierung ab, anstatt übersprungen zu werden, da ein Überspringen die nachfolgende URL verschlucken und ein plausibles, aber falsches Ergebnis liefern würde. Ein nicht ausbalanciertes Zitat hat denselben Effekt. Ein Konverter, der eine Fehlermeldung deutlich anzeigt, ist besser als einer, der nur rät.

Weitere Werkzeuge

Alle Werkzeuge · Einstiegsanleitung · Alle 39 Mock-REST-APIs

Zuletzt aktualisiert