το angularjs $ http.post () δεν στέλνει δεδομένα
<p>θα μπορούσε κάποιος να μου πει γιατί η ακόλουθη δήλωση δεν στέλνει τα δεδομένα μετά στην καθορισμένη διεύθυνση url; η διεύθυνση url καλείται, αλλά στο διακομιστή όταν εκτυπώνω $ \_post - έχω έναν κενό πίνακα. εάν εκτυπώσω μήνυμα στην κονσόλα πριν την προσθέσω στα δεδομένα - εμφανίζει το σωστό περιεχόμενο.</p><pre><code>$http.post('request-url', { 'message' : message }); </code></pre><p>έχω επίσης δοκιμάσει με τα δεδομένα ως string (με το ίδιο αποτέλεσμα):</p><pre><code>$http.post('request-url', "message=" + message); </code></pre><p>φαίνεται να λειτουργεί όταν το χρησιμοποιώ με την ακόλουθη μορφή:</p><pre><code>$http({ method: 'post', url: 'request-url', data: "message=" + message, headers: {'content-type': 'application/x-www-form-urlencoded'} }); </code></pre><p>αλλά υπάρχει ένας τρόπος να το κάνει με το $ http.post () - και πρέπει πάντα να συμπεριλαμβάνω την κεφαλίδα για να λειτουργήσει; πιστεύω ότι ο παραπάνω τύπος περιεχομένου καθορίζει τη μορφή των αποστελλόμενων δεδομένων, αλλά μπορώ να τα στείλω ως αντικείμενο javascript;</p>
<p>είχα το ίδιο πρόβλημα χρησιμοποιώντας asp.net mvc και <a href="http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/">βρήκα τη λύση εδώ</a> </p><blockquote> <p>υπάρχει μεγάλη σύγχυση μεταξύ των νεοεισερχομένων στο <strong> angularjs </strong> για το γιατί οι <code>$http</code> λειτουργίες στενογραφίας της υπηρεσίας (<code>$http.post()</code>, κλπ.) δεν φαίνονται να είναι εναλλάξιμες με το <strong> ισοδύναμα jquery </strong> (<code>jquery.post()</code>, κ.λπ.)</p> <p>η διαφορά είναι στον τρόπο <strong> jquery </strong> και <strong> angularjs </strong> σειριοποίηση και μετάδοση των δεδομένων. βασικά, το πρόβλημα έγκειται στη γλώσσα του server σας που δεν είναι σε θέση να καταλάβει τη μετάδοση του angularjs με εγγενή ... από προεπιλογή, <strong> jquery </strong> μεταδίδει δεδομένα χρησιμοποιώντας</p> <pre><code>content-type: x-www-form-urlencoded </code></pre> <p>και την εξοικειωμένη σειριοποίηση <code>foo=bar&amp;baz=moe</code>.</p> <p><strong> το angularjs </strong>, ωστόσο, μεταδίδει δεδομένα χρησιμοποιώντας</p> <pre><code>content-type: application/json </code></pre> <p>και <code>{ "foo": "bar", "baz": "moe" }</code></p> <p>η σειριοποίηση json, η οποία, δυστυχώς, μερικές γλώσσες διακομιστή web - <em> και συγκεκριμένα η php </em> - δεν απομακρύνονται εγγενώς.</p> </blockquote><p>δουλεύει άψογα.</p><p><b>κωδικας</b></p><pre><code>// your app's root module... angular.module('mymodule', [], function($httpprovider) { // use x-www-form-urlencoded content-type $httpprovider.defaults.headers.post['content-type'] = 'application/x-www-form-urlencoded;charset=utf-8'; /** * the workhorse; converts an object to x-www-form-urlencoded serialization. * @param {object} obj * @return {string} */ var param = function(obj) { var query = '', name, value, fullsubname, subname, subvalue, innerobj, i; for(name in obj) { value = obj[name]; if(value instanceof array) { for(i=0; i&lt;value.length; ++i) { subvalue = value[i]; fullsubname = name + '[' + i + ']'; innerobj = {}; innerobj[fullsubname] = subvalue; query += param(innerobj) + '&amp;'; } } else if(value instanceof object) { for(subname in value) { subvalue = value[subname]; fullsubname = name + '[' + subname + ']'; innerobj = {}; innerobj[fullsubname] = subvalue; query += param(innerobj) + '&amp;'; } } else if(value !== undefined &amp;&amp; value !== null) query += encodeuricomponent(name) + '=' + encodeuricomponent(value) + '&amp;'; } return query.length ? query.substr(0, query.length - 1) : query; }; // override $http service's default transformrequest $httpprovider.defaults.transformrequest = [function(data) { return angular.isobject(data) &amp;&amp; string(data) !== '[object file]' ? param(data) : data; }]; }); </code></pre>
Σε περίπτωση που κάποιος πρέπει να κάνει το ίδιο πράγμα, έχω [ανακαλύψει ότι είναι δυνατόν με τη χρήση Servlets](https://stackoverflow.com/questions/359147/mask-urls-in-jsp) να φιλτράρετε τις διευθύνσεις URL, response.sendRedirect () και request.getRequestDispatcher (). Προς τα εμπρός (). Μπορείτε να χρησιμοποιήσετε `get_absolute_url`, αλλά αυτό θα λειτουργήσει μόνο για ένα συγκεκριμένο αντικείμενο. Από το αντικείμενό σας δεν έχει δημιουργηθεί ακόμη, δεν θα λειτουργήσει σε αυτή την περίπτωση.


Θέλετε να χρησιμοποιήσετε [το όνομα μοτίβα URL](https://docs.djangoproject.com/en/1.2/topics/http/urls/#naming-url-patterns) . Εδώ είναι μια γρήγορη εισαγωγή:


Αλλάξτε τη γραμμή urls.py σας:



```
(r'^manage/products/add/$', create_object, {'model': Product, 'post_save_redirect': ''}, "create-product"),

```

Στη συνέχεια, το πρότυπό σας μπορείτε να χρησιμοποιήσετε αυτό για να εμφανίσετε τη διεύθυνση URL:



```
{% url create-product %}

```

Αν χρησιμοποιείτε Django 1.5 ή νεότερη έκδοση θα πρέπει να έχετε αυτό:



```
{% url 'create-product' %}

```

Μπορείτε να κάνετε κάποια πιο ισχυρά πράγματα με το όνομά μοτίβα διευθύνσεων URL, είναι πολύ βολικό. Σημειώστε ότι αυτά είναι μόνο στην έκδοση ανάπτυξης (και επίσης 1.0). Δεν μπορείτε, αυτή η πληροφορία δεν αποστέλλεται στο διακομιστή για προφανείς λόγους ασφαλείας. Μόνο το όνομα του αρχείου που αποστέλλεται στο διακομιστή. Έτσι, δεν μπορείτε να αποθηκεύσετε τη φυσική διαδρομή όπου βρίσκεται το αρχείο προέρχεται από το μηχάνημα του πελάτη στον κεντρικό υπολογιστή σας. Μετά από κάποια έρευνα, έχω βρεθεί επιτέλους μια λύση στο πρόβλημα.


Έχω αντικαταστήσει τις κλήσεις προς Context.RewritePath () μέθοδος με το νέο (εισήχθη το ASP.NET 3.5) **Context.Server.TransferRequest ()** μέθοδο.


Είναι προφανές πλέον, όχι όμως περίπτωση Ανώτερος Dev Μηχανικός στο IIS πυρήνα της ομάδας σκέψη ότι.


Έχω δοκιμάσει για συνεδρία, ταυτότητας, postback, querystring, ... θέματα και βρήκε κανένα.


Αύριο θα αναπτύξετε την αλλαγή σε μια πολύ hight ιστοσελίδα της κυκλοφορίας, και θα ξέρουμε σύντομα πώς λειτουργεί στην πραγματικότητα. :)


Θα είμαι πίσω με την ενημέρωση.


**Η ενημέρωση:** η λύση δεν είναι ακόμα απόλυτα σε διακομιστές παραγωγής μου, αλλά αυτό είναι δοκιμασμένο και κάνει δουλειά και στο βαθμό που μπορώ να πω τώρα, είναι μια λύση για το πρόβλημά μου. Αν έχω ανακαλύψει οτιδήποτε άλλο στην παραγωγή, θα δημοσιεύσετε μια ενημέρωση.


**Η τελευταία ενημέρωση:** Έχω αυτή τη λύση στην παραγωγή για πάνω από ένα χρόνο και έχει αποδειχθεί ότι είναι μια καλή και σταθερή λύση χωρίς προβλήματα. Όταν είχα ανάγκη να γράψω μια εφαρμογή με ένα μοντέλο πελάτη-εξυπηρετητή, όπου οι πελάτες θα μπορούσαν να φύγουν και να εισάγετε όποτε θέλουν, (υποθέτω ότι είναι επίσης η περίπτωση για την εφαρμογή σας, όπως εσείς χρησιμοποιείτε φορητές συσκευές) που φρόντισε ώστε οι πελάτες να στείλετε ένα *σε απευθείας σύνδεση* μήνυμα στο διακομιστή, αναφέροντας ότι έχουν συνδεθεί και είναι έτοιμη να κάνει ό, τι χρειάζεται να κάνει.


εκείνη τη στιγμή ο server θα μπορούσε να στείλει μηνύματα πίσω στον πελάτη γούρνα την ίδια ανοικτή σύνδεση.


Επίσης, αλλά δεν ξέρω αν αυτό ισχύει για εσάς, είχα κάποια *αρρυθμία* οι πελάτες που αποστέλλονται στο διακομιστή, αφήνοντας το γνωρίζουν ακόμα ότι ήταν σε απευθείας σύνδεση. Με αυτόν τον τρόπο ο server ξέρει πότε ένας πελάτης ήταν βίαια αποσυνδεθεί από το δίκτυο και θα μπορούσε να σηματοδοτήσει ότι πελάτη πίσω και offline. Κάνατε πολύ καλή δουλειά στο να συνοψίσετε τι είναι φοβερό στο Node.js. Η αίσθησή μου είναι ότι το Node.js είναι ιδιαίτερα κατάλληλο για εφαρμογές όπου θα θέλατε να διατηρήσετε μια μόνιμη σύνδεση από το πρόγραμμα περιήγησης πίσω στον διακομιστή. Χρησιμοποιώντας μια τεχνική γνωστή ως ["long-polling"](https://en.wikipedia.org/wiki/Push_technology#Long_polling), μπορείτε να γράψετε μια εφαρμογή που στέλνει ενημερώσεις στον χρήστη σε πραγματικό χρόνο. Η πραγματοποίηση long polling σε πολλούς από τους γίγαντες του διαδικτύου, όπως το [Ruby on Rails](https://en.wikipedia.org/wiki/Ruby_on_Rails) ή το [Django](https://en.wikipedia.org/wiki/Django_%28web_framework%29), θα δημιουργούσε τεράστιο φόρτο στον διακομιστή, επειδή κάθε ενεργός πελάτης τρώει μια διεργασία του διακομιστή. Αυτή η κατάσταση ισοδυναμεί με επίθεση [tarpit](https://en.wikipedia.org/wiki/Tarpit_(networking)). Όταν χρησιμοποιείτε κάτι όπως το Node.js, ο διακομιστής δεν έχει ανάγκη να διατηρεί ξεχωριστά νήματα για κάθε ανοιχτή σύνδεση. 


Αυτό σημαίνει ότι μπορείτε να δημιουργήσετε μια [εφαρμογή συνομιλίας με βάση το πρόγραμμα περιήγησης](https://github.com/rivalslayer/node_chat) σε Node.js που δεν χρειάζεται σχεδόν καθόλου πόρους συστήματος για να εξυπηρετεί πολλούς πελάτες. Κάθε φορά που θέλετε να κάνετε αυτού του είδους τη μακροχρόνια αναζήτηση, το Node.js είναι μια εξαιρετική επιλογή. 


Αξίζει να αναφέρουμε ότι και η Ruby και η Python έχουν εργαλεία για να κάνουν κάτι τέτοιο ([eventmachine](http://rubyeventmachine.com/) και [twisted](https://twistedmatrix.com/trac/), αντίστοιχα), αλλά ότι το Node.js το κάνει εξαιρετικά καλά, και από την αρχή. Η JavaScript είναι εξαιρετικά καλά τοποθετημένη σε ένα μοντέλο ταυτόχρονης λειτουργίας βασισμένο σε callback, και υπερέχει εδώ. Επίσης, η δυνατότητα σειριοποίησης και αποσειριοποίησης με JSON εγγενές τόσο στον πελάτη όσο και στον διακομιστή είναι αρκετά έξυπνη.


Ανυπομονώ να διαβάσω άλλες απαντήσεις εδώ, αυτή είναι μια φανταστική ερώτηση.


Αξίζει να επισημάνουμε ότι το Node.js είναι επίσης εξαιρετικό για καταστάσεις στις οποίες θα επαναχρησιμοποιήσετε πολύ κώδικα σε όλο το χάσμα πελάτη/εξυπηρετητή. Το [Meteor framework](https://meteor.com) το κάνει αυτό πολύ εύκολο, και πολλοί άνθρωποι προτείνουν ότι αυτό μπορεί να είναι το μέλλον της ανάπτυξης ιστοσελίδων. Μπορώ να πω από την εμπειρία μου ότι είναι πολύ διασκεδαστικό να γράφεις κώδικα στο Meteor, και ένα μεγάλο μέρος αυτού είναι να ξοδεύεις λιγότερο χρόνο σκεπτόμενος πώς θα αναδομήσεις τα δεδομένα σου, ώστε ο κώδικας που εκτελείται στο πρόγραμμα περιήγησης να μπορεί εύκολα να τα χειριστεί και να τα μεταβιβάσει πίσω.


Εδώ είναι ένα άρθρο για το Pyramid και το long-polling, το οποίο αποδεικνύεται ότι είναι πολύ εύκολο να ρυθμιστεί με λίγη βοήθεια από το gevent: [*TicTacToe και Long Polling με την Pyramid*](http://michael.merickel.org/2011/6/21/tictactoe-and-long-polling-with-pyramid/). Η τεχνική που περιγράφεται φαίνεται ωραίο, αλλά έχει πολλές παγίδες:


1) ο χρόνος μεταξύ της έναρξης PHP script και άκρο είναι μικρή σε σύγκριση με το χρόνο μετάδοσης? Επίσης, αυτό σώζει το χρήστη για 0,5 δευτερόλεπτα, σύμφωνα με την πηγή σας. Είναι αυτό ένα σημαντικό χρονικό διάστημα για εσάς;


2) αυτή η τεχνική δεν λειτουργεί με gzip buffering εξόδου


3) αν ξεπλύνετε πάρα πολύ συχνά, θα πρέπει να στείλει ένα σχεδόν άδειο πακέτο στο ίδιο επίπεδο, το οποίο θα μπορούσε πραγματικά να αυξήσει το χρόνο φόρτωσης (για αργή, θορυβώδη συνδέσεις).


4) Μόλις ξεπλύνετε, δεν μπορείτε να στείλετε πια κεφαλίδες


5) (δευτερεύον θέμα) η απόκριση του server θα έρθει στην κατατμημένη κωδικοποίηση, που σημαίνει ότι ο πελάτης δεν θα γνωρίζει το μέγεθος των προτέρων (ως εκ τούτου δεν θα εμφανίσει «x% γίνεται» κατά τη λήψη ενός αρχείου).


Από την άλλη πλευρά, αν περιμένετε το σενάριο σας να τρέχει για ένα τραγικό βαθμό (20+ δευτερόλεπτα), μπορεί να χρειαστεί να στείλει κάποια δεδομένα (χώροι, για παράδειγμα) για να κρατήσει το πρόγραμμα περιήγησης από το χρονοδιάγραμμα από τη σύνδεση. Ο τρόπος για να γίνει αυτό είναι να χειραγωγήσουν `location.hash`, όταν ενημερώσεις AJAX οδηγήσει σε μια αλλαγή κατάστασης που θα θέλατε να έχουν μια διακριτική URL. Για παράδειγμα, αν η διεύθυνση URL της σελίδας σας είναι:



> 
> <http://example.com/>
> 
> 
> 


Αν μια πλευρά του πελάτη λειτουργία εκτελείται αυτόν τον κωδικό:



```
// AJAX code to display the "foo" state goes here.

location.hash = 'foo';

```

Στη συνέχεια, η διεύθυνση URL που εμφανίζεται στο πρόγραμμα περιήγησης θα πρέπει να ενημερώνεται για:



> 
> <http://example.com/#foo>
> 
> 
> 


Αυτό επιτρέπει στους χρήστες να σελιδοδείκτη το «foo» κατάσταση της σελίδας, και να χρησιμοποιήσετε το ιστορικό του προγράμματος περιήγησης για να περιηγηθείτε μεταξύ των κρατών.


Με αυτό το μηχανισμό στη θέση του, θα πρέπει στη συνέχεια να αναλύσει το τμήμα hash του URL στην πλευρά του πελάτη χρησιμοποιώντας την Javascript για να δημιουργήσει και να εμφανίσει την κατάλληλη αρχική κατάσταση, όπως αναγνωριστικά τμήμα (το τμήμα μετά το #) δεν αποστέλλονται με το υπηρέτης.


[Plugin hashchange Ben Alman του](http://benalman.com/projects/jquery-hashchange-plugin/) κάνει το τελευταίο παιχνιδάκι αν χρησιμοποιείτε jQuery. Εντάξει, έχω μιλήσει με τους ανωτέρους μου και αποφάσισαν ότι θα μπορούσε να είναι ΟΚ ότι δεν μπορείτε να κάνετε δεξί κλικ σε ένα στοιχείο μενού και επιλέξτε «Άνοιγμα σε νέο παράθυρο». Εάν η απαίτηση αυτή πέσει, τότε δεν είμαι υποχρεωμένη να `<a>`στοιχεία για τις συνδέσεις. Με την Javascript μπορώ να μετατρέψει τα πάντα σε ένα σύνδεσμο. Έτσι, θα μπορείτε να επιλέξετε, ~~pikachoo~~ `<table>` !


Yap, είναι μια αίρεση, αλλά λειτουργεί. Πιο συγκεκριμένα, είναι η μόνη δομή που μπορώ να σκεφτώ ότι μπορεί να κάνει όλα τα ακόλουθα ταυτόχρονα:


* Κέντρο κείμενο οριζόντια και κάθετα?
* Τεντώστε στα περιεχόμενα οριζόντια και κάθετα?
* Δεν τυλίξτε στην επόμενη γραμμή, όταν τα στοιχεία αρχίζουν να υπερχείλισης.


Οτιδήποτε άλλο που μπορεί να κάνει το ίδιο μάλλον θα είναι πιο convulted ούτως ή άλλως. Και πριν κάποιος έχει την ιδέα - όχι, δεν χρειάζεται υποστήριξη των μηχανών αναζήτησης. Είναι μια εσωτερική εφαρμογή web. Θα ήταν πολύ κακό αν η Google θα μπορούσε δείκτης που ... Αν ψάχνετε για την αλληλεπίδραση που αντιμετωπίζουν χρήστη, ραβδί με xml. Έχει περισσότερη υποστήριξη, κατανόηση, και τη γενική αποδοχή του παρόντος. Αν είναι εσωτερικά, θα έλεγα ότι προσκρουστήρες πρωτόκολλο είναι μια μεγάλη ιδέα.


Ίσως σε μερικά χρόνια, καθώς περισσότερα εργαλεία για να βγει να υποστηρίξει ρυθμιστικά πρωτόκολλο, στη συνέχεια, να αρχίσει να ψάχνει προς αυτή την κατεύθυνση για μια δημόσια api επένδυση. Μέχρι τότε ... [JSON](http://en.wikipedia.org/wiki/JSON) ;