wake-up-neo.com

locken POST Format für CURLOPT_POSTFIELDS

Wenn ich curl über POST verwende und CURLOPT_POSTFIELD setze, muss ich urlencode oder ein anderes Format verwenden?

zum Beispiel: Wenn ich 2 Felder zuerst und zuletzt posten möchte:

first=John&last=Smith

was ist der genaue Code/das Format, das mit curl verwendet werden soll?

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

Wenn Sie eine Zeichenfolge senden, geben Sie urlencode () an. Andernfalls, wenn array, sollte es key => value paired sein, und der Content-type-Header wird automatisch auf multipart/form-data gesetzt.

Außerdem müssen Sie keine zusätzlichen Funktionen erstellen, um die Abfrage für Ihre Arrays zu erstellen. Sie haben bereits Folgendes:

$query = http_build_query($data, '', '&');
92
kodeart

EDIT: Ab PHP5 wird die Verwendung von http_build_query empfohlen:

string http_build_query ( mixed $query_data [, string $numeric_prefix [, 
                          string $arg_separator [, int $enc_type = PHP_QUERY_RFC1738 ]]] )

Einfaches Beispiel aus dem Handbuch:

<?php
$data = array('foo'=>'bar',
              'baz'=>'boom',
              'cow'=>'milk',
              'php'=>'hypertext processor');

echo http_build_query($data) . "\n";

/* output:
foo=bar&baz=boom&cow=milk&php=hypertext+processor
*/

?>

vor php5:

Aus dem Handbuch :

CURLOPT_POSTFIELDS

Die vollständigen Daten, die in einem HTTP-POST-Vorgang zu posten sind. Um eine Datei zu posten, 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' folgt. Dieser Parameter kann entweder als urlencodierte Zeichenfolge wie 'para1 = val1 & para2 = val2 & ...' oder als Array mit dem Feldnamen als Schlüssel und 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 müssen Dateien, die mit dem Präfix @ an diese Option übergeben werden, in Array-Form sein, um zu funktionieren.

So etwas sollte also perfekt funktionieren (mit Parametern, die in einem assoziativen Array übergeben werden):

function preparePostFields($array) {
  $params = array();

  foreach ($array as $key => $value) {
    $params[] = $key . '=' . urlencode($value);
  }

  return implode('&', $params);
}
54
Czechnology

Übergeben Sie keine Zeichenfolge!

Sie können ein Array übergeben und php/curl die schmutzige Arbeit der Kodierung erledigen lassen.

36
ThiefMaster

Gemäß dem PHP - Handbuch sollten Daten, die als Zeichenfolge an cURL übergeben werden, URL-kodiert sein. Siehe die Seite für curl_setopt () und suche nach CURLOPT_POSTFIELDS.

3
Surreal Dreams

Ein weiterer wesentlicher Unterschied, der hier noch nicht erwähnt wurde, ist, dass CURLOPT_POSTFIELDS keine verschachtelten Arrays verarbeiten kann.

Wenn wir das verschachtelte Array ['a' => 1, 'b' => [2, 3, 4]] nehmen, sollte dies als a=1&b[]=2&b[]=3&b[]=4 parametrisiert werden (der [ und ] werden/müssen URL-kodiert sein). Diese wird am anderen Ende automatisch in ein verschachteltes Array zurück konvertiert (vorausgesetzt, das andere Ende ist hier auch PHP).

Das wird funktionieren:

var_dump(http_build_query(['a' => 1, 'b' => [2, 3, 4]]));
// output: string(36) "a=1&b%5B0%5D=2&b%5B1%5D=3&b%5B2%5D=4"

Das funktioniert nicht:

curl_setopt($ch, CURLOPT_POSTFIELDS, ['a' => 1, 'b' => [2, 3, 4]]);

Dadurch erhalten Sie eine Benachrichtigung. Die Codeausführung wird fortgesetzt und Ihr Endpunkt erhält den Parameter b als Zeichenfolge "Array":

PHP-Hinweis: Konvertierung von Array in String in ... online ...

1
7ochem

für verschachtelte Arrays können Sie verwenden:

$data = [
  'name[0]' = 'value 1',
  'name[1]' = 'value 2',
  'name[2]' = 'value 3',
  'id' = 'value 4',
  ....
];
1
Max

Für CURLOPT_POSTFIELDS können die Parameter entweder als eine urlencodierte Zeichenfolge wie para1=val1&para2=val2&.. oder als Array mit dem Feldnamen als Schlüssel und Felddaten als Wert übergeben werden

Versuchen Sie folgendes Format:

$data = json_encode(array(
"first"  => "John",
"last" => "Smith"
));

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$output = curl_exec($ch);
curl_close($ch);
0

Interessanterweise ist Postman do POST eine vollständige GET-Operation mit diesen zwei zusätzlichen Optionen:

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, '');

Nur ein anderer Weg, und es funktioniert sehr gut.

0
Klompenrunner