varg88 Δημοσ. 13 Μαρτίου 2020 Δημοσ. 13 Μαρτίου 2020 Καλημέρα/καλησπέρα σας!! Έχω αναπτύξει μια εφαρμογούλα μέσω της οποίας στέλνω SMS. Μου είπαν πως πρέπει να ξεκινήσω να τα στέλνω όμως με τη χρήση Restful API και δεν μπορώ να βγάλω άκρη! Την εφαρμογή μου την έχω αναπτύξει με ASP Classic και ουσιαστικά μέχρι τώρα έκανα το εξής: Μέσω μιας form στην οποία πληκτρολογούσα κείμενο και παραλήπτη δημιουργούσα ένα url το οποίο είχε την παρακάτω μορφή: http://www.yoursms.gr/api/accept.php?username=ΕΓΩ&password=ΚΩΔΙΚΟΣ&send=6999123456&receive=6999876543&text=KEIMENO Τώρα δεν μπορώ να καταλάβω ούτε από που πρέπει να ξεκινήσω δυστυχώς... :( παρόλο που μου έστειλαν και ένα manual σε pdf. Το επισυνάπτω μήπως και μπορέσετε να με βοηθήσετε... Restfull API.pdf
Codehack Δημοσ. 14 Μαρτίου 2020 Δημοσ. 14 Μαρτίου 2020 (επεξεργασμένο) Ας ξεκινήσουμε από τα πολύ βασικά. Θα υποθέσω μιας και βλέπω πως είσαι αρχάριος πως το URL "http://www.yoursms.gr/blabla" το έχεις κάνει hardcode σε κάποιο source file και απλά το κάνεις format και περνάς τις παραμέτρους για να το κάνεις call. Αυτό το URL θα πρέπει να είναι configurable, να μην χρειάζεται να κάνεις compile και redeploy το web app σου εάν χρειαστεί αλλαγή. Επίσης, εάν η εφαρμογή σου ήταν desktop app, θα ήταν πολύ έυκολο για κάποιον τρίτο να το κάνει είτε sniff με κάποιο εργαλείο όπως το Fiddler ή να το βρεί μέσω κάποιου decompiler οπως το dnSpy, συνεπώς και να το εκμεταλλευτεί. Δεύτερον, θα σου πρότεινα να Googleάρεις πράγματα. Ακόμα και ένας senior developer κατά 99% θα έχει ανοιχτό Visual Studio και παράλληλα τον browser του σε "αναμονή" για να ψάξει κάτι στο Google, στο StackOverflow, οπουδήποτε. Το να ψάξεις να μάθεις τι είναι ένα RESTful API είναι 5 λεπτά υπόθεση. Όλα αυτά φιλικά και με αγάπη. Στο θέμα μας τώρα, πολύ πολύ χοντρικά, RESTful είναι ένα API το οποίο επικεντρώνεται στους πόρους (resources) ενός συστήματος, είναι stateless (δεν κρατάει session data π.χ) και οφείλει να είναι language και architecture agnostic. Συνεπώς, μπορεί να γίνει consume από οποιονδήποτε client σε οποιαδήποτε γλώσσα προγραμματισμού και επίσης, επιτρέπει την διαλειτουργικότητα συστημάτων (interoperability). Όταν γράφεις ένα RESTful API, υπάρχουν 2 κύρια στοιχεία: Host/Root/Base URL (To URL στο οποίο βρίσκεται το API, π.χ στο PDF σου: https://api.yoursms.gr/v1) Service endpoint (το relative path του Uri το οποίο διαχειρίζεται συγκεκριμένο resource, στο PDF sou: /balance) Για να μεταβάλεις το state κάποιου resource, κάνοντας CRUD (create/read/update/delete) operations, χρησιμοποιείς τα HTTP verbs ως εξής (συνήθως): GET: Read POST: Create / Create or Update PUT: Update / Create or Update DELETE: Delete Κατά κύριο λόγο, το content ενός request ή ενός response που αφορά ένα RESTful API είναι JSON. Υπάρχουν άλλα RESTful APIs που παίζουν XML αλλά συνήθως σου δίνεται η δυνατότητα να επιλέξεις τι είδους content θες να πάρεις και να στείλεις. Συνεπώς, βάσει του PDF σου: Για να κάνεις query το balance σου θα στείλεις το request σου με GET verb στο εξής Uri: https://api.yoursms.gr/v1/balance Για να λειτουργήσει όμως το request, θα πρέπει να βάλεις το authorization header έτσι ώστε το backend να σε κάνει authenticate και να γνωρίζει για ποιον user γίνονται τα requests. Π.χ: Uri baseUri = new Uri("https://api.yoursms.gr/v1"); Uri getBalance = new Uri(baseUri, "balance"); //To absolute Uri (getBalance) einai: https://api.yoursms.gr/v1/balance string apiKey = "to-api-key-sou"; using (HttpClient client = new HttpClient()) { using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, getBalance)) { request.Headers.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes(apiKey))); request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); using (HttpResponseMessage response = client.SendAsync(request).GetAwaiter().GetResult()) { string jsonResponse = response.Content.ReadAsStringAsync().GetAwaiter().GetResult(); // Paradeigma timis tou jsonResponse: /* { "status": "success", "balance": "549.00" } */ } } } Στο παραπάνω παράδειγμα, πρέπει να αλλάξεις την τιμή του string apiKey να αντιστοιχεί στο API key που σου δίνει η υπηρεσία (όπως και ζητάει στο PDF). Επίσης πρέπει να βρείς έναν τρόπο να κάνεις parse το jsonResponse. Θα σου πρότεινα να κοιτάξεις το JSON.Net (Newtonsoft.Json) library, το πιο διαδεδομένο JSON parser για .NET Ελπίζω να βοήθησα. Στείλε PM αν θες περαιτέρω εξηγήσεις. Υ.Γ: Το παραπάνω snippet δεν είμαι 100% σίγουρος ότι δουλεύει, το έγραψα απ' το κινητό from the top of my head οπότε μπορεί να περιέχει λάθη. Επεξ/σία 14 Μαρτίου 2020 από Codehack 2 1
Theo1903 Δημοσ. 18 Μαρτίου 2020 Δημοσ. 18 Μαρτίου 2020 Όπως τα λέει ο φίλος απο πάνω και προσθέτω .Για το κομμάτι του /sms endpoint που σε ενδιαφέρει, θα φτιάξει μια κλάση η οποία θα αντιστοιχίζεται στο payload που θα στείλεις στο endpoint. Σύμφωνα με αυτά που αναφέρει, θέλει πεδία subscribers[], message, reference_id (αν θες). Το subscribers είναι array απο αντικείμενα κλάσης subscriber όπως στην ορίζει στο pdf και το message αντίστοιχα. Αφού τα δημιουργήσεις και τα κάνεις populate (με τον ίδιο λογικά τρόπο που έκανες και νωρίτερα πριν να στείλεις), θα κάνεις ένα serialization (π.χ. με το Newtonsoft.Json) και θα postάρεις στο endpoint : string myJson = JsonConvert.SerializeObject(object_για_payload);"; using (var client = new HttpClient()) { var response = await client.PostAsync( uri, new StringContent(myJson, Encoding.UTF8, "application/json")); //και μετά κάνεις ότι θες με το response } 1
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα