<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>
το angularjs $ http.post () δεν στέλνει δεδομένα
<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>
<p>δεν είναι σούπερ ξεκάθαρο παραπάνω, αλλά εάν λαμβάνετε το αίτημα σε php μπορείτε να χρησιμοποιήσετε:</p><p><code>$params = json\_decode(file\_get\_contents('php://input'),true);</code></p><p>για πρόσβαση σε πίνακα σε php από ένα post του angularjs.</p>
<p>μπορείτε να ορίσετε τον προεπιλεγμένο "τύπο περιεχομένου" ως εξής:</p><pre><code>$http.defaults.headers.post["content-type"] = "application/x-www-form-urlencoded"; </code></pre><p>σχετικά με τη μορφή <code>data</code>:</p><blockquote> <p>οι μέθοδοι $ http.post και $ http.put δέχονται οποιαδήποτε τιμή αντικειμένου javascript (ή μια συμβολοσειρά) ως την παράμετρο δεδομένων τους. εάν τα δεδομένα είναι αντικείμενο javascript, θα μετατραπούν από προεπιλογή σε μια συμβολοσειρά json.</p> </blockquote><p>προσπαθήστε να χρησιμοποιήσετε αυτήν την παραλλαγή</p><pre><code>function senddata($scope) { $http({ url: 'request-url', method: "post", data: { 'message' : message } }) .then(function(response) { // success }, function(response) { // optional // failed }); } </code></pre>
<p>είχα ένα παρόμοιο ζήτημα και αναρωτιέμαι αν αυτό μπορεί να είναι χρήσιμο: <a href="https://stackoverflow.com/a/11443066">https://stackoverflow.com/a/11443066</a> </p><pre><code>var xsrf = $.param({fkey: "key"}); $http({ method: 'post', url: url, data: xsrf, headers: {'content-type': 'application/x-www-form-urlencoded'} }) </code></pre><p>χαιρετισμοί,</p>
<p>μου αρέσει να χρησιμοποιώ μια λειτουργία για τη μετατροπή αντικειμένων σε post-params.</p><pre><code>myobject = {'one':'1','two':'2','three':'3'} object.toparams = function objecttoparams(obj) { var p = []; for (var key in obj) { p.push(key + '=' + encodeuricomponent(obj[key])); } return p.join('&amp;'); }; $http({ method: 'post', url: url, data: object.toparams(myobject), headers: {'content-type': 'application/x-www-form-urlencoded'} }) </code></pre>
<p>αυτό έχει τελικά αντιμετωπιστεί σε γωνιακή 1.4 χρησιμοποιώντας <strong> $ httpparamserializerjqlike </strong></p><p>δείτε <a href="https://github.com/angular/angular.js/issues/6039">https://github.com/angular/angular.js/issues/6039</a> </p><pre><code>.controller('myctrl', function($http, $httpparamserializerjqlike) { $http({ method: 'post', url: baseurl, data: $httpparamserializerjqlike({ "user":{ "email":"wahxxx@gmail.com", "password":"123456" } }), headers: 'content-type': 'application/x-www-form-urlencoded' })}) </code></pre>
<p>χρησιμοποιώ <a href="http://api.jquery.com/jquery.param/">jquery param</a> με <a href="https://docs.angularjs.org/api/ng/service/$http#post">angularjs post</a> requrest. ακολουθεί ένα παράδειγμα ... να δημιουργήσετε μια ενότητα εφαρμογών angularjs, όπου το <code>myapp</code> ορίζεται με <code>ng-app</code> στον κώδικα html.</p><pre><code>var app = angular.module('myapp', []); </code></pre><p>τώρα, ας δημιουργήσουμε έναν ελεγκτή σύνδεσης και ένα μήνυμα ηλεκτρονικού ταχυδρομείου και έναν κωδικό πρόσβασηςpost.</p><pre><code>app.controller('logincontroller', ['$scope', '$http', function ($scope, $http) { // default post header $http.defaults.headers.post['content-type'] = 'application/x-www-form-urlencoded;charset=utf-8'; // send login data $http({ method: 'post', url: 'https://example.com/user/login', data: $.param({ email: $scope.email, password: $scope.password }), headers: {'content-type': 'application/x-www-form-urlencoded'} }).success(function (data, status, headers, config) { // handle success things }).error(function (data, status, headers, config) { // handle error things }); }]); </code></pre><p>δεν μου αρέσει να εξαπλώνω τον κώδικα, είναι αρκετά απλό να καταλάβω :) σημειώστε ότι το <code>param</code> προέρχεται από το jquery, οπότε πρέπει να εγκαταστήσετε τόσο το jquery όσο και το angularjs για να το λειτουργήσει. ακολουθεί ένα στιγμιότυπο οθόνης.</p><p><img src="https://i.stack.imgur.com/stv5a.png" alt="enter image description here"></p><p>ελπίζω αυτό να είναι χρήσιμο. ευχαριστώ!</p>
<p>είχα το ίδιο πρόβλημα με τους δρομολογητές angularjs και node.js + express 4 +</p><p>ο δρομολογητής αναμένει τα δεδομένα από το αίτημα της ταχυδρομικής υπηρεσίας στο σώμα. αυτό το σώμα ήταν πάντα άδειο αν ακολουθούσα το παράδειγμα από angular έγγραφα</p><p>σημείωση 1</p><pre><code>$http.post('/someurl', {msg:'hello word!'}) </code></pre><p>αλλά αν το χρησιμοποίησα στα δεδομένα</p><p>σημείωση 2</p><pre><code>$http({ withcredentials: false, method: 'post', url: yoururl, headers: {'content-type': 'application/x-www-form-urlencoded'}, data: postdata }); </code></pre><p>επεξεργασία 1:</p><p>διαφορετικά, ο δρομολογητής node.js θα περιμένει τα δεδομένα στο req.body εάν ​​χρησιμοποιείται η συμβολική τιμή 1:</p><pre><code>req.body.msg </code></pre><p>το οποίο στέλνει επίσης τις πληροφορίες ως ωφέλιμο φορτίο json. αυτό είναι καλύτερο σε ορισμένες περιπτώσεις όπου έχετε συστοιχίες σε json σας και x-www-μορφή-urlencoded θα δώσει κάποια προβλήματα.</p><p>δούλεψε. ελπίζω ότι βοηθάει.</p>
<p>σε αντίθεση με την jquery και για λόγους πεντανίας, angular χρησιμοποιεί μορφή json για post δεδομένα <em>μεταφορά</em> από πελάτη στον διακομιστή (jquery ισχύει x-www-μορφή -εκκινηθεί πιθανώς, αν και jquery και angular χρησιμοποιεί json για δεδομένα imput). επομένως, υπάρχουν δύο μέρη του προβλήματος: στο τμήμα του client js και στο τμήμα του διακομιστή σας. έτσι χρειάζεστε:</p><ol> <li> <p>βάλτε js angular μέρος πελάτη όπως αυτό:</p> <pre><code>$http({ method: 'post', url: 'request-url', data: {'message': 'hello world'} }); </code></pre></li> </ol><p><strong>και</strong></p><ol start="2"> <li> <p>γράψτε στο τμήμα του διακομιστή σας για να λαμβάνετε δεδομένα από έναν πελάτη (αν είναι php).</p> <pre><code> $data = file\_get\_contents("php://input"); $datajsondecode = json\_decode($data); $message = $datajsondecode-&gt;message; echo $message; //'hello world' </code></pre></li> </ol><p>σημείωση: το $ \_post δεν θα λειτουργήσει!</p><p>η λύση λειτουργεί για μένα ωραία, ελπίζω, και για σας.</p>
<p>για να στείλετε δεδομένα μέσω post methode με <code>$http</code> των angularjs πρέπει να αλλάξετε</p><p><code>data: "message=" + message</code>, με <code>data: $.param({message:message})</code></p>
<p>για να αξιοποιήσετε την απάντηση @ felipe-miosso:</p><ol> <li>κατεβάστε το ως μονάδα angularjs από <a href="https://gist.github.com/thinkadoo/9362570/raw/92c2fffb396a2c1e4a85becb094fe87ab18d0efc/angular-post-fix.js">εδώ</a> ,</li> <li>εγκαταστήστε το</li> <li> <p>προσθέστε την στην αίτησή σας:</p> <pre><code>var app = angular.module('my\_app', [ ... , 'httppostfix']); </code></pre></li> </ol>
<p>δεν έχω τη φήμη να σχολιάσω, αλλά σε απάντηση/προσθήκη στην απάντηση του don f:</p><p><code>$params = json\_decode(file\_get\_contents('php://input'));</code></p><p>μια δεύτερη παράμετρος <code>true</code> πρέπει να προστεθεί στη συνάρτηση <code>json\_decode</code> για να επιστρέψει σωστά μια συσυνδετική διάταξη:</p><p><code>$params = json\_decode(file\_get\_contents('php://input'), true);</code></p>
<p>αυτός ο κώδικας λύνει το θέμα για μένα. πρόκειται για μια λύση σε επίπεδο εφαρμογής:</p><pre><code>modulename.config(['$httpprovider', function($httpprovider) { $httpprovider.defaults.transformrequest.push(function(data) { var requeststr; if (data) { data = json.parse(data); for (var key in data) { if (requeststr) { requeststr += "&amp;" + key + "=" + data[key]; } else { requeststr = key + "=" + data[key]; } } } return requeststr; }); $httpprovider.defaults.headers.post["content-type"] = "application/x-www-form-urlencoded"; } ]); </code></pre>
<p>προσθέστε αυτό στο αρχείο js:</p><pre><code>$http.defaults.headers.post["content-type"] = "application/x-www-form-urlencoded"; </code></pre><p>και προσθέστε αυτό στο αρχείο διακομιστή σας:</p><pre><code>$params = json\_decode(file\_get\_contents('php://input'), true); </code></pre><p>αυτό θα πρέπει να λειτουργήσει.</p>
<p>αυτό είναι πιθανώς μια καθυστερημένη απάντηση αλλά νομίζω ότι ο πιο σωστός τρόπος είναι να χρησιμοποιήσετε το ίδιο κομμάτι γωνιακής χρήσης κώδικα όταν κάνετε ένα "get" αίτημα χρησιμοποιώντας σας <code>$httpparamserializer</code> θα πρέπει να το εγχύσετε στον ελεγκτή σας έτσι μπορείτε απλά να κάνετε τα εξής χωρίς να έχετε να χρησιμοποιήσει καθόλου jquery, <code>$http.post(url,$httpparamserializer({param:val}))</code></p><pre><code>app.controller('ctrl',function($scope,$http,$httpparamserializer){ $http.post(url,$httpparamserializer({param:val,secondparam:secondval})); } </code></pre>
<p>στην περίπτωσή μου, επιλύω το πρόβλημα όπως αυτό:</p><pre><code>var deferred = $q.defer(); $http({ method: 'post', url: 'myuri', data: $.param({ param1: 'blablabla', param2: json.stringify(objjson) }), headers: { 'content-type': 'application/x-www-form-urlencoded' } }).then( function(res) { console.log('succes !', res.data); deferred.resolve(res.data); }, function(err) { console.log('error...', err); deferred.resolve(err); } ); return deferred.promise; </code></pre><p>πρέπει να χρησιμοποιήσετε το json.stringify για κάθε param που περιέχει ένα αντικείμενο json και στη συνέχεια να δημιουργήσετε το αντικείμενο δεδομένων σας με "$ .param" :-)</p><p>σημείωση: το "objjson" μου είναι ένα αντικείμενο json που περιέχει πίνακα, ακέραιο, συμβολοσειρά και περιεχόμενο html. το συνολικό μέγεθος του είναι&gt; 3500 χαρακτήρες.</p>
<p>επίσης αντιμετώπισα παρόμοιο πρόβλημα και κάναμε κάτι τέτοιο και αυτό δεν λειτούργησε. ο ελεγκτής μου άνοιξη δεν μπόρεσε να διαβάσει την παράμετρο δεδομένων.</p><pre><code>var paramsval={data:'"id":"1"'}; $http.post("request url", {params: paramsval}); </code></pre><p>αλλά διαβάζοντας αυτό το φόρουμ και το έγγραφο api, προσπάθησα με αυτόν τον τρόπο και αυτό μου δούλεψε. αν κάποιος έχει παρόμοιο πρόβλημα, μπορείτε να δοκιμάσετε και τον παρακάτω τρόπο.</p><pre><code>$http({ method: 'post', url: "request url", params: paramsval, headers: {'content-type': 'application/x-www-form-urlencoded;charset=utf-8'} }); </code></pre><p>ελέγξτε <a href="https://docs.angularjs.org/api/ng/service/">https://docs.angularjs.org/api/ng/service/</a> $ http # post για το τι κάνει param config. {data: '' id ':' 1 ''} - χάρτης συμβολοσειρών ή αντικειμένων που θα μετατραπούν σε διεύθυνση url; data = "id: 1"</p>
<p>ξέρω ότι έχει <strong> <em> αποδεκτή </em> </strong> απάντηση. αλλά, μετά μπορεί να βοηθήσει τους μελλοντικούς αναγνώστες, αν η απάντηση δεν τους ταιριάζει για οποιοδήποτε λόγο.</p><p>το γωνιακό δεν κάνει ajax ίδιο με το jquery. ενώ προσπάθησα να ακολουθήσω τον οδηγό για να τροποποιήσω το γωνιακό <code>$httpprovider</code>, αντιμετώπισα άλλα προβλήματα. π.χ. χρησιμοποιώ τον κωδικοποιητή στον οποίο η λειτουργία <code>$this-&gt;input-&gt;is\_ajax\_request()</code> απέτυχε πάντα (η οποία γράφτηκε από άλλο προγραμματιστή και χρησιμοποιήθηκε παγκοσμίως, έτσι δεν μπορεί να αλλάξει) λέγοντας ότι αυτό δεν ήταν πραγματικό ajax αίτημα.</p><p>για να το λύσω, πήρα βοήθεια από <a href="https://developer.mozilla.org/en-us/docs/mozilla/javascript\_code\_modules/promise.jsm/deferred">αναβαλλόμενη υπόσχεση</a> . το έχω δοκιμάσει στο firefox, και το ie9 και λειτούργησε.</p><p>έχω την ακόλουθη συνάρτηση που ορίζεται <strong> <em> εκτός </em> </strong> οποιουδήποτε από τους γωνιακούς κώδικες. αυτή η λειτουργία κάνει τακτική jquery ajax κλήση και επιστρέφει το αντικείμενο αναβολής/υποσχέσεως (ακόμα μαθαίνω).</p><pre><code>function getjqueryajax(url, obj){ return $.ajax({ type: 'post', url: url, cache: true, data: obj }); } </code></pre><p>στη συνέχεια, καλώ τον γωνιακό κώδικα χρησιμοποιώντας τον ακόλουθο κώδικα. λάβετε υπόψη ότι πρέπει να ενημερώσετε το <code>$scope</code> με μη αυτόματο τρόπο χρησιμοποιώντας το <code>$scope.$apply()</code>.</p><pre><code> var data = { media: "video", scope: "movies" }; var rpromise = getjqueryajax("mycontroller/getmetypes" , data); rpromise.success(function(response){ console.log(response); $scope.$apply(function(){ $scope.testdata = json.parse(response); console.log($scope.testdata); }); }).error(function(){ console.log("ajax failed!"); }); </code></pre><hr><p>αυτό μπορεί να μην είναι η τέλεια απάντηση, αλλά μου επέτρεψε να χρησιμοποιήσω jquery ajax κλήσεις με γωνιακή και μου επέτρεψε να ενημερώσω το <code>$scope</code>.</p>
<p>αν χρησιμοποιείτε <strong> γωνιακά&gt; = 1.4 </strong>, εδώ είναι η καθαρότερη λύση χρησιμοποιώντας <a href="https://docs.angularjs.org/api/ng/service/$httpparamserializerjqlike">ο σειριοποιητής που παρέχεται από το γωνιακό</a> :</p><pre><code>angular.module('yourmodule') .config(function ($httpprovider, $httpparamserializerjqlikeprovider){ $httpprovider.defaults.transformrequest.unshift($httpparamserializerjqlikeprovider.$get()); $httpprovider.defaults.headers.post['content-type'] = 'application/x-www-form-urlencoded; charset=utf-8'; }); </code></pre><p>και τότε μπορείτε απλά να το κάνετε αυτό οπουδήποτε στην εφαρμογή σας:</p><pre><code>$http({ method: 'post', url: '/requesturl', data: { param1: 'value1', param2: 'value2' } }); </code></pre><p>και θα επεξεργαστεί σωστά τα δεδομένα ως <code>param1=value1&amp;param2=value2</code> και θα τα στείλει στο <code>/requesturl</code> με την κεφαλίδα <code>application/x-www-form-urlencoded; charset=utf-8</code> τύπου περιεχομένου όπως κανονικά αναμένεται με τα ζητήματα post στα τελικά σημεία.</p><p><strong> tl · dr </strong></p><p>κατά τη διάρκεια της έρευνάς μου διαπίστωσα ότι η απάντηση σε αυτό το πρόβλημα έρχεται σε πολλές διαφορετικές γεύσεις. μερικοί είναι πολύ περίπλοκοι και εξαρτώνται από προσαρμοσμένες λειτουργίες, μερικοί εξαρτώνται από το jquery και μερικοί είναι ελλιπείς υποδεικνύοντας ότι χρειάζεται μόνο να ορίσετε την επικεφαλίδα.</p><p>αν ορίσετε ακριβώς την κεφαλίδα <code>content-type</code>, στο τελικό σημείο θα δείτε τα δεδομέναpost, αλλά δεν θα είναι στην τυποποιημένη μορφή, επειδή εκτός αν δώσετε μια συμβολοσειρά ως <code>data</code> ή χειροκίνητα σειριοποιήσετε το αντικείμενο δεδομένων σας, όλα θα είναι σειριοποιημένα ως json από προεπιλογή και μπορεί να ερμηνεύονται λανθασμένα στο τελικό σημείο.</p><p>π.χ. εάν ο σωστός σειριοποιητής δεν είχε οριστεί στο παραπάνω παράδειγμα, θα μπορούσε να θεωρηθεί στο τελικό σημείο ως:</p><pre><code>{"param1":"value1","param2":"value2"} </code></pre><p>και αυτό μπορεί να οδηγήσει σε μη αναμενόμενη ανάλυση, π.χ. το asp.net το αντιμετωπίζει ως όνομα παραμέτρου <code>null</code>, με <code>{"param1":"value1","param2":"value2"}</code> ως τιμή. ή το fiddler ερμηνεύει το αντίστροφο, με <code>{"param1":"value1","param2":"value2"}</code> ως όνομα παραμέτρου και <code>null</code> ως τιμή.</p>
<p>εάν χρησιμοποιείτε το php, αυτό είναι ένας εύκολος τρόπος πρόσβασης σε έναν πίνακα στο php από ένα post του angularjs.</p><pre><code>$params = json\_decode(file\_get\_contents('php://input'),true); </code></pre>
<blockquote> <p>χρησιμοποιώ το asp.net wcf webservices με γωνιακό js και κάτω από τον κώδικα που δουλεύει:</p> </blockquote><pre><code> $http({ contenttype: "application/json; charset=utf-8",//required method: "post", url: '../../operation/service.svc/user\_forget', datatype: "json",//optional data:{ "uid\_or\_phone": $scope.forgettel, "user\_email": $scope.forgetemail }, async: "isasync"//optional }).success( function (response) { $scope.userforgeterror = response.d; }) </code></pre><p>ελπίζω ότι βοηθάει.</p>
<p>δεν βρήκατε ένα πλήρες απόσπασμα κώδικα για τον τρόπο χρήσης της μεθόδου $ http.post για την αποστολή δεδομένων στο διακομιστή και γιατί δεν λειτούργησε σε αυτήν την περίπτωση.</p><p>επεξηγήσεις για το απόσπασμα κώδικα παρακάτω ...</p><ol> <li>χρησιμοποιώ τη λειτουργία jquery $ .param για τη σειριοποίηση των δεδομένων json σε δεδομένα μετάδοσης www</li> <li> <p>ρύθμιση του τύπου περιεχομένου στη μεταβλητή config που θα περάσει μαζί με το αίτημα του angularjs $ http.post που καθοδηγεί τον διακομιστή ότι στέλνουμε δεδομένα σε μορφή μορφής www.</p> </li> <li> <p>παρατηρήστε τη μέθοδο $ htttp.post, στην οποία στέλνω την 1η παράμετρο ως url, την 2η παράμετρο ως δεδομένα (σειριακή) και την 3η παράμετρο ως config.</p> </li> </ol><p>ο υπόλοιπος κώδικας είναι αυτογνωστός.</p><pre><code>$scope.senddata = function () { // use $.param jquery function to serialize data from json var data = $.param({ fname: $scope.firstname, lname: $scope.lastname }); var config = { headers : { 'content-type': 'application/x-www-form-urlencoded;charset=utf-8;' } } $http.post('/serverrequest/postdataresponse', data, config) .success(function (data, status, headers, config) { $scope.postdataresponse = data; }) .error(function (data, status, header, config) { $scope.responsedetails = "data: " + data + "&lt;hr /&gt;status: " + status + "&lt;hr /&gt;headers: " + header + "&lt;hr /&gt;config: " + config; }); }; </code></pre><p>κοιτάξτε το παράδειγμα κώδικα <a href="http://techfunda.com/examples/show/565">$ http.post μέθοδος εδώ</a> .</p>
<p>παρόμοια με την προτεινόμενη μορφή εργασίας του op και την απάντηση του denison, εκτός από τη χρήση του <code>$http.post</code> αντί του <code>$http</code> και εξακολουθεί να εξαρτάται από το jquery.</p><p>το καλό πράγμα για τη χρήση του jquery είναι ότι σύνθετα αντικείμενα περνούν σωστά. κατά τη μη αυτόματη μετατροπή σε παραμέτρους διεύθυνσης url που ενδέχεται να παρεμποδίσουν τα δεδομένα.</p><pre><code>$http.post( 'request-url', jquery.param( { 'message': message } ), { headers: { 'content-type': 'application/x-www-form-urlencoded' } }); </code></pre>
<p>είχα το ίδιο πρόβλημα με την ρητή .. για να επιλύσετε θα πρέπει να χρησιμοποιήσετε bodyparser για να αναλύσετε json αντικείμενα πριν από την αποστολή http requests ..</p><pre><code>app.use(bodyparser.json()); </code></pre>
<p>μόλις ενημερώθηκε από το γωνιακό 1,2 έως 1,3, βρήκαν κάποιο πρόβλημα στον κώδικα. η μετατροπή ενός πόρου θα οδηγήσει σε έναν ατελείωτο βρόχο γιατί (νομίζω) από την υποσχέση $ που κατέχει και πάλι το ίδιο αντικείμενο. ίσως θα βοηθήσει κάποιον ...</p><p>θα μπορούσα να το διορθώσω από:</p><pre><code>[...] /** * 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; angular.foreach(obj, function(value, name) { + if(name.indexof("$promise") != -1) { + return; + } value = obj[name]; if (value instanceof array) { for (i = 0; i &lt; value.length; ++i) { [...] </code></pre>
<p>όταν έκανα αυτό το πρόβλημα, η παράμετρος που δημοσιεύσαμε ήταν μια σειρά από αντικείμενα αντί για ένα απλό αντικείμενο.</p>
<p>δεν είναι λάθος της γωνίας. το angular έχει σχεδιαστεί για να εργάζεται στον κόσμο της json. έτσι, όταν η υπηρεσία http http στέλνει αίτημα ajax, στέλνει όλα τα δεδομένα σας ως ωφέλιμο φορτίο και όχι ως δεδομένα φόρμας ώστε να μπορεί να το χειριστεί η εφαρμογή backend. αλλά το jquery κάνει κάποια πράγματα εσωτερικά. δίνετε εντολή στη μονάδα $ ajax του jquery να δεσμεύει τα δεδομένα μορφής ως json αλλά πριν από την αποστολή αιτήματος ajax, σειριοποίησε το json και πρόσθεσε την κεφαλίδα <code>application/x-www-form-urlencoded</code>. με αυτόν τον τρόπο η εφαρμογή backend σας μπορεί να λάβει δεδομένα φόρμας με τη μορφή post παραμέτρων και όχι json.</p><p>αλλά μπορείτε να τροποποιήσετε την προεπιλεγμένη συμπεριφορά της γωνιακής $ http υπηρεσίας από</p><ol> <li>προσθήκη κεφαλίδας</li> <li>serializing json</li> </ol><p>$ httpparamserializerjqlike είναι μια ενσωματωμένη υπηρεσία της γωνίας η οποία σειριοποιεί json με τον ίδιο τρόπο όπως το $ .param του jquery.</p><pre><code>$http({ method: 'post', url: 'request-url', data: $httpparamserializerjqlike(json-form-data), headers: { 'content-type': 'application/x-www-form-urlencoded; charset=utf-8;' } }); </code></pre><p>εάν χρειάζεστε πρώτα ένα plugin για τη σειριοποίηση δεδομένων μορφής σε json, χρησιμοποιήστε αυτό το --- <a href="https://github.com/marioizquierdo/jquery.serializejson">https://github.com/marioizquierdo/jquery.serializejson</a> </p>
<p>απλά τοποθετήστε τα δεδομένα που θέλετε να στείλετε ως δεύτερη παράμετρος:</p><pre><code>$http.post('request-url', message); </code></pre><p>μια άλλη μορφή που λειτουργεί επίσης είναι:</p><pre><code>$http.post('request-url', { params: { paramname: value } }); </code></pre><p>βεβαιωθείτε ότι η <code>paramname</code> αντιστοιχεί ακριβώς στο όνομα της παραμέτρου της συνάρτησης που καλείτε.</p><p>πηγή: <a href="https://docs.angularjs.org/api/ng/service/$http#post">μέθοδος συντόμευσης για τη μετάβαση στο angularjs</a> </p>
<p>το έχω λύσει με τους παρακάτω κώδικες:</p><p>σελίδα πελάτη (js):</p><pre><code> $http({ url: me.serverpath, method: 'post', data: data, headers: { 'content-type': 'application/x-www-form-urlencoded' }, }). success(function (serverdata) { console.log("serverdata:", serverdata); ...... </code></pre><p>παρατηρήστε ότι τα δεδομένα είναι ένα αντικείμενο.</p><p>στο διακομιστή (asp.net mvc):</p><pre><code>[allowcrosssitejson] public string api() { var data = jsonconvert.deserializeobject&lt;agentrequest&gt;(request.form[0]); if (data == null) return "null request"; var bl = page.bl = new core(this); return data.methodname; } </code></pre><p>και "allowcrosssitejsonattribute" είναι απαραίτητη για αιτήσεις cross domain:</p><pre><code>public class allowcrosssitejsonattribute : actionfilterattribute { public override void onactionexecuting(actionexecutingcontext filtercontext) { filtercontext.requestcontext.httpcontext.response.addheader("access-control-allow-origin", "*"); base.onactionexecuting(filtercontext); } } </code></pre><p>ελπίζω ότι αυτό ήταν χρήσιμο.</p>
<p>έγραψα μια μικρή <strong>βοηθητική συνάρτηση php</strong> που επιτρέπει και τους δύο τύπους παραμέτρων εισόδου:</p><pre><code>function getargs () { if ($input = file\_get\_contents('php://input') &amp;&amp; $input\_params = json\_decode($input,true)) return $input\_params + $\_post + $\_get; return $\_post + $\_get; } </code></pre><p>χρήση:</p><pre><code>&lt;?php include("util.php"); # above code $request = getargs(); $myvar = ""; if (isset($request['myvar'])) $myvar = $request['myvar']; ?&gt; </code></pre><p>επομένως, δεν απαιτούνται αλλαγές στη javascript σας.</p>
<p>είχα αυτό το πρόβλημα, το ζήτημα ήταν ότι δεν ήμουν σε θέση να λάβω τα δεδομένα κατά την ανάρτηση χρησιμοποιώντας την παραπάνω κεφαλίδα, δηλ.</p><pre><code>headers: { 'accept': 'application/json', 'content-type': 'application/x-www-form-urlencoded' } </code></pre><p>ενώ χρησιμοποιούσαμε jquery ajax παίρναμε συνήθως δεδομένα στο <strong>response.body</strong> στο backend server, αλλά ενώ υλοποιούσαμε το angular ajax τα δεδομένα δεν έρχονταν στο response.body αντ 'αυτού έρχονταν κάτω</p><pre><code>request.getparametermap.keyset().iterator().next() </code></pre>
<p>βρήκαμε την απλή λύση</p><p> <a href="http://jasonwatmore.com/post/2014/04/18/post-a-simple-string-value-from-angularjs-to-net-web-api">http://jasonwatmore.com/post/2014/04/18/post-a-simple-string-value-from-angularjs-to-net-web-api</a> </p><pre><code>return $http.post(config.apiurl + '/example/processfile', '"' + filename + '"'); </code></pre>
<p>προτείνω απλώς μια εκσυγχρονισμένη έκδοση <a href="https://stackoverflow.com/a/20276775/1225328">@ απάντηση του felipemiosso</a> :</p><pre class="lang-js prettyprint-override"><code>.config(["$httpprovider", function ($httpprovider) { function buildkey(parentkey, subkey) { return parentkey + "[" + subkey + "]"; } function buildobject(key, value) { var object = {}; object[key] = value; return object; } function join(array) { return array.filter(function (entry) { return entry; }).join("&amp;"); } function arraytoquerystring(parentkey, array) { return join(array.map(function (value, subkey) { return toquerystring(buildobject(buildkey(parentkey, subkey), value)); })); } function objecttoquerystring(parentkey, object) { return join(object.keys(object).map(function (subkey) { return toquerystring(buildobject(buildkey(parentkey, subkey), object[subkey])); })); } function toquerystring(input) { return join(object.keys(input).map(function (key) { var value = input[key]; if (value instanceof array) { return arraytoquerystring(key, value); } else if (value instanceof object) { return objecttoquerystring(key, value); } else if (undefined !== value &amp;&amp; null !== value) { return encodeuricomponent(key) + "=" + encodeuricomponent(value); } else { return ""; } })); } function isquerystringeligible(input) { return null !== input &amp;&amp; "object" === typeof input &amp;&amp; "[object file]" !== string(input); } var interceptor = [function () { return { request: function (config) { if (0 &lt;= ["post", "put", "patch"].indexof(config.method.tolowercase()) &amp;&amp; isquerystringeligible(config.data)) { config.headers["content-type"] = "application/x-www-form-urlencoded;charset=utf-8"; config.data = toquerystring(config.data); } return config; } }; }]; $httpprovider.interceptors.push(interceptor); }]) </code></pre><p>es6 έκδοση:</p><pre class="lang-js prettyprint-override"><code>.config(["$httpprovider", function ($httpprovider) { "use strict"; const buildkey = (parentkey, subkey) =&gt; `${parentkey}[${subkey}]`; const buildobject = (key, value) =&gt; ({ [key]: value }); const join = (array) =&gt; array.filter((entry) =&gt; entry).join("&amp;"); const arraytoquerystring = (parentkey, array) =&gt; join(array.map((value, subkey) =&gt; toquerystring(buildobject(buildkey(parentkey, subkey), value)))); const objecttoquerystring = (parentkey, object) =&gt; join(object.keys(object).map((subkey) =&gt; toquerystring(buildobject(buildkey(parentkey, subkey), object[subkey])))); const toquerystring = (input) =&gt; join(object.keys(input).map((key) =&gt; { const value = input[key]; if (value instanceof array) { return arraytoquerystring(key, value); } else if (value instanceof object) { return objecttoquerystring(key, value); } else if (undefined !== value &amp;&amp; null !== value) { return `${encodeuricomponent(key)}=${encodeuricomponent(value)}`; } else { return ""; } })); const isquerystringeligible = (input) =&gt; null !== input &amp;&amp; "object" === typeof input &amp;&amp; "[object file]" !== string(input); const interceptor = [() =&gt; ({ request(config) { if (0 &lt;= ["post", "put", "patch"].indexof(config.method.tolowercase()) &amp;&amp; isquerystringeligible(config.data)) { config.headers["content-type"] = "application/x-www-form-urlencoded;charset=utf-8"; config.data = toquerystring(config.data); } return config; } })]; $httpprovider.interceptors.push(interceptor); }]) </code></pre>
<p>χρησιμοποιήστε αυτόν τον τρόπο. δεν χρειάζεται να γράφετε τόσα πολλά</p><pre><code> isauth = $http.post("yr url", {username: username, password: password}); </code></pre><p>και στο πίσω άκρο nodejs</p><pre><code>app.post("yr url",function(req,resp) { var username = req.body.username||req.param('username'); var password = req.body.password||req.param('password'); } </code></pre><p>ελπίζω αυτό να βοηθήσει</p>
<p>χρησιμοποιώντας πολύ απλή μέθοδο, μπορούμε να ακολουθήσουμε αυτό:</p><pre><code> $http({ url : "submit\_form\_adv.php", method : 'post', headers: {'content-type': 'application/x-www-form-urlencoded'}, transformrequest: function(obj) { var str = []; for(var p in obj) str.push(encodeuricomponent(p)+' = '+encodeuricomponent(obj[p])); return str.join('&amp;'); }, data : {sample\_id : 100, sample\_name: 'abin john'}, }).success(function(data, status, headers, config) { }).error(function(ata, status, headers, config) { }); </code></pre>