Tuesday, September 26, 2006

Javascript, AJAX -Multipart POST και σπάστε μου τα νεύρα! - Τεχνικό

Για κάποιον που εδώ και καιρό γράφει mainly αρκετά heavy server side κωδικα, EJBs, ORMs, Web services η μετάπτωση όταν χρειαστεί σε ελαφρά πράγματα βλέπε Javascript, AJAX και λοιπά frameworks around XMLHttpRequest είναι λίγο σπαστική!

Παρόλα αυτά, καλό είναι να βλέπεις σε λεπτομέρεια τα πάντα, ότι σου δοθεί η ευκαιρία δηλαδή για να έχεις μια πλήρη εικόνα της κατάστασης!

Με απασχόλησε σήμερα η κατάσταση του να κάνει POST ένα multipart form request (δηλαδή ανάμεσα στα άλλα να έχει και files) με AJAX και όταν λέμε AJAX με χρήση XMLHttpRequest. Λοιπόν όπως σωστά, έγραψε κάποιος η απάντηση είναι ότι ναι μεν μπορείς να το κάνεις αλλά και δεν μπορείς να το κάνεις!Μετά απο ώρα και ψάξιμο δεν μπορείς να το κάνεις..τελικά, ή μάλλον οι πιθανές λύσεις δεν μου άρεσαν. Δεν μου άρεσε-> που αρκετά λογικά για να στείλεις το POST σου πρέπει να γράψει ΜΟΝΟΣ σου ολο το format του POST request και ενω για διάφορα input values εντάξει δεν τρέχει και τίποτα, &και ? και name value paιrs όταν ξεκινάνε τα files γίνεται της πο@τανας!

Κοίτα εδώ τον μάγκα. Για να ρουφήξει το αρχείο καλεί API του firefox συγκεκριμένα να διαβάσει τα Bytes και να το στείλει μαζί με τα άλλα. Ουσιαστικά τελικά γράφεις κώδικα ο οποίος θα δημιουργήσει το RFC του POST όπως θα έκανε η browser. Δεν μου αρέσει το κόλπο..το βρήκα αρκετα restrictive, άσε που o Firefox ηθελε αλλαγή στα security setting!

Αν δεν έχεις να μπλέξεις με input files δηλαδή με non multipart αλλά απλα text request φοβέρός ο μάγκας εδώ έχει φιάξει έναν αρκετά μαζεμένο και generic τρόπο να POST-αρει. Είπαμε αρκεί να μην έχεις input.

Τώρα με το AJAX και τις λοιπές pipes (συγνώμη αλλά γενικά δεν ειμαι scripting τύπος) αρκετά framework έχουν ανθήσει, που μαζεύουν λίγο αυτη την ανεξέλεγκτη κατάσταση. Αυτό που είχα δεί ελάχιστα παλιά και δοκίμασα να POST-αρω multipart-form ήταν to DOJO.Θα βρείς πληροφορίες και ένα ωραίο παραδειγματάκι εδώ.
Καταρχήν μιας και έψαξα και πειραματίστηκα μπορώ να πω οτι δεν μου αρέσει καθόλου η όλη σύνταξη και ο γενικότερος μηχανισμός!Ίσως έχω εθιστεί στις Strong typed language αλλά δεν ξέρω απλά δεν μου έκανε το τικ. Και τελικά ..επειδή ο πειραματισμός ήταν η αποκλειστική χρήση του XMLHttpRequest χα τι βλέπεις οτι και το DOJO χρησιμοποιεί IFrame!

Όσοι γνωρίζουν για την περίπτωση θα ξέρουν ότι οτι ασυγχρονο remote scripting μέχρι τώρα έκανες με to IFrame. Τελικά βαρέθηκα και έκανα ότι έκανα με hidden Iframe και άντε γεια. χο χο χο χο χο .....

(χωρίς πλάκα μου άρεσε αρκετά το Java/ΑJAX toolkit του Google..πολυ ωραία φιαγμένο..I will consider!)

5 comments:

  1. Έλα ρε... Δεν υπάρχει πιο αηδιαστικό πράγμα από τα iframes...

    ReplyDelete
  2. 1) Συμφωνω με vrypan και επαυξανω με το παραδειγμα μπαμιες γιαχνι.

    2)
    a) IFrame χρησιμοποιει και το google api για να μπορεις να κανεις back στον browser. Για τη multipart φορμα δεν ξερω.

    b) Αυτη τη φορα το api της google ειναι ΒΕΤΑ και φαινεται στα πολυπλοκα applications. Αν προσπαθησεις να κανεις generate ολο το GUI δυναμικα (σβησε/γραψε ξαναγραψε) θα δεις οτι divs δεν φαινονται, firefox/IE incompatibilities.

    Αν ειναι για κατι σαν τα παραδειγματακια που εχει, ειναι ΟΚ. Για παραπανω πανε για κατι πιο stable. Εχεις δοκιμασει Echo2?

    ReplyDelete
  3. sorry ενοουσα το AJAX web toolkit και οχι το google api (που παραπεμπει σε ψαξιμο)

    ReplyDelete
  4. Παιδιά το multipart form post ειναι ειδικη περίπτωση και ο τρόπος που γνωστά framework το αντιμετωπίζουν ειναι με εσωτερικο iframe! Για οτιδήποτε άλλο ειναι ΟΚ το XmlHttpRequest!

    ReplyDelete
  5. Το σπαστικό είναι το security restriction (XSS) που έχει η Javascript σύμφωνα με το οποίο δεν επιτρέπει το cross-site/domain file handling με JS (με λίγα λόγια να πάρετε ένα xml που βρίσκεται σε άλλον server με το XMLHttpRequest) οπότε πολλοί καταφεύγουν στην 'μπακάλικη' λύση των IFrames. This sucks big time..indeed..

    ReplyDelete