Wie muss ich den folgenden Curl-Befehl in eine gültige PHP-Curl-Funktion "übersetzen"?cUrl mit JSON-String und Datei-Upload
curl -X POST
-F "[email protected]"
-F parameters=%7B%22classifier_ids%22%3A%5B%22testtype_205919966%22%5D%2C%22threshold%22%3A0%7D
'https://gateway-a.watsonplatform.net/visual-recognition/api/v3/classify?api_key={key}&version=2016-05-20'"
Es scheint, dass ich etwas falsch mache, und ich kann das Problem nicht herausfinden:
$method = 'POST'
$url = 'https://gateway-a.watsonplatform.net/visual-recognition/api/v3/classify?api_key=<myApiKey>&version=2016-05-20'
$data = array(
array(<file-information>),
array(<json-string>),
)
$header = array(
'Content-Type: application/json',
'Content-Length: ' . strlen(<json-string>),
)
)
public function send($method, $url, $data = null, $header = null)
{
$curl = curl_init();
switch ($method) {
case "POST":
curl_setopt($curl, CURLOPT_POST, 1);
if ($data) {
$postData = $this->renderPostData($data);
curl_setopt($curl, CURLOPT_POSTFIELDS, $postData);
}
break;
}
if($header) {
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl,CURLOPT_HTTPHEADER,$header);
}
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($curl);
}
protected function renderPostData($data)
{
$postData = array();
foreach ($data as $file) {
if ($file['isFile']) {
if(pathinfo($file['path'], PATHINFO_EXTENSION) == 'zip'){
$postData[$file['name']] = new \CURLFile($file['path'], 'application/zip', $file['name']);
}
else {
$postData[$file['name']] = new \CURLFile($file['path'], 'application/octet-stream', $file['name']);
}
} else {
// this contains the json encoded string
$postData[$file['name']] = $file['path'];
}
}
return $postData;
}
ich nun mehrere Varianten und die Watson von Visual Recognition API-Fehler versucht:
{ "custom_classes": 0, "Bilder": [{ "Fehler": { "description": „Inva Deckelbilddaten. Unterstützte Formate sind JPG und PNG ", "ERROR_ID.": "Input_error" } } ], "images_processed": 1 }
, bevor es war:
{ "Fehler": { "code": 400, "Beschreibung": "Ungültiger JSON-Inhalt wurde empfangen. Nicht in der Lage zu analysieren ", "ERROR_ID.": "PARAMETER_ERROR" }, "images_processed": 0 }
Vielen Dank für Ihre Hilfe
Sie senden '$ data', aber Ihr' Inhalt-Length' Header gibt vor, die Größe der Anforderung war nur, dass die '', das ist nur ein Teil von '$ data'. –
CBroe
Das Ermitteln der korrekten Länge des assemblierten Anforderungskörpers sollte eigentlich _inside_ einer solchen 'send'-Methode angehören ... aber zuerst würde ich es ohne es versuchen - cURL sollte in der Lage sein, den korrekten Wert herauszufinden und diesen Header automatisch anzuhängen Wenn Sie eine Array-Datenstruktur an CURLOPT_POSTFIELDS übergeben – CBroe
(Eigentlich sieht es so aus, als würden Sie keine $ Daten senden, sondern diese durchlaufen und erst dann die eigentlichen Upload-Dateien zur Datenstruktur hinzufügen ... aber in jedem Fall, Ihre Berechnung der Inhaltslänge scheint viel zu früh ...) – CBroe