Czy powinienem zakodować dane POST w adresie URL?

122

Wysyłam dane do zewnętrznego API (używając PHP, jeśli jest to istotne).

Czy powinienem zakodować w adresie URL zmienne POST, które przekazuję?

A może muszę tylko zakodować dane GET w adresie URL?

Dzięki!

AKTUALIZACJA: To jest mój PHP, na wypadek gdyby miał znaczenie:

$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
źródło
1
Oto API dla odniesienia: cyclestreets.net/api - nie wydaje się określać, czego oczekuje.
Richard,

Odpowiedzi:

137

Ogólna odpowiedź

Ogólna odpowiedź na twoje pytanie jest taka, że ​​to zależy. Możesz zdecydować, określając swój „Content-Type” w nagłówkach HTTP.

Wartość „application / x-www-form-urlencoded” oznacza, że ​​treść POST będzie musiała być zakodowana w adresie URL, tak jak ciąg parametru GET. Wartość „multipart / form-data” oznacza, że ​​będziesz używać ograniczników treści, a NIE adresów URL do kodowania treści.

Ta odpowiedź ma znacznie dokładniejsze wyjaśnienie, jeśli chcesz uzyskać więcej informacji.


Konkretna odpowiedź

Aby uzyskać odpowiedź dotyczącą bibliotek PHP, których używasz (CURL), przeczytaj dokumentację tutaj .

Oto istotne informacje:

CURLOPT_POST

TRUE, aby wykonać zwykły HTTP POST. Ten POST jest zwykłym typem application / x-www-form-urlencoded, najczęściej używanym w formularzach HTML.

CURLOPT_POSTFIELDS

Pełne dane do wysłania w operacji „POST” HTTP. Aby opublikować plik, poprzedź jego nazwę znakiem @ i użyj pełnej ścieżki. Typ pliku można jawnie określić, dodając po nazwie pliku typ w formacie „; type = mimetype”. Ten parametr można przekazać jako ciąg zakodowany jako urlen, taki jak „para1 = val1 & para2 = val2 & ...”, lub jako tablicę z nazwą pola jako kluczem i danymi pola jako wartością. Jeśli wartość jest tablicą, nagłówek Content-Type zostanie ustawiony na multipart / form-data. Od PHP 5.2.0 wartość musi być tablicą, jeśli pliki są przekazywane do tej opcji z prefiksem @.

DougW
źródło
9

@DougW jasno odpowiedział na to pytanie, ale nadal chciałbym dodać tutaj kilka kodów, aby wyjaśnić punkty Douga. (I popraw błędy w powyższym kodzie)

Rozwiązanie 1: kodowanie URL danych POST z nagłówkiem typu zawartości: application / x-www-form-urlencoded.

Uwaga: nie musisz pojedynczo wpisywać urlencode $ _POST [] pól, funkcja http_build_query () może dobrze wykonać zadanie urlencoding.

$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);

Rozwiązanie 2: Przekaż tablicę bezpośrednio jako dane pocztowe bez kodowania adresu URL, podczas gdy nagłówek Content-Type zostanie ustawiony na multipart / form-data.

$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);

Oba fragmenty kodu działają, ale używają różnych nagłówków HTTP i treści.

bez nieba
źródło
2

curl zakoduje dane za Ciebie, po prostu upuść surowe dane pola do tablicy fields i powiedz mu, aby „go”.

user340140
źródło
1
Spędziłem godziny, aby naprawić skrypt php curl, w którym docelowa strona ASP przekierowuje mnie na stronę błędu po wysłaniu danych postu curl i nie byłem w stanie dowiedzieć się, dlaczego. Następnie po zakodowaniu adresu URL danych postów zadziałało i zacząłem uzyskiwać oczekiwany wynik.
Robi
1
wygląda na to, że jest to tablica, to zostanie automatycznie zakodowany jako urlencod przez curl. jeśli jest przekazywany jako ciąg, najpierw musimy podać kod urlencode.
Robi,
2

Powyższe posty odpowiadają na pytania związane z kodowaniem adresów URL i jak to działa, ale pierwotne pytanie brzmiało „Czy dane POST z kodowaniem URL-i?” na który nie ma odpowiedzi.

Na podstawie mojego niedawnego doświadczenia z kodowaniem adresów URL chciałbym rozszerzyć to pytanie. „Czy powinienem zakodować dane POST w adresie URL, tak samo jak w metodzie GET HTTP. Generalnie formularze HTML w przeglądarce, jeśli są wypełnione, przesłane i / lub POBIERAJĄ niektóre informacje, przeglądarki wykonają kodowanie adresu URL, ale jeśli aplikacja ujawnia usługę internetową i oczekuje Konsumenci powinni kodować adresy URL na danych. Czy jest to poprawne architektonicznie i technicznie kodowanie adresów URL metodą POST HTTP? ”

Varun
źródło