Il server RESTful in esecuzione con il modulo Servizio supporta davvero la richiesta multipart/modulo-dati Parsin?

drupal.stackexchange https://drupal.stackexchange.com/questions/25532

  •  30-10-2019
  •  | 
  •  

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a drupal.stackexchange
scroll top