Kiedy używam curl
via POST
i set, CURLOPT_POSTFIELD
czy muszę mieć urlencode
jakiś specjalny format?
na przykład: Jeśli chcę opublikować 2 pola, pierwsze i ostatnie:
first=John&last=Smith
jaki jest dokładny kod / format, który powinien być używany z curl?
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$reply=curl_exec($ch);
curl_close($ch);
http_build_query($data)
ponieważ&
jest domyślnym separatorem.EDYCJA : Od php5 w górę
http_build_query
zalecane jest użycie:Prosty przykład z instrukcji:
przed php5:
Z instrukcji :
Więc coś takiego powinno działać idealnie (z parametrami przekazanymi w tablicy asocjacyjnej):
źródło
W ogóle nie przekazuj ciągu!
Możesz przekazać tablicę i pozwolić php / curl wykonać brudną robotę kodowania itp.
źródło
http_build_query()
tego samego tablicy)Zgodnie z instrukcją PHP dane przekazywane do cURL jako ciąg znaków powinny być zakodowane w postaci adresu URL. Zobacz stronę dotyczącą curl_setopt () i wyszukaj
CURLOPT_POSTFIELDS
.źródło
W
CURLOPT_POSTFIELDS
przypadku parametrów można przekazywać jako ciąg znaków z kodem urlen, na przykładpara1=val1¶2=val2&..
jako tablicę z nazwą pola jako kluczem i danymi pola jako wartościąWypróbuj następujący format:
źródło
json_encode()
da ci coś naprawdę innego od prawidłowego ciągu parametrów jakofirst=John&last=Smith
.json_encode()
wyświetli:{"first":"John","last":"Smith"}
które następnie stanie się surową treścią twojego żądania POST.json_encode(...)
dohttp_build_query(...)
. Spowoduje to utworzenie oczekiwanego „ciągu zakodowanego w adresie URL” zawierającego parametry oddzielone znakiem „&”.Inną ważną różnicą, o której jeszcze nie wspomniano, jest
CURLOPT_POSTFIELDS
brak obsługi tablic zagnieżdżonych.Jeśli weźmiemy zagnieżdżoną tablicę,
['a' => 1, 'b' => [2, 3, 4]]
należy ją sparametryzować jakoa=1&b[]=2&b[]=3&b[]=4
([
i]
będzie / powinno być zakodowane w postaci adresu URL). Zostanie to automatycznie przekonwertowane z powrotem na zagnieżdżoną tablicę na drugim końcu (zakładając, że drugi koniec to również PHP).To zadziała:
To nie zadziała:
To da ci ostrzeżenie. Wykonywanie kodu będzie kontynuowane, a punkt końcowy otrzyma parametr w
b
postaci ciągu"Array"
:źródło
To zależy od
content-type
url-encoded lub multipart / form-data
Aby wysłać dane w standardowy sposób, tak jak robiłaby to przeglądarka z formularzem, wystarczy przekazać tablicę asocjacyjną . Jak stwierdzono w podręczniku PHP:
Kodowanie JSON
Niemniej jednak podczas komunikacji z interfejsami API JSON zawartość musi być zakodowana w formacie JSON, aby interfejs API mógł zrozumieć nasze dane POST.
W takich przypadkach treść musi być wyraźnie zakodowana w formacie JSON:
Podczas komunikacji w JSON, również zazwyczaj ustawione
accept
icontent-type
nagłówki odpowiednio:źródło
w przypadku tablic zagnieżdżonych możesz użyć:
źródło
Co ciekawe, sposób, w jaki Postman wykonuje POST, to kompletna operacja GET z dwoma dodatkowymi opcjami:
Po prostu inny sposób i działa bardzo dobrze.
źródło
Ta odpowiedź również zajęła mi wieczność. Odkryłem, że wszystko, co musisz zrobić, to połączyć adres URL („?” Po nazwie pliku i rozszerzeniu) z ciągiem zapytania zakodowanym w adresie URL. Nawet nie wygląda na to, że musisz ustawić opcje POST cURL. Zobacz fałszywy przykład poniżej:
Możesz również użyć
file_get_contents()
:źródło