put εναντίον post σε rest
<p>σύμφωνα με το πρότυπο http/1.1:</p><blockquote> <p>η μέθοδος <strong><code>post</code>name \_</strong> χρησιμοποιείται για να ζητήσει από τον διακομιστή προέλευσης να αποδεχθεί την οντότητα που περιλαμβάνεται στο αίτημα ως νέος υποκείμενος του πόρου που προσδιορίζεται από τον <code>request-uri</code> στο <code>request-line</code></p> </blockquote><p>με άλλα λόγια, το <code>post</code>χρησιμοποιείται για να <strong>δημιουργία</strong>.</p><blockquote> <p>η μέθοδος <strong><code>put</code>name \_</strong> ζητά την αποθήκευση της συνημμένης οντότητας κάτω από τον παρεχόμενο <code>request-uri</code>. εάν ο <code>request-uri</code> αναφέρεται σε έναν ήδη υπάρχοντα πόρο, η συνημμένη οντότητα θα πρέπει να θεωρηθεί ως τροποποιημένη έκδοση εκείνης που υπάρχει στον διακομιστή προέλευσης. εάν ο <code>request-uri</code> δεν υποδεικνύει έναν υπάρχοντα πόρο και το uri μπορεί να οριστεί ως νέα πηγή από τον αιτούντα παράγοντα χρήστη, ο διακομιστής προέλευσης μπορεί να δημιουργήσει τον πόρο με αυτό το uri. "</p> </blockquote><p>δηλαδή, το <code>put</code>χρησιμοποιείται για να <strong>δημιουργία ή ενημέρωση</strong>.</p><p>έτσι, ποιο πρέπει να χρησιμοποιηθεί για τη δημιουργία ενός πόρου; ή κάποιος πρέπει να υποστηρίξει και τα δύο;</p>
<p><strong> συνολικά: </strong></p><p>τόσο το put όσο και το post μπορούν να χρησιμοποιηθούν για τη δημιουργία.</p><p>πρέπει να ρωτήσετε "σε τι εκτελείτε τη δράση;" να διακρίνετε τι πρέπει να χρησιμοποιείτε. ας υποθέσουμε ότι σχεδιάζετε ένα api για να κάνετε ερωτήσεις. εάν θέλετε να χρησιμοποιήσετε το post τότε θα το κάνετε σε μια λίστα ερωτήσεων. εάν θέλετε να χρησιμοποιήσετε το put τότε θα το κάνετε αυτό σε μια συγκεκριμένη ερώτηση.</p><p><strong> μεγάλη και οι δύο μπορούν να χρησιμοποιηθούν, έτσι ποιο πρέπει να χρησιμοποιήσω στο restful σχεδιασμό μου: </strong></p><p>δεν χρειάζεται να υποστηρίζετε τόσο το put όσο και το post.</p><p>το οποίο χρησιμοποιείται παραμένει στο χέρι σας. αλλά θυμηθείτε να χρησιμοποιήσετε το σωστό, ανάλογα με το αντικείμενο που αναφέρετε στο αίτημα.</p><p>μερικές σκέψεις:</p><ul> <li>ονομάζετε ρητά τα αντικείμενα url που δημιουργείτε ή αφήστε το διακομιστή να αποφασίσει; εάν τους ονομάσετε τότε χρησιμοποιήστε put. εάν αφήσετε τον διακομιστή να αποφασίσει στη συνέχεια, χρησιμοποιήστε το post.</li> <li>put είναι idempotent, οπότε αν put ένα αντικείμενο δύο φορές, δεν έχει καμία επίδραση. αυτή είναι μια ιδιοκτησία της νίκαιας, οπότε θα μπορούσα να χρησιμοποιήσω το put όταν ήταν δυνατόν.</li> <li>μπορείτε να ενημερώσετε ή να δημιουργήσετε έναν πόρο με put με την ίδια διεύθυνση url αντικειμένου</li> <li>με το post μπορείτε να έχετε 2 αιτήματα που εισέρχονται ταυτόχρονα για τροποποιήσεις σε μια διεύθυνση url και μπορεί να ενημερώσουν διαφορετικά μέρη του αντικειμένου.</li> </ul><p><strong> ένα παράδειγμα: </strong></p><p> <a href="https://stackoverflow.com/questions/256349/what-are-the-best-common-restful-url-verbs-and-actions/256359#256359">έγραψα τα εξής ως μέρος μιας άλλης απάντησης σχετικά με το so</a> :</p><blockquote> <p><strong> post: </strong></p> <p>χρησιμοποιείται για την τροποποίηση και την ενημέρωση ενός πόρου</p> <pre><code>post /questions/&lt;existing\_question&gt; http/1.1 host: www.example.com/ </code></pre> <p>σημειώστε ότι το ακόλουθο είναι ένα σφάλμα:</p> <pre><code>post /questions/&lt;new\_question&gt; http/1.1 host: www.example.com/ </code></pre> <p>εάν η διεύθυνση url δεν έχει δημιουργηθεί ακόμη, δεν θα πρέπει να χρησιμοποιείτε το post για να το δημιουργήσετε ενώ καθορίζετε το όνομα. αυτό θα πρέπει να έχει ως αποτέλεσμα ένα σφάλμα 'πόρος δεν βρέθηκε' επειδή το <code>&lt;new\_question&gt;</code> δεν υπάρχει ακόμα. πρέπει πρώτα να τοποθετήσετε τον πόρο <code>&lt;new\_question&gt;</code> στον διακομιστή.</p> <p>θα μπορούσατε όμως να κάνετε κάτι τέτοιο για να δημιουργήσετε πόρους χρησιμοποιώντας post:</p> <pre><code>post /questions http/1.1 host: www.example.com/ </code></pre> <p>σημειώστε ότι σε αυτήν την περίπτωση το όνομα του πόρου δεν έχει καθοριστεί, η διαδρομή url των νέων αντικειμένων θα σας επιστραφεί.</p> <p><strong> σημειωση: </strong></p> <p>χρησιμοποιείται για τη δημιουργία ενός πόρου ή για την αντικατάστασή του. ενώ ορίσετε τους πόρους νέα διεύθυνση url.</p> <p>για έναν νέο πόρο:</p> <pre><code>put /questions/&lt;new\_question&gt; http/1.1 host: www.example.com/ </code></pre> <p>για να αντικαταστήσετε μια υπάρχουσα πηγή:</p> <pre><code>put /questions/&lt;existing\_question&gt; http/1.1 host: www.example.com/ </code></pre></blockquote>
Κάνατε πολύ καλή δουλειά στο να συνοψίσετε τι είναι φοβερό στο 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/). Όπως και άλλοι είπαν, ένας χώρος ονομάτων είναι αυτό που πρέπει να χρησιμοποιήσετε. Αν θέλετε να μείνετε με την τάξη σας, να δημιουργήσετε μια τάξη που έχει ένα ιδιωτικό κατασκευαστή, και προέρχονται από αυτό, για να κάνουν την πρόθεσή σας προφανής:



```
class NonConstructible { 
    NonConstructible();
};

class SuperUtils: NonConstructible {
    static void foo();
    // ...
    static std::vector<int> globalIDs;
    // ...
};

```






Εντάξει, τώρα ας εξετάσουμε το χώρο ονομάτων που είναι ο ένας και μοναδικός τρόπος για να γίνει αυτό:



```
namespace SuperUtils {
    void foo() {
        // ....
    }

    std::vector<int> globalIDs;
};

```

Μπορείτε να καλέσετε ότι η χρήση `SuperUtils::foo();`και στις δύο περιπτώσεις, αλλά ο χώρος ονομάτων έχει το πλεονέκτημα ότι σε ένα πεδίο, μπορείτε να χρησιμοποιήσετε τη δήλωση namespace και οδηγία να φέρει ορισμένα ή όλα τα μέλη στο τρέχον πεδίο εφαρμογής, έτσι ώστε να μπορείτε να τους αναφορά χωρίς τη χρήση `SuperUtils::`:



```
void superFunction() {
    using namespace SuperUtils;
    foo();
}

```

Αν και σε γενικές γραμμές ότι πρέπει να αποφευχθεί, μπορεί να είναι χρήσιμο όταν η μέθοδος χρησιμοποιεί αποκλειστικά πολλά πράγματα από SuperUtils, το οποίο στη συνέχεια μπορεί να βελτιώσει την αναγνωσιμότητα του κώδικα. Γνωρίζω τουλάχιστον ένα ζευγάρι πόρων. Πρώτον, υπάρχει ένα πολύ χρήσιμο άρθρο στο MSDN με τίτλο [Κρατήστε κώδικα σας να λειτουργεί με την αξιοπιστία χαρακτηριστικά του .NET Framework](http://msdn.microsoft.com/en-us/magazine/cc163716.aspx) .


Ο Chris Brumme είχε επίσης μια [θέση για τη φιλοξενία](http://blogs.msdn.com/cbrumme/archive/2004/02/21/77595.aspx) , όταν τα χαρακτηριστικά της αξιοπιστίας είχαν σχεδιαστεί. Αυτό μπορεί να δώσει μερικές χρήσιμες πληροφορίες υποβάθρου


Οι όροι αναζήτησης που μπορείτε να βρείτε χρήσιμες περιλαμβάνουν «High Availability» «CER» και «Περιορισμένη Περιφερειών Εκτέλεση».


Καλή τύχη! Πραγματικά διαθέσιμα κώδικας είναι πολύ δύσκολο τα πράγματα. :) LinkDemand απαιτεί ουσιαστικά τον κωδικό κλήσης για να έχουν το συγκεκριμένο δικαίωμα. Η ζήτηση, από την άλλη πλευρά, απαιτεί όχι μόνο την κλήση κώδικα για να έχουν το συγκεκριμένο δικαίωμα, αλλά και τον κώδικα που ονομάζεται τον κωδικό κλήσης και τον κωδικό που ονομάζεται ότι, και ούτω καθεξής, σε όλη τη διαδρομή μέχρι τη στοίβα (ή μέχρις ότου assert βρίσκεται? βλέπε παρακάτω).


LinkDemand μπορεί να επιβληθεί σε ΚΟΕ χρόνο μεταγλώττισης, γιατί αν το πρόγραμμα μεταγλώττισης JIT χτυπά μια δήλωση που καλεί μια μέθοδο με LinkDemand, μπορεί να προσδιορίσει αμέσως αν ο κωδικός κλήσης έχει την άδεια ή όχι. Η ζήτηση πρέπει να εφαρμοστεί κατά το χρόνο εκτέλεσης κάθε φορά που μια κλήση γίνεται με τη μέθοδο, επειδή δεν είναι δυνατή κατά τη μεταγλώττιση για να ξέρετε τι θα είναι στη στοίβα κατά τη διάρκεια οποιαδήποτε πρόσκληση. Ως εκ τούτου, LinkDemand είναι πολύ πιο αποδοτική. Ωστόσο, η αντίστροφη σχέση για την εν λόγω απόδοση είναι λιγότερη ασφάλεια. Με LinkDemand, που πιστεύοντας ότι ο κωδικός κλήσης δεν πρόκειται να αφήσει ΤΗΣ κωδικός κλήσης (που μπορεί ή δεν μπορεί να έχει την άδεια) να το χρησιμοποιήσετε για φαύλους σκοπούς. (Με άλλα λόγια, έχουν εμπιστοσύνη ότι δεν υπάρχουν τρύπες ασφαλείας στον κώδικα κλήσης που καλούντες του μπορεί να εκμεταλλευτεί για να αποκτήσουν πρόσβαση έμμεσα με τη μέθοδο με την LinkDemand.) Με τη ζήτηση, ξέρετε ότι όλοι στη στοίβα έχει καμία απολύτως άδεια (σε τουλάχιστον μέχρι ενός Assert βρεθεί), οπότε δεν υπάρχει κίνδυνος από μη αξιόπιστες καλούντες.


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


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


PermitOnly είναι σαν Deny, εκτός αντί να αρνείται μια ειδική άδεια αρνείται κάθε δικαίωμα, εκτός από εκείνη που καθορίζεται.


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


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


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


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


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


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


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


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


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


<http://urlrewriter.codeplex.com>


Ο κανόνας για την επανεγγραφή αυτό θα ήταν:



```
# clean up old rules and forward to new URL
RewriteRule ^/?user=(.*)  /users/$1 [NC,R=301]

# rewrite the rule internally
RewriteRule ^/users/(.*)  /?user=$1 [NC,L]

``` Οι μέθοδοι είναι σύγχρονη από προεπιλογή. Για να τους κάνουν ασύγχρονη, θα πρέπει να προσθέσετε αυτό το χαρακτηριστικό [OperationContract (AsyncPattern = true)] και να επιστρέψει ένα IAsynchResult, όπως ακριβώς θα κάνατε αν ήσασταν κάνει BeginIvoke () με WinForms. (διαβάστε περισσότερα εδώ <http://msdn.microsoft.com/en-us/library/ms734701.aspx> )


Μπορείτε να κάνετε δημοσιεύσεων / συνδρομών με κάτι που ονομάζεται επανάκλησης Συμβόλαιο (αν im δεν είναι σίγουρος για την εφαρμογή αυτή σε άλλες πλατφόρμες) Δεν έχω μεγάλη εμπειρία με αυτά, αλλά δεν φαίνεται εξαιρετικά complected (μπορείτε να διαβάσετε περισσότερα εδώ [http: //dotnetaddict.dotnetdevelopersjournal.com/wcf\_alarmclock.htm](http://dotnetaddict.dotnetdevelopersjournal.com/wcf_alarmclock.htm) ) Εντάξει, έχω μιλήσει με τους ανωτέρους μου και αποφάσισαν ότι θα μπορούσε να είναι ΟΚ ότι δεν μπορείτε να κάνετε δεξί κλικ σε ένα στοιχείο μενού και επιλέξτε «Άνοιγμα σε νέο παράθυρο». Εάν η απαίτηση αυτή πέσει, τότε δεν είμαι υποχρεωμένη να `<a>`στοιχεία για τις συνδέσεις. Με την Javascript μπορώ να μετατρέψει τα πάντα σε ένα σύνδεσμο. Έτσι, θα μπορείτε να επιλέξετε, ~~pikachoo~~ `<table>` !


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


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


Οτιδήποτε άλλο που μπορεί να κάνει το ίδιο μάλλον θα είναι πιο convulted ούτως ή άλλως. Και πριν κάποιος έχει την ιδέα - όχι, δεν χρειάζεται υποστήριξη των μηχανών αναζήτησης. Είναι μια εσωτερική εφαρμογή web. Θα ήταν πολύ κακό αν η Google θα μπορούσε δείκτης που ... Μπορείτε να χρησιμοποιήσετε `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).