it-swarm.com.de

Soll ich POST data URL-codieren?

Ich poste Daten an eine externe API (ggf. mit PHP).

Soll ich die übergebenen POST Variablen per URL codieren?

Oder muss ich nur GET-Daten per URL verschlüsseln?

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);
117
Richard

Allgemeine Antwort

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

Der Wert "application/x-www-form-urlencoded" bedeutet, dass Ihr POST -Text wie eine GET-Parameterzeichenfolge URL-codiert sein muss. Ein Wert von "multipart/form-data" bedeutet, dass Sie Inhaltsbegrenzer verwenden und NICHT die URL, die den Inhalt codiert.

Diese Antwort enthält eine viel ausführlichere Erklärung wenn Sie weitere Informationen wünschen.


Spezifische Antwort

Für eine spezifische Antwort auf die von Ihnen verwendeten PHP Bibliotheken (CURL) sollten Sie lesen Sie die Dokumentation hier .

Hier sind die relevanten Informationen:

CURLOPT_POST

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

CURLOPT_POSTFIELDS

Die vollständigen Daten, die in einer HTTP-Operation "POST" veröffentlicht werden sollen. Wenn Sie eine Datei veröffentlichen möchten, müssen Sie dem Dateinamen ein @ voranstellen und den vollständigen Pfad verwenden. Der Dateityp kann explizit angegeben werden, indem dem Dateinamen der Typ im Format '; type = mimetype' folgt. 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.

129
DougW

@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-kodieren Sie die POST Daten mit einem Inhaltstyp-Header: application/x-www-form-urlencoded.

Hinweis: Sie müssen die Felder $ _POST [] nicht einzeln urlenkodieren. Die Funktion http_build_query () kann die Urlenkodierung problemlos durchfü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 -Texte.

9
skyfree

Die obigen Beiträge beantworten Fragen zur URL-Codierung und zur Funktionsweise. Die ursprünglichen Fragen lauteten jedoch "Sollte ich URL-codieren POST data?)" Und wurden nicht beantwortet.

Aufgrund meiner jüngsten Erfahrungen mit der URL-Codierung möchte ich die Frage weiter ausdehnen. "Sollte ich POST Daten per URL codieren, wie bei der GET HTTP - Methode. Im Allgemeinen werden HTML - Formulare über den Browser übertragen, wenn sie ausgefüllt sind und/oder Informationen abrufen, der Browser führt die URL - Codierung durch, aber wenn Eine Anwendung macht einen Webdienst verfügbar und erwartet, dass Verbraucher URL-Codierungen für Daten durchführen. Ist es architektonisch und technisch korrekt, URL-Codierungen mit der POST HTTP-Methode durchzuführen? "

2
Varun

curl verschlüsselt die Daten für Sie. Geben Sie einfach Ihre Rohdaten in das Fields-Array ein und teilen Sie ihm mit, dass er loslegen soll.

2
user340140