Η αποστολή ενός αιτήματος HTTP είναι το κλειδί για κάθε εφαρμογή που χρειάζεται να επικοινωνήσει μέσω Διαδικτύου. Μάθετε πώς μπορείτε να στείλετε μια ποικιλία αιτημάτων HTTP χρησιμοποιώντας το Go.
Μία από τις θεμελιώδεις αρχές που διέπουν τη λειτουργία του Παγκόσμιου Ιστού είναι η ανταλλαγή αιτημάτων και απαντήσεων. Όταν στέλνετε ένα αίτημα για πρόσβαση σε μια ιστοσελίδα, ο διακομιστής απαντά με τα κατάλληλα δεδομένα.
Τα δημοφιλή πρωτόκολλα που διέπουν διαφορετικούς τύπους διαδικτυακής επικοινωνίας περιλαμβάνουν HTTP (Πρωτόκολλο μεταφοράς υπερκειμένου), FTP (Πρωτόκολλο μεταφοράς αρχείων) και SMTP (Simple Mail Transfer Protocol).
Το HTTP είναι το πρωτόκολλο που θα χρησιμοποιείτε συνήθως όταν προβάλλετε έναν ιστότοπο ή χρησιμοποιείτε μια εφαρμογή με δυνατότητα web. Μπορείτε επίσης να εργαστείτε με αιτήματα HTTP από πολλές γλώσσες προγραμματισμού, συμπεριλαμβανομένης της Go.
Τι είναι ένα αίτημα HTTP;
Το HTTP καθορίζει τον τρόπο με τον οποίο οι πελάτες, όπως τα προγράμματα περιήγησης ιστού, στέλνουν αιτήματα σε διακομιστές που στη συνέχεια επιστρέφουν μια απάντηση. Ένα αίτημα HTTP περιέχει πληροφορίες σχετικά με έναν πόρο στον οποίο ο πελάτης προσπαθεί να αποκτήσει πρόσβαση. Το μήνυμα αιτήματος συνήθως περιλαμβάνει μια διεύθυνση URL που προσδιορίζει τον πόρο και άλλα προαιρετικά δεδομένα, όπως κεφαλίδες και παραμέτρους ερωτήματος.
Υπάρχουν διάφορους τύπους αιτημάτων HTTP, συμπεριλαμβανομένων των GET, POST, PUT, DELETE, HEAD, OPTIONS και CONNECT. Οι πρώτοι τέσσερις τύποι μεθόδων είναι οι πιο συνηθισμένοι. αντικατοπτρίζουν τις λειτουργίες CRUD ανάγνωσης, δημιουργίας, ενημέρωσης και διαγραφής αντίστοιχα.
Ο τύπος αιτήματος PUT χρησιμοποιείται συχνά εναλλακτικά με τον τύπο αιτήματος PATCH. Επιτυγχάνουν τον ίδιο σκοπό, απλώς διαφέρουν στα δεδομένα που περιμένουν να περιλαμβάνει το αίτημα.
Αποστολή αιτημάτων με χρήση κοινών μεθόδων HTTP
Το Go είναι ενσωματωμένο http πακέτο παρέχει ένα σύνολο λειτουργιών και δομών που μπορείτε να χρησιμοποιήσετε για να δημιουργήσετε διακομιστές ιστού και να διαχειριστείτε αιτήματα HTTP. Είναι ένα πολύ ισχυρό πακέτο και όλα τα πλαίσια ιστού Go βασίζονται πάνω του με τον ένα ή τον άλλο τρόπο. Είναι ένα υποπακέτο του Go’s καθαρά πακέτο.
Για να δημιουργήσετε ένα αίτημα HTTP στο Go, μπορείτε να χρησιμοποιήσετε το http. NewRequest() λειτουργία και ορίστε την κατάλληλη μέθοδο, διεύθυνση URL, κεφαλίδες και σώμα αιτήματος. Αφού δημιουργήσετε το αίτημα, μπορείτε να χρησιμοποιήσετε το Go net/http του πακέτου http. Πελάτης{} δομή για να το εκτελέσετε και να λάβετε την απάντηση.
Χρησιμοποιούνται τα ακόλουθα δείγματα κώδικα reqres.in, ένα δημοσίως διαθέσιμο API για τη δοκιμή αιτημάτων HTTP. Μπορείτε να το χρησιμοποιήσετε για να δοκιμάσετε αιτήματα GET, POST, PUT και DELETE στα προγράμματα Go σας.
ΑΝΑΡΤΗΣΗ Αίτησης
Ο παρακάτω κωδικός είναι μια συνάρτηση που στέλνει ένα αίτημα POST στο /api/users τελικό σημείο του reqres.in για να δημιουργήσετε έναν νέο χρήστη με όνομα και εργασία.
πακέτο κύριος
εισαγωγή (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)funccreateUser(όνομα, δουλειά σειρά) {
fmt. Println("Δημιουργία χρήστη...")apiUrl := " https://reqres.in/api/users"
Δεδομένα χρήστη := []ψηφιόλεξη(`{"όνομα":"` + όνομα + "","δουλειά":"` + δουλειά + `"}`)// δημιουργία νέου αιτήματος http
αίτημα, σφάλμα := http. NewRequest("ΘΕΣΗ", apiUrl, bytes. NewBuffer (userData))
αίτηση. Επί κεφαλής. Σειρά("Τύπος περιεχομένου", "application/json; charset=utf-8")// στείλτε το αίτημα
πελάτης := &http. Πελάτης{}
απάντηση, σφάλμα := πελάτης. Κάνω (αίτημα)αν σφάλμα != μηδέν {
fmt. Println (σφάλμα)
}answerBody, σφάλμα := io. ReadAll (απάντηση. Σώμα)
αν σφάλμα != μηδέν {
fmt. Println (σφάλμα)
}formattedData := formatJSON(responseBody)
fmt. Println("Κατάσταση:", απάντηση. Κατάσταση)
fmt. Println("Σώμα απάντησης:", μορφοποιημένα δεδομένα)
// εκκαθάριση μνήμης μετά την εκτέλεση
αναβάλλω απάντηση. Σώμα. Κλείσε()
}
formatJSON είναι μια προσαρμοσμένη συνάρτηση που μπορείτε να γράψετε για να μορφοποιήσετε τα δεδομένα εξόδου. Δείτε πώς μπορείτε να το εφαρμόσετε:
// λειτουργία για τη μορφοποίηση δεδομένων JSON
funcformatJSON(δεδομένα []ψηφιόλεξη)σειρά {
var έξω byte. Ρυθμιστής
err := json. Εσοχή(&έξω, δεδομένα, "", " ")αν λάθος!= μηδέν {
fmt. Println (λάθος)
}
δ := έξω. Bytes ()
ΕΠΙΣΤΡΟΦΗσειρά(ρε)
}
Μπορείτε να καλέσετε το createUser() λειτουργούν σε ένα πρόγραμμα όπως αυτό:
funcκύριος() {
fmt. Println("Υποβολή αιτήματος POST...")
CreativeUser("Tim Omolana", "Συγγραφέας")
}
Όταν εκτελείτε το πρόγραμμα σε ένα τερματικό, χρησιμοποιώντας το Τρέχα εντολή, θα δείτε την έξοδο ως εξής:
Αίτημα GET
Ο παρακάτω κώδικας είναι μια συνάρτηση που στέλνει ένα αίτημα GET για την ανάκτηση ενός χρήστη από τον διακομιστή reqres.in χρησιμοποιώντας το μοναδικό αναγνωριστικό του.
// main.go
funcgetUser(ταυτότητα σειρά) {
fmt. Println("Λήψη χρήστη με αναγνωριστικό...")// κάντε αίτημα GET στο API για να λάβετε τον χρήστη κατά αναγνωριστικό
apiUrl := " https://reqres.in/api/users/" + id
αίτημα, σφάλμα := http. NewRequest("ΠΑΙΡΝΩ", apiUrl, μηδέν)αν σφάλμα != μηδέν {
fmt. Println (σφάλμα)
}αίτηση. Επί κεφαλής. Σειρά("Τύπος περιεχομένου", "application/json; charset=utf-8")
πελάτης := &http. Πελάτης{}
απάντηση, σφάλμα := πελάτης. Κάνω (αίτημα)αν σφάλμα != μηδέν {
fmt. Println (σφάλμα)
}answerBody, σφάλμα := io. ReadAll (απάντηση. Σώμα)
αν σφάλμα != μηδέν {
fmt. Println (σφάλμα)
}formattedData := formatJSON(responseBody)
fmt. Println("Κατάσταση:", απάντηση. Κατάσταση)
fmt. Println("Σώμα απάντησης:", μορφοποιημένα δεδομένα)
// εκκαθάριση μνήμης μετά την εκτέλεση
αναβάλλω απάντηση. Σώμα. Κλείσε()
}
Ένα αίτημα GET δεν στέλνει δεδομένα στον διακομιστή, επομένως δεν αποδέχεται ή στέλνει ένα σώμα αιτήματος στον διακομιστή όταν υποβάλλεται. Δείτε πώς θα μοιάζει ένα παράδειγμα κλήσης στην παραπάνω συνάρτηση:
funcκύριος() {
fmt. Println("Υποβολή αιτήματος GET...")
getUser("2")
}
Παραγωγή:
Αίτημα PUT
Το αίτημα PUT είναι πολύ παρόμοιο με ένα αίτημα POST επειδή στέλνει επίσης δεδομένα στον διακομιστή. Η κύρια διαφορά είναι ότι το POST δημιουργεί έναν νέο πόρο ενώ το PUT ενημερώνει έναν υπάρχοντα.
Ακολουθεί μια υλοποίηση ενός αιτήματος PUT:
// main.go
funcupdateUser(όνομα, δουλειά, ταυτότητα σειρά) {
fmt. Println("Ενημέρωση χρήστη...")// κάντε αίτημα PUT στο API για ενημέρωση χρήστη
apiUrl := " https://reqres.in/api/users/" + id
Δεδομένα χρήστη := []ψηφιόλεξη(`{"όνομα":"` + όνομα + "","δουλειά":"` + δουλειά + `"}`)// δημιουργία νέου αιτήματος http PUT
αίτημα, σφάλμα := http. NewRequest("ΒΑΖΩ", apiUrl, bytes. NewBuffer (userData))
αίτηση. Επί κεφαλής. Σειρά("Τύπος περιεχομένου", "application/json; charset=utf-8")
// Υπόλοιπο σώμα συνάρτησης από τη συνάρτηση createUser...
// Κάντε αίτημα, λάβετε απάντηση και καθαρίστε τη μνήμη...
}
Από αυτόν τον κώδικα, μπορείτε να δείτε τις μόνες διαφορές μεταξύ του αιτήματος PUT και του αιτήματος POST παραπάνω είναι το όνομα της μεθόδου και η διεύθυνση URL. Όταν χρησιμοποιείτε ένα PUT για την ενημέρωση των υπαρχόντων δεδομένων, θα πρέπει να προσαρτήσετε το αναγνωριστικό στη διεύθυνση URL αιτήματος. Ένα δείγμα κλήσης σε αυτήν τη συνάρτηση θα μοιάζει με αυτό:
func main() {
// ενημέρωση καταχώρισης με το ID 2.
updateUser("Tim Newname", "Συγγραφέας του προσωπικού", "2")
}
Ο παραπάνω κώδικας ενημερώνει τον χρήστη και παράγει την ακόλουθη έξοδο:
ΔΙΑΓΡΑΦΗ Αίτημα
Χρησιμοποιήστε τη μέθοδο αίτησης ΔΙΑΓΡΑΦΗ για να εκτελέσετε μια λειτουργία διαγραφής σε διακομιστή web. Ένα αίτημα διαγραφής διαγράφει τον πόρο που προσδιορίζεται από το URI. Ένα αίτημα DELETE στο Go μοιάζει με αυτό:
funcdeleteUser(ταυτότητα σειρά) {
fmt. Println("Διαγραφή χρήστη...")
// κάντε αίτημα DELETE στο API για διαγραφή χρήστη
apiUrl := " https://reqres.in/api/users/" + id// δημιουργία νέου αιτήματος http
αίτημα, σφάλμα := http. NewRequest("ΔΙΑΓΡΑΦΩ", apiUrl, μηδέν)
αίτηση. Επί κεφαλής. Σειρά("Τύπος περιεχομένου", "application/json; charset=utf-8")πελάτης := &http. Πελάτης{}
απάντηση, σφάλμα := πελάτης. Κάνω (αίτημα)
αν σφάλμα != μηδέν {
fmt. Println (σφάλμα)
}
fmt. Println("Κατάσταση:", απάντηση. Κατάσταση)
}
Ένα αίτημα DELETE ούτε αποδέχεται ούτε επιστρέφει ένα σώμα, γι' αυτό δεν χρειάζεται να αναλύσετε ή να μορφοποιήσετε το σώμα αίτησης και απάντησης JSON. Η απάντηση επιστρέφει μόνο μια κατάσταση για να υποδείξει επιτυχία ή αποτυχία. Δείτε πώς φαίνεται ένα δείγμα κλήσης στη συνάρτηση με την έξοδο της:
funcκύριος() {
fmt. Println("Υποβολή αιτήματος DELETE...")
deleteUser("2")
}
Παραγωγή:
Εξοικονομήστε χρόνο χρησιμοποιώντας το http. Θέση() και http. Παίρνω() μεθόδους από το net/http πακέτο για να φτιάξετε ΘΕΣΗ και ΠΑΙΡΝΩ ζητά απευθείας, χωρίς να χρειάζεται να χρησιμοποιήσετε το NewRequest() λειτουργία και το Πελάτης{} δομή για τη δημιουργία και την υποβολή του αιτήματος ξεχωριστά. Ελέγξτε το net/http τεκμηρίωση Για περισσότερες πληροφορίες.
Πραγματοποίηση αιτημάτων HTTP σε εφαρμογές Go
ο http Το πακέτο στο Go παρέχει όλα όσα χρειάζονται για την υποβολή αιτημάτων HTTP και τη διαχείριση των απαντήσεων στις εφαρμογές Go. Οι λειτουργίες και οι δομές που παρέχονται από το πακέτο σάς επιτρέπουν να δημιουργείτε και να στέλνετε διαφορετικά είδη αιτημάτων όπως GET, POST, PUT, DELETE και πολλά άλλα.
Αυτό καθιστά εύκολη τη δημιουργία εφαρμογών ιστού στο Go που μπορούν να αλληλεπιδρούν με άλλες υπηρεσίες ιστού και API. Ένας καλός τρόπος για να πάρετε πιο εξοικειωμένοι με την πραγματοποίηση αιτημάτων HTTP στο Go είναι η δημιουργία μιας εφαρμογής που υποβάλλει αιτήματα σε ένα άλλο REST API του δικος σου.