2016-09-20 7 views
1

Ich versuche auf eine API von Drittanbietern mit PHP zuzugreifen.curl -F "daten = {json: 'code'}" in PHP?

Ihre Befehlsreferenz ist in etwa so:

curl "https://api.example.com/api/" \ 
    -H "Authorization: BEARER-TOKEN" \ 
    -F 'data={"language":"EN","latitude":12.345,"longitude":12.345}' 

Ich habe versucht:

$url = 'https://api.example.com/api/'; 
    $header = array(
     'Content-type: application/json', 
     'Authorization: ' . $bearertoken 
    ); 

    $fields = 'data={"language":"EN","latitude":"'.$latitude.'","longitude":"'.$longitude.'"}'; 

    // I've tried this too: 
    $fields = array('data' => '{"language":"EN","latitude":"'.$latitude.'","longitude":"'.$longitude.'"}'); 

    $ch = curl_init(); 

    $options = array(
     CURLOPT_URL => $url, 
     CURLOPT_POST => true, 
     CURLOPT_POSTFIELDS => $fields, 
     CURLOPT_HTTPHEADER => $header, 
     CURLOPT_RETURNTRANSFER => true, 
     CURLOPT_HEADER => false, 
     CURLOPT_FOLLOWLOCATION => true, 
     CURLOPT_MAXREDIRS => 10, 
     CURLOPT_ENCODING => "", 
     CURLOPT_AUTOREFERER => true, 
     CURLOPT_CONNECTTIMEOUT => 120, 
     CURLOPT_TIMEOUT => 120 
    ); 
    curl_setopt_array($ch, $options); 
    $result = curl_exec($ch);` 

Aber der Server antwortet mit einer Nachricht mir zu sagen, es nicht um die Parameter bekommen habe ich das Senden bin . Wenn ich dieselbe -F "data={}" von einem Terminal aus sende, bekomme ich die richtige Antwort.

Antwort

2

Sie sollten Content-type: application/json nicht verwenden. Der Wert des Parameters data ist JSON, aber die Parameter als Ganzes werden im Format application/x-www-form-urlencoded gesendet.

Sie müssen auch den Wert des Parameters data URL-kodieren.

Die beste Lösung ist json_encode zu verwenden, um die JSON-Wert zu erstellen, dann eine Reihe von Post-Felder verwenden, dann curl werden die Felder richtig kodieren.

$header = array(
    'Authorization: ' . $bearertoken 
); 
$fields = array('data' => 
    json_encode(array('language' => 'EN', 
         'longitude' => $longitude, 
         'latitude' => $latitude))); 
1

curl -F macht die Form folgende RFC 2388Content-Type: multipart/form-data verwenden. Sie widersprechen dem ausdrücklich, wenn Sie den Inhaltstyp application/json festlegen.

$data = array('language' => 'EN', 'longitude' => $longitude, 'latitude' => $latitude); 
$headers = array (
    "Content-Type: multipart/form-data", 
    "Authorization: $bearertoken", 
); 
$postfields = array ("data" => json_encode($data)); 
$ch = curl_init(); 
$options = array(
    CURLOPT_URL => $url, 
    CURLOPT_HEADER => true, 
    CURLOPT_HTTPHEADER => $headers, 
    CURLOPT_POST => true, 
    CURLOPT_POSTFIELDS => $postfields, 
    CURLOPT_RETURNTRANSFER => true 
); 
curl_setopt_array($ch, $options); 
curl_exec($ch); 

Auch, wenn das die eigentliche Dokumentation ist, kann es falsch sein. The format for Authorization header ist Authorization: Bearer <token>.