2015-11-30 7 views
0

Я уже некоторое время работал с php Curl, я недавно наткнулся на кусок CLI CLI, который я не могу заставить работать в curl PHP.curl CLI в сравнении с php curl

Завиток CLI выглядит как следует:

curl -qgsSkH "Content-Type: multipart/form-data" 
--no-progress-bar 
--header "X-Api-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 
-F "[email protected]/tmp/test.txt" 
-F "options={\"application\":\"2\",\"timeout\":\"500\",\"priority\":\"0\"}" 
https://xxxaddrxxx:443/API/vers1.0/sub 

Я использую следующий код PHP локон, чтобы имитировать выше CLI завиток:

$file = new CURLFile($fileEntry->getStoragePath()); 
$file->setMimeType($fileEntry->mime); 
$file->setPostFilename($fileEntry->original_filename); 

$data = array(); 
$data['options'] = json_encode($postData); 
$data['filename'] = $file; 

$headers = array(); 
$headers[] = "Content-Type: multipart/form-data"; 
$headers[] = 'X-FeApi-Token: '.$this->authToken; 

$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL, $url); 
curl_setopt($curl, CURLOPT_HEADER, TRUE); 
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); 
curl_setopt($curl, CURLOPT_POST, 1); 
curl_setopt($curl, CURLOPT_POSTFIELDS, $data); 
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($curl, CURLINFO_HEADER_OUT, true); 
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); 

$curl_response = curl_exec($curl); 

Когда выходной массив данных $ это даст следующие:

array:2 [ 
    "options" => "{"application":"2","priority":"0","timeout":"5000"}" 
    "filename" => CURLFile { 
    +name: "/etc/tmp/5645db226dbddINVOICE-722.doc" 
    +mime: "application/msword" 
    +postname: "INVOICE-722.doc" 
    } 
] 

Это все правильные данные, соответствующие тому, что я предоставляю в коде.

Тем не менее сервер, на котором я пытаюсь нажать файл и метаданные, также ответил ошибкой, что массив параметров или имя файла не указаны или не загружены. Эта ошибка предоставляется только тогда, когда я пытаюсь проталкивать ее через PHP, когда я запускаю команду raw curl на сервере Linux, она работает нормально.

Я делаю ошибку в отношении двойной опции -F? Или я пропустил что-то в новом методе публикации CURLFile, потому что во всех предыдущих сообщениях в Stack Overlow используется устаревший метод с использованием «@»?

Начальная часть команды curl cli и php curl кажется идентичной при отладке. Сама полезная нагрузка не может быть легко проверена из-за шифрования ssl (https, который не может быть отключен на принимающем сервере).

Заранее спасибо.

G.

ответ

0

Эта проблема исправлена. CURL отлично работает, это была интеграция Vendors API, которая не действовала так, как ожидалось.

Он запрашивает переменную параметров JSON, но то, что не было задокументировано, заключается в том, что ORDER имеет важное значение, которое просто совершенно неприемлемо, если вы запрашиваете JSON.

Поставщик информирован и исправляет эту проблему, потому что при проведении подробного расследования выяснилось, что метод разбора JSON может иметь некоторые последствия для безопасности.