POST verilerini URL olarak kodlamalı mıyım?


122

Verileri harici bir API'ye POST yapıyorum (ilgiliyse PHP kullanarak).

Geçtiğim POST değişkenlerini URL olarak kodlamalı mıyım?

Yoksa yalnızca GET verilerini URL kodlamam mı gerekiyor?

Teşekkürler!

GÜNCELLEME: Bu benim PHP'm, alakalı olması durumunda:

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

1
Bu, referans için API'dir: cyclestreets.net/api - ne beklediğini belirtmiyor gibi görünüyor.
Richard

Yanıtlar:


137

Genel Cevap

Sorunuzun genel cevabı, buna bağlı olmasıdır. Ve HTTP üstbilgilerinde "İçerik Türünüzün" ne olduğunu belirterek karar verebilirsiniz.

"Application / x-www-form-urlencoded" değeri, POST gövdenizin, bir GET parametre dizesi gibi URL kodlamalı olması gerektiği anlamına gelir. "Multipart / form-data" değeri, içerik sınırlayıcıları kullanacağınız ve içeriği kodlayan url kullanmayacağınız anlamına gelir.

Daha fazla bilgi istiyorsanız , bu yanıtın çok daha kapsamlı bir açıklaması var .


Spesifik Cevap

Kullandığınız PHP kitaplıklarına (CURL) özel bir yanıt için buradaki belgeleri okumalısınız .

İşte ilgili bilgiler:

CURLOPT_POST

Normal bir HTTP POST yapmak için DOĞRU. Bu POST, en yaygın olarak HTML formları tarafından kullanılan normal uygulama / x-www-form-urlencoded türüdür.

CURLOPT_POSTFIELDS

Bir HTTP "POST" işleminde gönderilecek tüm veriler. Bir dosya göndermek için dosya adının başına @ ekleyin ve tam yolu kullanın. Dosya türü, dosya adı '; tür = mimetype' biçimindeki türle izlenerek açıkça belirtilebilir. Bu parametre, 'para1 = val1 & para2 = val2 & ...' gibi urlencoded bir dize olarak veya anahtar olarak alan adı ve değer olarak alan verisi olan bir dizi olarak aktarılabilir. Değer bir diziyse, Content-Type başlığı multipart / form-data olarak ayarlanacaktır. PHP 5.2.0'dan itibaren, dosyalar bu seçeneğe @ önekiyle aktarılırsa değer bir dizi olmalıdır.


9

@DougW bu soruyu net bir şekilde cevapladı, ancak yine de Doug'un puanlarını açıklamak için buraya bazı kodlar eklemeyi seviyorum. (Ve yukarıdaki koddaki hataları düzeltin)

1. Çözüm: POST verilerini bir içerik türü üstbilgisiyle URL olarak kodlayın: application / x-www-form-urlencoded.

Not: $ _POST [] alanlarını birer birer urlencode yapmanız gerekmez, http_build_query () fonksiyonu urlencoding işini güzelce yapabilir.

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

2.Çözüm: Diziyi URL kodlaması olmadan doğrudan post verisi olarak iletirken, Content-Type başlığı multipart / form-data olarak ayarlanacaktır.

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

Her iki kod parçacığı da çalışır, ancak farklı HTTP başlıkları ve gövdeleri kullanır.


2

curl sizin için verileri kodlayacaktır, sadece ham alan verilerinizi alanlar dizisine bırakın ve ona "git" komutunu verin.


1
Curl post verilerini gönderdikten sonra hedef ASP web sayfasının beni bir hata sayfasına yönlendirdiği bir php curl betiğini düzeltmek için saatler harcadım ve nedenini anlayamadım. Ardından posta verilerini kodladıktan sonra, işe yaradı ve beklenen sonucu almaya başladım.
Robi

1
dizi olup olmadığına bakar, o zaman otomatik olarak curl ile kodlanır. dizge olarak geçirilirse, önce urlencode yapmamız gerekir.
Robi

2

Yukarıdaki gönderiler, URL Kodlaması ve Nasıl Çalıştığı ile ilgili soruları yanıtlar, ancak asıl soru "POST verilerini URL kodlamalı mıyım?" İdi. cevaplanmayan

URL Kodlama ile ilgili son deneyimime göre, soruyu daha da genişletmek istiyorum. "POST verilerini GET HTTP yöntemiyle aynı şekilde URL olarak kodlamalı mıyım? Genel olarak, Tarayıcı üzerinden HTML Formları doldurulursa, gönderilirse ve / veya bazı bilgiler alırsa, Tarayıcılar URL Kodlama yapar, ancak bir uygulama bir web hizmeti gösterir ve beklerse Tüketiciler veriler üzerinde URL Kodlaması yapacak, POST HTTP yöntemiyle URL Kodlaması yapmak Mimari ve Teknik Olarak Doğru mu? "

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.