Le serveur RESTful en cours d'exécution avec le module de services prend-il vraiment en charge la demande multiparte / format de forme de formulaire Parsin?

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

  •  30-10-2019
  •  | 
  •  

Question

J'essaie depuis longtemps pour obtenir un téléchargement de fichiers pour travailler à partir de mon application LISP à l'aide d'un HTTPPOST. J'exécute le module Services sur Drupal 7 avec le serveur A RESTful (avec la ressource de fichier activé). Je suis en mesure de me connecter au serveur et de me connecter, puis d'utiliser le cookie qui est renvoyé pour envoyer un autre http-post vers? Q = repos / fichier qui inclut le fichier. Cet article a un type de contenu de données multipartiales / formulaires et renvoie toujours 200 ok mais le téléchargement de fichiers ne se produit jamais.

J'ai essayé de faire un post similaire de PHP Curl et il a téléchargé sans accroc. Lorsque j'ai réglé Curlopt_verbose et examiné l'en-tête du message réussi, j'ai remarqué que le type de contenu était application/x-www-form-urlencoded. Enfin, j'ai décidé d'essayer de modifier le type de contenu dans mon exemple de boucle en un multipart / format de format ressemblant à ceci: multipart/form-data; boundary=----------PrqXvhHr3Bb68fVcGv7ohf0K6OOSsi0R4M4JpYPlA4rovP56s7 Et maintenant, le fichier n'est plus correctement téléchargé (mais renvoie toujours le succès).

Je pense maintenant que j'ai peut-être tous ces problèmes parce que le serveur RESTful ne fonctionne pas avec les demandes de données multipart / format. Est-ce que quelqu'un sait? Quelqu'un a-t-il essayé cela? Toute la documentation que j'ai lue suggère que les transferts de fichiers doivent toujours être effectués avec des données multipartiales / format.

Voici le code que j'utilise pour faire le téléchargement de fichiers via PHP / CURL au cas où quelqu'un pourrait le trouver utile pour comprendre ce problème:

<?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);

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à drupal.stackexchange
scroll top