drupal xmlrpc(services)

8 contenuti / 0 new
Ultimo contenuto
drupal xmlrpc(services)

salve a tutti. sto utilizzando xmlrpc di services. ho riuscito a far comunicare un mio programma sritto in java cn drupal.
riesco a creare un nodo ed aggiungere un contenuto. non riesco a capire come posso allegare un file.
qualcuno sa aiutarmi!?
grazieeee :)

Questo esempio in Python forse aiuta: http://drupal.org/node/687116

Più imparo, più dubito.

ho provato a darci uno sguardo... ma non è molto chiaro :) non sapresti darmi qualche dritta per il java?

Se conosci Java, il codice Python non è così difficile da leggere...

Devi fare due operazioni:
1. Salvare il file, col servizio 'file.save' e tenere il fid restituito
2. Aggungere il fid nel array files del nodo, e salvare il nodo col servizio 'node.save'

Il codice in http://drupal.org/node/632844 ha una classe Java, ma la funzione fileSave() - come dice il comment - è completamente inutilizzabile.

Per capire cosa pretende il servizio 'file.save', guarda qui: http://drupalcode.org/viewvc/drupal/contributions/modules/services/servi... la funzione è file_service_save().

Ad una prima occhiata mi sembra che vuole:

file: dati del file codificato base64
filepath: indirizzo del file sul server, quindi sites/default/files/ + altro se necessario + il filename
niente di straordinario qui.

Il codice Python è stato molto più completo (anche se il servizio butta via la gran parte di questo informazione):

## Load a movie file
filename = 'testfile.MOV'
filesize = os.stat(filename).st_size
filemime = mimetypes.guess_type(filename)
fd = open(filename, 'rb')
video_file = fd.read()
fd.close()
# Create a file_obj dict with encoded file data
file_obj = {
    'file': base64.b64encode(video_file),
    'filename': filename,
    'filepath': 'sites/default/files/' + filename,
    'filesize': filesize,
    'timestamp': timestamp,
    'uid': user['uid'],
    'filemime': filemime,
}

Per capire la proprietà files di un nodo, ho guardato con devel e kpr(), comunque troverai il codice in upload_save() includes/upload.module, essenzialmente è un array di chiavi e valori:

fid => array(
  'fid' => fid, // mentalità $P->H->P fid => [ 'fid' => fid ], sigh
  'new' => 1, // perche è nuovo
  'list' => 1, // se vuoi che appare nella lista, altrimenti 0
  'description' => "qualsiasi testo, ma di solito il nome-del-file",
  'weight' => 0,
  );
}

Anche qui, il codice Python è più che corretto:

# Create the node object and reference the new fid just created
node = {
  'type': 'video_local',
  'status': 1,
  'type': 'video_local',
  'title': 'Remote Test ' + timestamp,
  'body': 'This is a test created from a remote app',
  'uid': user['uid'],
  'name': user['name'],
  'changed': timestamp,
  'files': { f: {
    'new': 1, # Required to insert the referenced file->fid as new attachment!
    'fid': f, # f is fid from uploaded video file
    'list': 1, # Or 1, depending on whether you want the attachment listed on node view.
    'description': 'Video File', # Any text description
    'weight': 0,
    }
  },
  'field_video_overlay' : [
    {'value': 'CCK Text Goes Here'},
  ],
}

mentre il codice Java è un pò lontano - dato che non prevede una proprietà 'files'. Sigh.

HTH

John

Più imparo, più dubito.

quindi dovrei riscrivere la funzione fileSave() che si trova in http://drupal.org/node/632844 oppure posso utilizzare quella per salvare il file?

quindi dovrei riscrivere la funzione fileSave() che si trova in http://drupal.org/node/632844 oppure posso utilizzare quella per salvare il file?

Uhm, no. Quella funzione è lampantemente rotto.
TODO: Leo says: This does not conform to the Drupal interface of file.save
Infatti manca filename per esempio...

Secondo me, anche la classe è rotto. Almeno concettualmente. But I digress...

La "Java way" non è particolarmente adatto ad un problema del genere. Da una parte hai un linguaggio rigido, dall'altra un linguaggio flessibile...

Personalmente userei dei Hashmap, e non mi metto a creare un tot di classe (che ereditano Hashmap) per mappare quello che in PHP (array o oggetto) è facilmente definibile con un semplice Hashmap in Java (node, file, ecc). Puro eresia nel mondo Java, naturalmente, ma è divertente essere eretico qualche volta.

L'esempio in Groovy (non particolarmente brillante - for () invece di hash.each { }) è comunque molto più leggibile http://drupal.org/node/132809 proprio perchè più vicino al tipo di linguaggio del server.

HTH

John

Più imparo, più dubito.

intanto ti ringrazio per le rispote, gentilissimo... certo che è un bel casino... dovrei cercare di riscrivere quella funzione allora