Soll ich POST-Daten per URL codieren?

122

Ich poste Daten an eine externe API (mit PHP, falls relevant).

Sollte ich die von mir übergebenen POST-Variablen per URL codieren?

Oder muss ich nur GET-Daten per URL codieren?

Vielen Dank!

UPDATE: Dies ist mein PHP, falls es relevant ist:

$fields = array(
    'mediaupload'=>$file_field,
    'username'=>urlencode($_POST["username"]),
    'password'=>urlencode($_POST["password"]),
    'latitude'=>urlencode($_POST["latitude"]),
    'longitude'=>urlencode($_POST["longitude"]),
    'datetime'=>urlencode($_POST["datetime"]),
    'category'=>urlencode($_POST["category"]),
    'metacategory'=>urlencode($_POST["metacategory"]),
    'caption'=>($_POST["description"])
);
$fields_string = http_build_query($fields);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
Richard
quelle
1
Dies ist die API als Referenz: cyclestreets.net/api - sie scheint nicht anzugeben, was sie erwartet.
Richard

Antworten:

136

Allgemeine Antwort

Die allgemeine Antwort auf Ihre Frage ist, dass es darauf ankommt. Und Sie können entscheiden, indem Sie angeben, was Ihr "Inhaltstyp" in den HTTP-Headern ist.

Der Wert "application / x-www-form-urlencoded" bedeutet, dass Ihr POST-Body wie eine GET-Parameterzeichenfolge URL-codiert sein muss. Der Wert "Multipart / Formulardaten" bedeutet, dass Sie Inhaltsbegrenzer verwenden und den Inhalt NICHT per URL codieren.

Diese Antwort enthält eine viel gründlichere Erklärung, wenn Sie weitere Informationen wünschen.


Spezifische Antwort

Eine Antwort speziell für die von Ihnen verwendeten PHP-Bibliotheken (CURL) finden Sie in der Dokumentation hier .

Hier sind die relevanten Informationen:

CURLOPT_POST

TRUE, um einen regulären HTTP-POST durchzuführen. Dieser POST ist die normale Anwendung / x-www-form-urlencoded, die am häufigsten von HTML-Formularen verwendet wird.

CURLOPT_POSTFIELDS

Die vollständigen Daten, die in einem HTTP-POST-Vorgang veröffentlicht werden sollen. Um eine Datei zu veröffentlichen, stellen Sie einen Dateinamen mit @ voran und verwenden Sie den vollständigen Pfad. Der Dateityp kann explizit angegeben werden, indem dem Dateinamen der Typ im Format '; type = mimetype' gefolgt wird. Dieser Parameter kann entweder als urlencodierter String wie 'para1 = val1 & para2 = val2 & ...' oder als Array mit dem Feldnamen als Schlüssel und den Felddaten als Wert übergeben werden. Wenn value ein Array ist, wird der Content-Type-Header auf multipart / form-data gesetzt. Ab PHP 5.2.0 muss value ein Array sein, wenn Dateien mit dem Präfix @ an diese Option übergeben werden.

DougW
quelle
9

@DougW hat diese Frage klar beantwortet, aber ich möchte hier noch einige Codes hinzufügen, um Dougs Punkte zu erklären. (Und korrigieren Sie Fehler im obigen Code)

Lösung 1: URL-Codierung der POST-Daten mit einem Header vom Inhaltstyp: application / x-www-form-urlencoded.

Hinweis: Sie müssen die $ _POST [] -Felder nicht einzeln urlencodieren. Die Funktion http_build_query () kann den Urlencodierungsjob problemlos ausführen.

$fields = array(
    'mediaupload'=>$file_field,
    'username'=>$_POST["username"],
    'password'=>$_POST["password"],
    'latitude'=>$_POST["latitude"],
    'longitude'=>$_POST["longitude"],
    'datetime'=>$_POST["datetime"],
    'category'=>$_POST["category"],
    'metacategory'=>$_POST["metacategory"],
    'caption'=>$_POST["description"]
);

$fields_string = http_build_query($fields);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$fields_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);

Lösung 2: Übergeben Sie das Array direkt als Post-Daten ohne URL-Codierung, während der Content-Type-Header auf Multipart / Formulardaten gesetzt wird.

$fields = array(
        'mediaupload'=>$file_field,
        'username'=>$_POST["username"],
        'password'=>$_POST["password"],
        'latitude'=>$_POST["latitude"],
        'longitude'=>$_POST["longitude"],
        'datetime'=>$_POST["datetime"],
        'category'=>$_POST["category"],
        'metacategory'=>$_POST["metacategory"],
        'caption'=>$_POST["description"]
    );

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url);
    curl_setopt($ch, CURLOPT_POST,1);
    curl_setopt($ch, CURLOPT_POSTFIELDS,$fields);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $response = curl_exec($ch);

Beide Codefragmente funktionieren, verwenden jedoch unterschiedliche HTTP-Header und -Körper.

himmelfrei
quelle
2

curl codiert die Daten für Sie. Legen Sie einfach Ihre Rohfelddaten in das Feldarray ab und weisen Sie es an, "los" zu gehen.

user340140
quelle
1
Ich habe Stunden damit verbracht, ein PHP-Curl-Skript zu reparieren, bei dem die Ziel-ASP-Webseite mich nach dem Senden von Curl-Post-Daten auf eine Fehlerseite umleitet, und konnte nicht herausfinden, warum. Dann, nachdem die Post-Daten per URL verschlüsselt wurden, funktionierte es und ich bekam mein erwartetes Ergebnis.
Robi
1
Wenn es sich um ein Array handelt, wird es automatisch durch Curl urlencodiert. Wenn es als Zeichenfolge übergeben wird, müssen wir zuerst den Urlencode eingeben.
Robi
2

Die obigen Beiträge beantworten Fragen zur URL-Codierung und deren Funktionsweise. Die ursprünglichen Fragen lauteten jedoch "Soll ich POST-Daten per URL codieren?". was nicht beantwortet wird.

Aufgrund meiner jüngsten Erfahrungen mit der URL-Codierung möchte ich die Frage weiter ausbauen. "Sollte ich POST-Daten wie die GET-HTTP-Methode per URL codieren. Wenn HTML-Formulare über den Browser ausgefüllt, übermittelt und / oder einige Informationen abgerufen werden, führt der Browser eine URL-Codierung durch, aber wenn eine Anwendung einen Webdienst verfügbar macht und dies erwartet." Ist es architektonisch und technisch korrekt, eine URL-Codierung mit der POST-HTTP-Methode durchzuführen, wenn Verbraucher eine URL-Codierung für Daten durchführen? "

Varun
quelle