Il server RESTful in esecuzione con il modulo Servizio supporta davvero la richiesta multipart/modulo-dati Parsin?
Domanda
Ho cercato per molto tempo di far funzionare un caricamento di un file dalla mia applicazione LISP utilizzando un HTTPPost. Sto eseguendo il modulo Servizio su Drupal 7 con un server RESTful (con la risorsa file abilitata). Sono in grado di connettermi al server e accedere, quindi utilizzare il cookie che viene restituito per inviare un altro http-post a? Q = rest/file che include il file. Questo post ha un tipo di contenuto di dati multipart/forma e restituisce sempre 200 OK ma il caricamento del file non si verifica mai.
Ho provato a fare un post simile da PHP Curl e ha caricato senza intoppi. Quando ho impostato Curlopt_verbose ed ho esaminato l'intestazione del post di successo, ho notato che il tipo di contenuto era application/x-www-form-urlencoded
. Finalmente ho deciso di provare a cambiare il tipo di contenuto nel mio esempio di riccioli in un multipart/data di forma che assomiglia a questo: multipart/form-data; boundary=----------PrqXvhHr3Bb68fVcGv7ohf0K6OOSsi0R4M4JpYPlA4rovP56s7
E ora il file non è più caricato correttamente (ma restituisce ancora il successo).
Ora sto pensando che forse sto avendo tutti questi problemi perché il server Restful non funziona con le richieste multipart/moduli. Qualcuno sa? Qualcuno ha provato questo? Tutta la documentazione che ho letto suggerisce che i trasferimenti di file dovrebbero sempre essere eseguiti con i dati multipart/moduli.
Ecco il codice che sto usando per eseguire il caricamento del file tramite PHP/CURL nel caso in cui qualcuno possa trovarlo utile per comprendere questo problema:
<?php
// node data
$filename = '/Users/mike/hello.png';//'C:\Users\Mike\Desktop\hello.png';
$title = 'A node created with services 3.x and REST server';
$body = '<p>Body lorem ipsum</p>';
$tags = 'TEST_TAG, TEST_TAG2';
$type = 'test'; // node type
$vid = 2; // vid of vocabulary marked as "Tags"
$services_url = 'http://localhost:8888/?q=rest';
/*
* Server REST - user.login
*/
// REST Server URL for auth
$request_url = $services_url . '/user/login';
// User data
$user_data = array(
'username' => 'login',
'password' => 'password',
);
$user_data = http_build_query($user_data);
$fp = @fopen("/Users/Mike/curl-error.log", "w");//'/Users/Mike/curl-error.log';
// cURL
$curl = curl_init($request_url);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Accept: application/json')); // Accept JSON response
curl_setopt($curl, CURLOPT_POST, 1); // Do a regular HTTP POST
curl_setopt($curl, CURLOPT_POSTFIELDS, $user_data); // Set POST data
curl_setopt($curl, CURLOPT_HEADER, FALSE); // Ask to not return Header
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_FAILONERROR, TRUE);
$response = curl_exec($curl);
$http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
// Check if login was successful
if ($http_code == 200) {
// Convert json response as array
$logged_user = json_decode($response);
}
else {
// Get error msg
$http_message = curl_error($curl);
die('Auth error ' . $http_message);
}
// Define cookie session
$cookie_session = $logged_user->session_name . '=' . $logged_user->sessid;
/*
* Server REST - file.create
*/
if(!file_exists($filename)) {
die('File not exists');
}
if(!is_readable($filename)) {
die('File not readable');
}
// file
$file = array(
'filesize' => filesize($filename),
'filename' => basename($filename),
'file' => '@' . $filename, //'file' => base64_encode(file_get_contents($filename)),
'uid' => $logged_user->user->uid,
);
$file = http_build_query($file);
// REST Server URL for file upload
$request_url = $services_url . '/file';
// cURL
$curl = curl_init($request_url);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-type: application/x-www-form-urlencoded'));
curl_setopt($curl, CURLOPT_STDERR, $fp);
curl_setopt($curl, CURLOPT_VERBOSE, 1);
curl_setopt($curl, CURLOPT_POST, 1); // Do a regular HTTP POST
curl_setopt($curl, CURLOPT_POSTFIELDS, $file); // Set POST data
curl_setopt($curl, CURLOPT_HEADER, FALSE); // Ask to not return Header
curl_setopt($curl, CURLOPT_COOKIE, "$cookie_session"); // use the previously saved session
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_FAILONERROR, TRUE);
curl_setopt_array($curl, array(CURLINFO_HEADER_OUT => true) );
$response = curl_exec($curl);
//$postdata = file_get_contents("php://input");
$http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
$headerSent = curl_getinfo($curl, CURLINFO_HEADER_OUT );
// Check if login was successful
if ($http_code == 200) {
// Convert json response as array
$file_data = json_decode($response);
}
else {
// Get error msg
$http_message = curl_error($curl);
die('Sending file error<br>' . $http_message . "\n<br>");
}
// file id (nessesary for node)
$fid = $file_data->fid;
/*
* Server REST - node.create
*/
// REST Server URL
$request_url = $services_url . '/node';
// Node data
$node_data = array(
'title' => $title,
'type' => $type,
'body' => $body,
'taxonomy[tags][' . $vid . ']' => $tags,
'field_main_image[]' => array('fid' => $fid, 'list' => 1, 'data' => NULL),
);
$node_data = http_build_query($node_data);
// cURL
$curl = curl_init($request_url);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Accept: application/json')); // Accept JSON response
curl_setopt($curl, CURLOPT_POST, 1); // Do a regular HTTP POST
curl_setopt($curl, CURLOPT_POSTFIELDS, $node_data); // Set POST data
curl_setopt($curl, CURLOPT_HEADER, FALSE); // Ask to not return Header
curl_setopt($curl, CURLOPT_COOKIE, "$cookie_session"); // use the previously saved session
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_FAILONERROR, TRUE);
$response = curl_exec($curl);
$http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
// Check if login was successful
if ($http_code == 200) {
// Convert json response as array
$node = json_decode($response);
}
else {
// Get error msg
$http_message = curl_error($curl);
die('Getting data error<br>' . $http_message . "\n<br>");
}
print_r($node);
Nessuna soluzione corretta