1c 8.3 ταχυδρομήστε αίτημα για λήψη παραγγελιών. Χειρισμός ανακατεύθυνσης αιτήματος http

Προέκυψε μια εργασία σχετικά με τη μεταφορά δεδομένων μεταξύ 1C (η ανάπτυξη και η διαμόρφωση ανατέθηκε σε εξωτερικούς συνεργάτες), το οποίο σχεδιάζεται να χρησιμοποιηθεί ως το κύριο ηλεκτρονικό σύστημα διαχείρισης εγγράφων (EDF) και ένα σύστημα B2B (εσωτερική ανάπτυξη), το οποίο είναι γραμμένο σε PHP (Symfony) και εκτελεί τις λειτουργίες της εισαγωγής πρωτογενών πληροφοριών στις εταιρείες.

Είχα ήδη εμπειρία ενσωμάτωσης ενός B2B με ένα άλλο B2B. Η ιδέα ήταν να μεταφέρουμε το JSON χρησιμοποιώντας το cURL. Τότε προέκυψε το έργο της ενσωμάτωσης του συστήματος Borlas, που βασίζεται στην Oracle, όπου εφαρμόστηκε και αυτή η προσέγγιση. Από την πλευρά της Oracle, όμως, χρησιμοποίησαν το δικό τους πακέτο - ανάλογο του cURL στην PHP (αν υπάρχει ενδιαφέρον, μπορώ να το περιγράψω σε νέο άρθρο).

Όπως ανακάλυψα, το 1C 8.2 μπορεί επίσης να στείλει αιτήματα GET και POST. Υπέθεσα ότι αν όλα ήταν ήδη ρυθμισμένα και λειτουργούν με άλλα συστήματα, τότε θα έπρεπε να λειτουργήσει και εδώ. Το JSON απορρίφθηκε από τους προγραμματιστές του 1C, λέγοντας ότι η μορφή ήταν ακατάλληλη και αναγνώρισαν μόνο XML. Σχόλια ότι αυτό θα μας έδινε ένα ελάχιστο ποσό μεταφοράς δεδομένων, αλλά στην πραγματικότητα λάβαμε πολλά δεδομένα, απορρίφθηκαν. Ως αποτέλεσμα, αρχίσαμε να προετοιμάζουμε 2 συστήματα που βασίζονται σε XML.

Από την πλευρά μου, έγραψα ένα αίτημα αποδοχής από το 1C και επέστρεψα αποτελέσματα. Μια συνάρτηση για τη λήψη μιας μεταβλητής στο POST, στην οποία το 1Sniki έπρεπε να αντικαταστήσει το XML.
Η μορφή είναι περίπου η εξής:

123ABC456//κλειδί εξουσιοδότησης λάβετε_τελευταίες_παραγγελίες//λειτουργία που θέλουν να εκτελέσουν 4000//όριο των εγγραφών που θέλουν να επιλέξουν

Ένας χειριστής που επιστρέφει εγγραφές που έχουν ήδη επιλεγεί σύμφωνα με τις συνθήκες και δημιουργεί XML όπως:

1 Ο.Π.Σ. 4853352 01.01.2013 1 Ανέβηκε από το b2b SNILS 999999999 Πλήρες όνομα πελάτη Μιχαήλ Μιχαήλ Εβγκένιεβιτς Ημερομηνία αίτησης 01.01.2013 ...

Τα δεδομένα μπορούν να μεταδοθούν μόνο μέσω σύνδεσης HTTPS.

Με την πρώτη ματιά, όλα φαίνονται απλά, αλλά προέκυψαν αρκετά προβλήματα στη διαδικασία:
1) οι ανάδοχοι ανέφεραν ότι δεν ήταν εξοικειωμένοι με αιτήματα αυτού του είδους και προσπάθησαν να προσφέρουν ένα παλιό αποδεδειγμένο σχέδιο:
1. εισαγωγή αρχείου από B2B,
2. Φόρτωση σε 1C,
3. Εξαγωγή ενός αρχείου που δείχνει τι ήταν δυνατό να υποβληθεί σε επεξεργασία, τι δεν ήταν από 1C,
4. Εισαγωγή σε B2B,
5. και από την αρχή...
Το σχέδιο απορρίφθηκε επειδή έπρεπε να γίνει γρήγορα και χωρίς ανθρώπινη παρέμβαση και κανένα «κουμπί».

Μετά ζήτησαν ένα παράδειγμα κώδικα. Έψαξα στο Google το ακόλουθο παράδειγμα στο Διαδίκτυο:

Διακομιστής = "test.com"; Λιμάνι = "443"; HTTPTry = Νέα σύνδεση HTTP(Διακομιστής, Θύρα, True); Διαφορετικά HTTP = Νέα σύνδεση HTTP(Διακομιστής, Θύρα); τέλος εαν; ScriptAddress = "/gateway/GetData1C/"; Προσπάθεια HTTP.SendForProcessing(SendFileName, ScriptAddress, ResponseFileName, HTTPHeader); Αναφορά εξαίρεσης("Απέτυχε η προσπάθεια σύνδεσης: " + ErrorDescription()); ElseLogRecord("HTTPConnection", LogLevel.Error, "Η προσπάθεια σύνδεσης απέτυχε: " + ErrorDescription()); EndIf Επιστροφή? EndAttempt;

Τα δεδομένα άρχισαν να φτάνουν στον διακομιστή, αλλά ήταν άδειο, δηλαδή το GET και το POST ήταν άδεια. Πρόσθεσα μια καταχώρηση στα αρχεία καταγραφής και το ξέχασα επιτυχώς. Μετά από 4 μήνες, μου δόθηκε μια επείγουσα αποστολή - να φέρω την ενσωμάτωση σε ένα αποτέλεσμα (καθώς έχει περάσει πολύς χρόνος, οι προγραμματιστές 1C εργάζονται και εργάζονται, αλλά τίποτα δεν ανταποκρίνεται). Μου έβαλαν το 1C και άρχισα να χαζεύω.

Πρώτα, αποφάσισα να εγκαταστήσω το Fiddler για να καταλάβω τι συνέβαινε. Παρατήρησα ότι η σύνδεση γίνεται μέσω HTTP και, στη συνέχεια, ο διακομιστής ανακατευθύνεται στο HTTPS. Υπέθεσα ότι για αυτόν τον λόγο τα δεδομένα είναι άδεια. Προσπάθησα να το αναπαράγω στο Chrome και έλαβα επιβεβαίωση ότι τα δεδομένα στο αίτημα POST χάθηκαν κατά την ανακατεύθυνση.

Δεδομένου ότι είναι αδύνατο να επιτραπεί η εργασία μέσω HTTP, άρχισα να μελετώ γιατί, επειδή υποδεικνύεται ότι:

HTTP = Νέα σύνδεση HTTP(Διακομιστής, Θύρα, True); Η παράμετρος "True" σημαίνει τη χρήση HTTPS και, στη συνέχεια, αποκαλύφθηκε ότι HTTP = Νέα HTTPConnection (Διακομιστής, Θύρα).

Ως αποτέλεσμα, αυτό το "Διαφορετικά" πετάχτηκε έξω και έλαβα ένα σφάλμα ότι το πιστοποιητικό ήταν λανθασμένο. Το πιστοποιητικό ήταν αυτουπογεγραμμένο. Η ανάπτυξη ενσωμάτωσης πραγματοποιήθηκε σε εσωτερικούς διακομιστές, όπου αγοράστηκε επίσημα πιστοποιητικό από το “Thawte SSL CA”, σε αντίθεση με τον διακομιστή PROD. Η εισαγωγή του πιστοποιητικού σε όλα τα πιθανά καταστήματα δεν είχε κανένα αποτέλεσμα.

Μια αναζήτηση μέσω πόρων οδήγησε στο γεγονός ότι το 1C έχει τα δικά του πιστοποιητικά ρίζας και βάσει αυτών ελέγχει ήδη τα άλλα. Βρίσκονται σε δοκιμαστική μορφή στο αρχείο "cacert.pem", το οποίο βρίσκεται στο φάκελο "bin", όπου βρίσκεται το 1C. Η εισαγωγή δεν είναι τόσο απλή όσο αποδείχθηκε.

Αρχικά, πρέπει να εξαγάγουμε το πιστοποιητικό που χρειαζόμαστε σε ένα αρχείο (το είχα ήδη στον προσωπικό μου χώρο αποθήκευσης). Εκτελώντας το "certmgr.msc", έχοντας βρει το πιστοποιητικό, το εξάγουμε σε ένα αρχείο *.cer.

C:\OpenSSL-Win64\bin>openssl x509 -inform der -in C:\fiddler.cer -out C:\fiddler.pem -text -fingerprint -md5 ΠΡΟΕΙΔΟΠΟΙΗΣΗ: δεν μπορώ να ανοίξω το αρχείο διαμόρφωσης: /usr/local/ ssl/openssl.cnf MD5 Δακτυλικό αποτύπωμα=13:BF:73:43:BB:69:19:BA:22:5D:C7:2E:44:85:91:7F
Εξοικονομούμε MD5, θα το χρειαστούμε.
Στη συνέχεια, ανοίξτε το αρχείο "cacert.pem".
Κατεβαίνουμε στο κάτω μέρος και προσθέτουμε πρώτα το MD5 και μετά όλα τα περιεχόμενα που βγήκαν στο αρχείο "fiddler.pem".
Αποθηκεύστε το αρχείο.
Κάνουμε επανεκκίνηση του 1C (ίσως δεν είναι απαραίτητο, αλλά δεν λειτούργησε για μένα, οπότε επανεκκίνησα τα πάντα.

Στο αρχείο προέλευσης στο 1C δόθηκε αυτή η μορφή:

Διαδικασία SendRequestPress(Element) Connection = GetHTTPConnection(); If Connection = Undefined then Report("Δεν ήταν δυνατή η σύνδεση με τον διακομιστή που καθορίζεται στις ρυθμίσεις ανταλλαγής! Η επεξεργασία διακόπηκε!"); Διαφορετικά Πηγή = Διεύθυνση Αρχείου; τέλος εαν; FileName = FileResult; PostFileName = PostFile; PostFile = Νέο αρχείο (PostFileName); SubmissionFileSize = XMLString(SubmissionFile.Size()); Headers = New Match(); Headers.Insert("Content-Type", "application/x-www-form-urlencoded"); Headers.Insert("Content-Lenght", SubmissionFileSize); Attempt Connection.SendForProcessing(PostFileName, Source, FileName, Headers); Αναφορά εξαίρεσης(ErrorDescription()); EndAttempts EndProcedures Function GetHTTPConnection() Export AttemptConnection = Νέα HTTPConnection(HTTPServer,"443",True); Αναφορά εξαίρεσης(ErrorDescription()); Σύνδεση = Απροσδιόριστη; EndAttempt; Σύνδεση επιστροφής. Διαδικασία EndFunctions OnOpen() HTTPServer = "test.com"; FileAddress = "/gateway/GetData1C"; PostFile = "C:\POST_1C\post.txt"; FileResult = "C:\POST_1C\result.xml"; Τέλος Διαδικασίας

Αφού κάνετε κλικ στο κουμπί, εστάλη ένα αίτημα μέσω HTTPS και ελήφθη η σωστή XML ως έξοδος.

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

Κατά την ανάπτυξη μιας διαδικασίας για την αποστολή πληροφοριών από το 1C στον ιστότοπο με την έκδοση πλατφόρμας 8.3.9.2170, αντιμετώπισα ένα πρόβλημα: ο προγραμματιστής του ιστότοπου μου έδωσε τη δυνατότητα να καταγράψω τις απαραίτητες πληροφορίες μόνο χρησιμοποιώντας ένα αίτημα HTTP χρησιμοποιώντας τη μέθοδο PUT.

Χωρίς να το σκεφτώ δύο φορές, σκιαγράφησα έναν απλό κώδικα:

Σύνδεση = Νέα σύνδεση HTTP("www.mysite.ru"); Κεφαλίδες = Νέος αγώνας. Headers["Content-Type"] = "application/x-www-form-urlencoded"; Request = New HTTPRequest("/api/order_items/93076?order_item=30", Headers); Connection.Write(Request);

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

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

Ένα περίεργο πράγμα έγινε αμέσως σαφές: Ο παραπάνω κωδικός δεν δημιουργεί ένα PUT, αλλά ένα αίτημα HEAD!

Στα αρχεία καταγραφής του Apache είδα τα εξής:

127.0.0.1 - - "HEAD /api/order_items/93076?order_item=30 HTTP/1.1"

Ήμουν λίγο έκπληκτος (εξάλλου, το εγχειρίδιο έλεγε PUT σε μαύρο και άσπρο), αλλά δεν μπερδεύτηκα - μπορείτε να καλέσετε τη μέθοδο απευθείας:

Connection.CallHTTPMethod("PUT",Request);

Τα αρχεία καταγραφής δείχνουν το ίδιο πράγμα:

127.0.0.1 - - "HEAD /api/order_items/93076?order_item=30 HTTP/1.1"

«Ίσως κάνω κάτι λάθος;» - Έκανα στον εαυτό μου μια ερώτηση. Αλλά δεν υπήρχαν υποδείξεις στο Διαδίκτυο ή στα εγχειρίδια. Λοιπόν, κανείς δεν έχει ακυρώσει ακόμη τη μέθοδο του επιστημονικού poking. Για αρχή, προσπάθησα να κάνω αυτό:

Connection.CallHTTPMethod("fyvfyv",Request);

Στα αρχεία καταγραφής που έλαβα:

127.0.0.1 - - "?????? /api/order_items/93076?order_item=30 HTTP/1.1"

Περιέργως, σημαίνει ότι το 1C αντικαθιστά τη μέθοδο PUT συγκεκριμένα (γιατί δεν άρεσε στο 1C;).

Μετά από μερικές ακόμη προσπάθειες κατέληξα σε αυτό:

Connection.CallHTTPMethod("PUT",Request);

Στα αρχεία καταγραφής που έλαβα:

127.0.0.1 - - "PUT /api/order_items/93076?order_item=30 HTTP/1.1"

Και αυτή η επιλογή έχει ήδη λειτουργήσει στον ιστότοπο και όλοι ήταν ευχαριστημένοι.

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

Σύνδεση = Νέα σύνδεση HTTP("www.mysite.ru"); Κεφαλίδες = Νέος αγώνας. Headers["Content-Type"] = "application/x-www-form-urlencoded"; Request = New HTTPRequest("/api/order_items/93076?order_item=30", Headers); Request.SetBodyFromString("",TextEncoding.UTF8, UseByteOrderMark.NotUse); Connection.Write(Request);

Και είναι πιθανώς πολύ σωστό να περάσουν οι ίδιες οι τιμές των παραμέτρων στο σώμα του αιτήματος.

Το συμπέρασμα είναι το εξής: η πλατφόρμα 1C θεωρεί ότι ένα αίτημα PUT χωρίς σώμα είναι λανθασμένο και αντικαθιστά τη μέθοδο με HEAD.

Είναι περίεργο ότι το 1C δεν παρακολουθεί ένα αίτημα POST χωρίς σώμα και δεν το μετατρέπει σε GET, το έλεγξα για πλάκα.

Όπως θα έλεγε ο γνωστός Vovochka από το περίφημο ανέκδοτο: «Πού είναι η λογική;»

Ελπίζω η δημοσίευσή μου να σώσει κάποιον αρκετές ώρες από τη ζωή του σε αναζήτηση απάντησης. =)))

Εκτύπωση (Ctrl+P)

Μπορείτε να παρακολουθήσετε το δεύτερο μέρος

Γενικές πληροφορίες

Σε έκδοση πλατφόρμας 8.3.5.1068 , που δημοσιεύτηκε τον Σεπτέμβριο του 2015, ένας μηχανισμός για την ενσωμάτωση του 1C με εξωτερικά προγράμματαμέσω της τεχνολογίας Διεπαφή REST. Η πλατφόρμα χρησιμοποιεί το πρωτόκολλο OData ως πρωτόκολλο πρόσβασης. Είναι ένα ανοιχτό πρωτόκολλο Ιστού για αναζήτηση και ενημέρωση δεδομένων. Σας επιτρέπει να χειρίζεστε δεδομένα χρησιμοποιώντας εντολές HTTP ως αιτήματα. Στην έκδοση 8.3.5.1068 ήταν δυνατή η λήψη απαντήσεων μόνο στη μορφή Atom/XML . Ωστόσο, ξεκινώντας από την έκδοση 8.3.8.1652 τον Αύγουστο του 2017, εμφανίστηκε μια δεύτερη επιλογή για τη λήψη δεδομένων σε μορφή JSON (JavaScript Object Notation). . Σε σύγκριση με την XML, διαβάζεται εύκολα από τους ανθρώπους και καταλαμβάνει λιγότερο χώρο. Επιπλέον, όλα τα προγράμματα περιήγησης διαθέτουν ενσωματωμένα εργαλεία για εργασία με JSON.

Η εργασία με το πρωτόκολλο OData στην πλατφόρμα 1C: Enterprise βρίσκεται στο βιβλίο 1C: Οδηγός προγραμματιστή στο Κεφάλαιο 17 Μηχανισμοί υπηρεσιών Διαδικτύου, παράγραφος 17.2.1 Τυπική διεπαφή OData.Μπορείτε επίσης να δείτε παραδείγματα επέκτασης υποστήριξης για το πρωτόκολλο OData,

Πλεονέκτημα χρήσης Διεπαφή REST. συμπεραίνει ότι για να αποκτήσετε πρόσβαση σε δεδομένα συστήματος από εξωτερική εφαρμογή, δεν απαιτείται τροποποίηση του κώδικα λύσης εφαρμογής (για παράδειγμα, εάν υποστηρίζεται η λύση εφαρμογής). Για να αποκτήσετε αυτήν την πρόσβαση, πρέπει να δημοσιεύσετε την εφαρμογή στον διακομιστή Web με συγκεκριμένο τρόπο και να καθορίσετε ποια αντικείμενα διαμόρφωσης θα χρησιμοποιηθούν με αυτόν τον τρόπο. Τα συστήματα τρίτων μπορούν στη συνέχεια να έχουν πρόσβαση στην εφαρμογή σας χρησιμοποιώντας αιτήματα HTTP.

Η δημοσίευση της τυπικής διεπαφής OData πραγματοποιείται χρησιμοποιώντας το παράθυρο διαλόγου δημοσίευσης στον διακομιστή web (Διαχείριση - Δημοσίευση σε διακομιστή ιστού) και περιγράφεται στο βιβλίο 1C:Enterprise 8.3. «Οδηγός διαχειριστή».
Σπουδαίος!Προκειμένου τα αντικείμενα διαμόρφωσης να είναι προσβάσιμα μέσω της τυπικής διεπαφής OData, αυτό πρέπει να ενεργοποιηθεί χρησιμοποιώντας τη μέθοδο καθολικού περιβάλλοντος SetComposition ofStandardInterfaceOData().
Ο μηχανισμός για τη ρύθμιση της σύνθεσης των διαθέσιμων αντικειμένων χρησιμοποιώντας την τυπική διεπαφή OData μπορεί να γίνει με τη μορφή εξωτερική επεξεργασία. Αυτό δεν απαιτεί τροποποίηση της λύσης εφαρμογής.

Για να αλληλεπιδράσουμε με έναν εξωτερικό διακομιστή ιστού REST από το 1C:Enterprise, χρησιμοποιούμε τα διαθέσιμα εργαλεία στην πλατφόρμα για εργασία με αντικείμενα HTTP: HTTPConnection, HTTPRequest και HTTPRsponse.

Σε αυτήν τη σειρά άρθρων, θα δείξω παραδείγματα τυπικών λειτουργιών που χρησιμοποιούν την αντίστοιχη μέθοδο HTTP.

  • Μέθοδος λήψης δεδομένων ΠΑΙΡΝΩ;
  • Δημιουργία Αντικειμένου - Μέθοδος ΘΕΣΗ;
  • Ενημέρωση δεδομένων: μέθοδος ΚΗΛΙΔΑ– σε αυτήν την περίπτωση, μπορείτε να καθορίσετε μόνο εκείνες τις ιδιότητες που πρέπει να ενημερωθούν. μέθοδος ΒΑΖΩ– σε αυτήν την περίπτωση, είναι απαραίτητο να υποδεικνύονται όλες οι ιδιότητες της οντότητας·
  • Διαγραφή δεδομένων - μέθοδος ΔΙΑΓΡΑΦΩ.

1. Παραδείγματα απόκτησης δεδομένων. Μέθοδος HTTP GET

Ο διακομιστής θα είναι μια βάση δεδομένων που δημοσιεύεται στον διακομιστή web με το όνομα WebBuh(Βάση επίδειξης "Enterprise Accounting 3.0"). Θα χρησιμοποιήσω τη μορφή JSON ως μορφή ανταλλαγής δεδομένων. Περισσότερες πληροφορίες σχετικά με την εργασία με JSON αναγράφονται στη διαθέσιμη τεκμηρίωση. Για να λάβετε δεδομένα από τον διακομιστή χρησιμοποιώντας τη μέθοδο HTTP GET, πρέπει να δημιουργήσετε ένα αντικείμενο Διαβάζοντας JSONγια να διαβάσετε δεδομένα JSON διαδοχικά από ένα αρχείο ή συμβολοσειρά. Για να οργανώσετε τη διαδοχική εγγραφή αντικειμένων και κειμένων στον διακομιστή χρησιμοποιώντας τη μέθοδο HTTP POST PATCH PUT, πρέπει να δημιουργήσετε ένα αντικείμενο Καταχώρηση JSON.Σημειώστε ότι η μέθοδος DELETE δεν απαιτεί JSON.

Για να δείξω τη ροή της ανάγνωσης και γραφής JSON κατά την πρόσβαση στη διεπαφή REST, θα καλέσω την ακόλουθη προσαρμοσμένη συνάρτηση γενικού σκοπού Καλέστε το HTTPMethodOnServer :

&Στον διακομιστή // <Описание функции>// // Επιλογές: // - Μια συμβολοσειρά που περιέχει το όνομα της μεθόδου HTTP για το αίτημα ("POST"."PATCH", "PUT" "GET","DELETE" // - Αντικείμενο HTTPConnection //<АдресРесурса>- Συμβολοσειρά του πόρου http στον οποίο θα σταλεί το αίτημα HTTP. //<ОтправляемыеДанные>- Μια δομή ή αντιστοίχιση που περιέχει δεδομένα που αποστέλλονται στην καθορισμένη διεύθυνση για επεξεργασία // στον διακομιστή χρησιμοποιώντας την καθορισμένη μέθοδο HTTP "POST" ή "PATCH" ή "PUT" // Τιμή επιστροφής: // Η δομή της απόκρισης διακομιστή ανάλογα με τη μέθοδο HTTPM// Λειτουργία Κλήση HTTPMethodOnServer(HTTPMethod, HTTPConnection, ResourceAddress, SentData =Απροσδιόριστο) // Δημιουργία αιτήματος HTTP Headers = new Match(); Επικεφαλίδες.Εισαγωγή("Content-Type", "application/json"); Αίτημα HTTP = Νέο αίτημα HTTP ( ResourceAddress, Headers ); // Γράψτε το Json για δημιουργία και ενημέρωση δεδομένωνΑν HTTPMethod = "POST" ή HTTPMethod = "PATCH" ή HTTPMethod = "PUT" Τότε JSON Record = Νέα εγγραφή JSON ; ParametersJSON = Νέο ParametersRecordsJSON(Γραμμή WrapJSON.Auto,"",True); RecordJSON.SetString(ParametersJSON); WriteJSON(WriteJSON, SentData ); // SentDataαπαιτούνται σε αυτήν την περίπτωση LineForBody = RecordJSON.Close(); RequestHTTP.SetBodyFromString(StringForBody, TextEncoding.UTF8, UsingByteOrderMark.Να μην χρησιμοποιείται) τέλος εαν; // Καλέστε τη μέθοδο σύνδεσης HTTP ResponseHTTP = HTTPConnection.CallHTTPMethod(HTTPMethod, HTTPRequest) ; Δομή απαντήσεων= Νέα Δομή ; Δομή απαντήσεων.Insert("StatusCode", ResponseHTTP.StatusCode); // Διαβάστε JSON μόνο για τη μέθοδο GETΑν HTTPMmethod="GET"Τότε TryReadJSON = NewReadJSON ; ServerResponse = ResponseHTTP.GetBodyAsString("UTF-8"); ReadJSON.SetString(ServerResponse); Ταίριασμα = ReadJSON(ReadJSON,Αληθής); Δομή απόκρισης.Εισαγωγή("ServerResponse",Αλληλογραφία) ; Δομή απαντήσεων.Εισάγετε (" Απόκριση διακομιστήΑκρυπτογραφημένη", ServerResponse); Εξαίρεση Αναφορά(Περιγραφή σφάλματος()); Επιστροφή Απροσδιόριστη. EndAttempt; Τέλος εαν ; ΕΠΙΣΤΡΟΦΗ Δομή απαντήσεων ; EndFunction // Κλήση HTTPMethodOnServer()

Για λήψη από τον διακομιστή στο Μορφή JSONκατά την πρόσβαση στη διεπαφή REST μιας λύσης εφαρμογής, πρέπει να καθορίσετε τη διεύθυνση του πόρου $format=json.Ή καθορίστε τον τύπο MIME "application/json"στον τίτλο:

Headers = new Match(); Headings.Insert("Content-Type", "application/json") ; ResourceAddress = " WebBuh/odata/standard.odata/ ?$format=json" RequestHTTP = Νέο HTTPRequest (Διεύθυνση πόρων, κεφαλίδες);

Χαρακτηριστικό του παγκόσμιου πλαισίου ReadJSON (ReadJSON, True)

  • Εάν η δεύτερη παράμετρος έχει οριστεί σε True, διαβάστε το αντικείμενο JSONθα ολοκληρωθεί σε Αλληλογραφία.Εάν οριστεί σε False, τα αντικείμενα θα διαβαστούν σε ένα αντικείμενο τύπου Δομή.
  • Κατά την αποσειροποίηση αντικειμένων JSON σε μια δομή, πρέπει να γνωρίζετε τις απαιτήσεις των κλειδιών της δομής. Εάν, κατά την αποσειροποίηση ενός αντικειμένου, βρεθεί ένα όνομα ιδιότητας που δεν είναι έγκυρο για ένα κλειδί δομής, θα δημιουργηθεί μια εξαίρεση.

1. 1 Διαμόρφωση παραμέτρων σύνδεσης HTTP

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

Εικ. 1 Κατάλογος για τη ρύθμιση παραμέτρων για σύνδεση HTTP με εξωτερική ασφάλεια πληροφοριών μέσω της διεπαφής υπόλοιπου

Αφού πατήσετε το κουμπί Ελέγξτε την απόκριση του διακομιστή, καλείται μια διαδικασία κατά την οποία ο πελάτης θα προσπαθήσει να λάβει μια απάντηση από τον διακομιστή. Κωδικός προγράμματοςΗ διαδικασία είναι γραμμένη παρακάτω:

Διαδικασία &OnClient CheckConnection(Command) Διεύθυνση = Αντικείμενο.Διεύθυνση διακομιστή; Χρήστης = Αντικείμενο.Χρήστης; Password = Object.Password; Όνομα βάσης δεδομένων = Αντικείμενο.Όνομα; Λιμάνι = ? (Αντικείμενο. Λιμάνι<>0,Object.Port,80); HTTPConnection = Νέο Σύνδεση HTTP (Διεύθυνση, Θύρα, Χρήστης, Κωδικός πρόσβασης); ResourceAddress = DatabaseName + "/odata/standard.odata/ $μεταδεδομένα "; //Κλήση προσαρμοσμένη λειτουργία Δομή απαντήσεων= Β Καλέστε το HTTPMethodOnServer("GET" , HTTPConnection, ResourceAddress) ; Αν Δομή απαντήσεων <> Απροσδιόριστο Τότε General PurposeClientServer.NotifyUser("Κωδικός κατάστασης"+Δομή απόκρισης.Κωδικός κατάστασης); Ατελείωτες; Τέλος Διαδικασίας

Ο σκοπός αυτής της διαδικασίας είναι έλεγχος της υπηρεσίας καιεάν ο χρήστης εισήγαγε σωστά τις παραμέτρους σύνδεσης. Για να το κάνετε αυτό, απλώς εκτελέστε ένα αίτημα GET:
HTTPConnection.CallHTTPMmethod( "ΠΑΙΡΝΩ", Αίτημα HTTP);
χρησιμοποιώντας τη διεύθυνση πόρου:
Διεύθυνση Πόρων =Όνομα βάσης+ /odata/standard.odata/ “;
Μπορείτε επίσης να ελέγξετε την υπηρεσία στο πρόγραμμα περιήγησής σας χρησιμοποιώντας
URL
http://host/WebBuh/odata/standard.odata. Το αποτέλεσμα ενός τέτοιου ερωτήματος είναι μόνο μια λίστα οντοτήτων. Για να αποκτήσετε μια πλήρη περιγραφή της τυπικής διεπαφής OData (κατάλογος διαθέσιμων οντοτήτων, τα χαρακτηριστικά και οι λειτουργίες τους με τη μορφή XML-
έγγραφο.) πρέπει να εκτελέσετε ένα αίτημα GET χρησιμοποιώντας την παράμετρο $μεταδεδομένα. Διεύθυνση URL http://host/WebBuh/odata/standard.odata/$metadata. Λεπτομερής περιγραφήΤο έγγραφο διατίθεται στη διεύθυνση http://www.odata.org/documentation/ (στα αγγλικά).
Μπορείτε να λάβετε απαντήσεις στη μορφή Atom/XMLή JSON. Οι κωδικοί κατάστασης απόκρισης HTTP μπορούν να προβληθούν Αποκρίσεις στα εύρη:

  • 100-199 – ενημερωτικές απαντήσεις που υποδεικνύουν ότι το αίτημα του πελάτη έχει γίνει δεκτό και βρίσκεται υπό επεξεργασία.
  • 200-299 – σημαίνει ότι το αίτημα του πελάτη διεκπεραιώθηκε με επιτυχία.
  • 300-399 σημαίνει ότι το αίτημα δεν ολοκληρώθηκε και ο πελάτης πρέπει να κάνει κάποια ενέργεια για να ικανοποιήσει το αίτημα.
  • 400-499 – ενημερώνει για σφάλματα στην πλευρά της εφαρμογής πελάτη. Αυτοί οι κωδικοί ενδέχεται επίσης να υποδεικνύουν ότι απαιτούνται πρόσθετες πληροφορίες από τον πελάτη.
  • 500-599 - Ενημερώνει για ένα σφάλμα από την πλευρά του διακομιστή, υποδεικνύοντας ότι ο διακομιστής αντιμετώπισε σφάλμα και πιθανότατα δεν θα μπορέσει να εκπληρώσει το αίτημα του πελάτη.

1.2 Αναζήτηση αντικειμένου με αναγνωριστικό

Η επόμενη λειτουργία έχει σχεδιαστεί για την αναζήτηση ενός καταλόγου ή εγγράφου με ένα μοναδικό αναγνωριστικό στο διακομιστή. Εάν βρεθεί το αντικείμενο, τότε η συνάρτηση επιστρέφει την τιμή συμβολοσειράς του αναγνωριστικού (Ref_Key), διαφορετικά επιστρέφει απροσδιόριστος.Οι ακόλουθες παράμετροι μεταβιβάζονται στη συνάρτηση:

  • HTTPConnection – Αντικείμενο τύπου HTTPConnection
  • PublicationName – Το όνομα της δημοσιευμένης βάσης δεδομένων διακομιστή
  • Στοιχείο – αναγνωριστικό οντότητας αντικειμένου, για παράδειγμα, Κατάλογος_Οργανισμοίή Document_- κατάλογο του Οργανισμού.
  • Αναγνωριστικό – Το αναγνωριστικό του αντικειμένου προς αναζήτηση στον διακομιστή, π.χ. Organisation.UniqueIdentifier()
Λειτουργία &OnServer SearchObjectByGUID (HTTPConnection,PublicationName,Element,UniqueIdentifier) GUID = String(UniqueIdentifier) // μετατροπή στη συμβολοσειρά ResourceAddress = + Element+ "(guid""+ GUID+ "")?$format=json" ; Δομή απαντήσεων = ΒΚαλέστε το HTTPMethodOnServer("ΠΑΙΡΝΩ" , HTTPConnection, ResourceAddress) ; Αν Δομή απαντήσεων .Κωδικός κατάστασης >= 400 Στη συνέχεια //General PurposeClientServer.NotifyUser(Element+ "Error"+ResponseStructure.StatusCode+ //GeneralPurposeClientServer.NotifyUser(ResponseStructure.ServerResponseUndecrypted); Επιστροφή απροσδιόριστη; Τέλος εαν ; Ταίριασμα = Δομή απαντήσεων. ReplyServer a; Συστοιχία = Ταίριασμα ["τιμή"]; Αν Πίνακας = Απροσδιόριστος Τότε Αντιστοιχία Επιστροφής["Κλειδί_Κλειδί"] Άλλο Πίνακας Επιστροφής["Κλειδί_Κλειδί"]; τέλος εαν; EndFunction

Παράμετρος Διεύθυνση Πόρων χρησιμοποιείται για πρόσβαση σε μια υπηρεσία REST. Για να ελέγξετε τη λειτουργία της υπηρεσίας, μπορείτε να καθορίσετε τον πόρο στο πρόγραμμα περιήγησης ως εξής

http://(WebServerAddress)/(PublicationName)/odata/standard.odata/(Element)?(Parameters) ,Οπου

  • Διεύθυνση WebServer– Η διεύθυνση του διακομιστή ιστού στον οποίο δημοσιεύεται η υπηρεσία, για παράδειγμα Localhost
  • NamePublications- Ονομα βάση πληροφοριώναναφέρεται κατά τη δημοσίευση της απόφασης
  • /odata/standard.odata/ – Σήμα πρόσβασης στην τυπική διεπαφή OData
  • Στοιχείο – αναγνωριστικό πόρου ή προκαθορισμένοι πόροι. Για παράδειγμα, Catalog_Account(guid'value').
  • Επιλογές– παράμετροι πόρων. Χρησιμοποιείται, για παράδειγμα, για επιλογή, με τον αποδεκτό τρόπο για αιτήματα HTTP: ?key=value&key2=value2

1.3 Αναζήτηση αντικειμένου χρησιμοποιώντας πεδία αναζήτησης

Η ακόλουθη συνάρτηση που ορίζεται από το χρήστη έχει σχεδιαστεί για την αναζήτηση ενός αντικειμένου με πεδία αναζήτησης στην περίπτωση που το αντικείμενο είναι με αριθμό αναγνώρισης. Συμβολοσειρά αντικειμένων συνάρτησης Ref_Key -έναν αριθμό αναγνώρισης.

Λειτουργία &OnServer P searchObjectBySearchFields(HTTPConnection,PublicationName,Element,SearchFields)Κατάσταση = "" ;Για κάθε τιμή κλειδιού από βρόχο πεδίου αναζήτησης Κατάσταση = Κατάσταση + KeyValue.Key+ "eq"" + KeyValue.Value+ "" και "; EndCycle; Κείμενο Αίτησης =Lev(Κατάσταση, StrLength(Κατάσταση)-5); // αφαιρέστε τους τελευταίους 5 χαρακτήρες Διεύθυνση Πόρων= PublicationName+ "/odata/standard.odata/" +Element+ "?$filter=" + Κείμενο Αίτησης+ "&$format=json& $select=Ref_Key" ; //Κλήση της προσαρμοσμένης συνάρτησής μου Δομή απαντήσεων= CallHTTPMethodOnServer( "ΠΑΙΡΝΩ",HTTPConnection,ResourceAddress);Αν Δομή απαντήσεων .Κωδικός κατάστασης >= 400 Στη συνέχεια //General PurposeClientServer.NotifyUser(Element+ "Error"+ResponseStructure.StatusCode); //General PurposeClientServer.NotifyUser(ResponseStructure.ServerResponseUndecrypted); Επιστροφή απροσδιόριστο? τέλος εαν; Ταίριασμα = Δομή απαντήσεων. ReplyServer a; Συστοιχία = Ταίριασμα ["τιμή" ]; Αν Array = Undefined Τότε Return Match ["Ref_Key" ] Else Return Array ["Ref_Key" ]; τέλος εαν; EndFunction

Όπως φαίνεται από το σώμα της διαδικασίαςΠ searchObjectBySearchFields, η επιλογή ξεκινά με τη λέξη-κλειδί$φίλτροστη διεύθυνση του πόρου. Τυπική παράμετροςΠεδία αναζήτησης –αυτή είναι μια αλληλογραφία που περιέχει τα ονόματα και τις τιμές των λεπτομερειών.

Λάβετε υπόψη ότι τα ονόματα των λεπτομερειών μερικές φορές δεν είναι προφανή. Είναι απαραίτητο να θυμάστε ότι για βιβλία αναφοράς:

  • Κωδικός - κωδικός,
  • Περιγραφή – Όνομα
  • DeletionMark – σήμα διαγραφής,
  • IsFolder – πινακίδα ομάδας,
  • Parent_Key – γονέας.
  • Εάν το χαρακτηριστικό είναι τύπου αναφοράς, το επίθημα _Key θα πρέπει να προστεθεί στο όνομά του, για παράδειγμα Account_Key.

Για έγγραφα:

  • Αριθμός – αριθμός εγγράφου,
  • Ημερομηνία – ημερομηνία εγγράφου.

Λογικές πράξεις επιλογής

  • eq - Equal; /Catalog_Cities?$filter=Όνομα eq ‘Main’;
  • ne - Όχι ίσο. /Catalog_Cities?$filter=Όνομα ne 'Perm';
  • gt - Περισσότερα; /Catalog_Products?$filter=Τιμή gt 10?
  • ge - Μεγαλύτερο ή ίσο με; /Catalog_Products?$filter=Τιμή ge 10;
  • lt - Λιγότερο; /Catalog_Products?$filter=Τιμή lt 10;
  • le - Μικρότερο ή ίσο με; /Catalog_Products?$filter=Τιμή 10;
  • ή - Λογικό Ή; /Catalog_ Products ?$filter= Τιμή lt 10 ή Τιμή gt 100;
  • και - Λογικό ΚΑΙ; / Κατάλογος _Προϊόντα;$ φίλτρο =Τιμή g t 10 και Τιμή l t 100;
  • όχι - Άρνηση? /Κατάλογος_ Προϊόντα ?$filter=not (Τιμή eq 10);

Σημειώστε επίσης ότι η τιμή της πραγματικής παραμέτρου Στοιχείο(ή οντότητα)) που περνάω στη συνάρτηση σχηματίζεται σύμφωνα με τον ακόλουθο κανόνα:

Επίθημα Name Prefix_ConfigurationObjectName_Name.

Χρησιμοποιώντας την τυπική διεπαφή OData, μπορείτε να αποκτήσετε πρόσβαση στα ακόλουθα αντικείμενα ( Πρόθεμα ονόματος):

  • Κατάλογος - Κατάλογος;
  • Έγγραφο - Έγγραφο;
  • Document Journal - DocumentJournal;
  • Constant - Constant;
  • Πρόγραμμα ανταλλαγής - ExchangePlan;
  • Λογιστικό σχέδιο - ChartOfAccounts
  • Διάγραμμα τύπων υπολογισμού - ChartOfCalculationTypes;
  • Πίνακας χαρακτηριστικών τύπων - ChartOfCharacteristicTypes;
  • Μητρώο Πληροφοριών - InformationRegister;
  • Μητρώο συσσώρευσης - AccumulationRegister;
  • Μητρώο υπολογισμού - CalculationRegister;
  • Λογιστικό Μητρώο - AccountingRegister;
  • Επιχειρηματική διαδικασία - BusinessProcess;
  • Εργασία - Εργασία.

ConfigurationObjectName- την ιδιότητα «Όνομα» του αντικειμένου διαμόρφωσης όπως καθορίζεται στον διαμορφωτή.

Επίθημα ονόματος- που απαιτείται για την αποσαφήνιση του ονόματος του πόρου, προαιρετικό, μπορεί να λάβει τις ακόλουθες τιμές:

  • Το όνομα του πίνακα του αντικειμένου.
  • Ονομα εικονικό τραπέζιαντικείμενο;
  • RowType - σειρά του πίνακα του τμήματος του αντικειμένου.
  • RecordType - μια ξεχωριστή καταχώρηση μητρώου.

Παράμετροι πρόσβασης σε πόρους

Αφού σχηματίσετε το όνομα του πόρου, πρέπει να ορίσετε τις παραμέτρους για την πρόσβαση στον πόρο, για παράδειγμα, ?$filter= Εννοια &μορφή $=json& $επιλογή= Ref_Key ,

  • $φίλτρο- επιλογή κατά τη λήψη δεδομένων
  • μορφή $- υποδεικνύει τη μορφή των επιστρεφόμενων δεδομένων,
  • $επιλογή- λίστα των ιδιοτήτων οντοτήτων που θα συμπεριληφθούν στο αποτέλεσμα του ερωτήματος.
  • $μεταδεδομένα- επιστρέφει μια περιγραφή της τυπικής διεπαφής OData (χρησιμοποιείται χωρίς να καθορίζει επίθημα ονόματος, παράδειγμα σε μία από τις παραπάνω εικόνες).
  • $top- περιορισμός του αριθμού των επιστρεφόμενων εγγραφών.
  • $παράβλεψη- αφαιρεί τον καθορισμένο αριθμό εγγραφών από το αποτέλεσμα του ερωτήματος.
  • $count- επιστρέφει τον αριθμό των εγγραφών στην επιλογή ερωτήματος.
  • $inlinecount=allpage(=none)- προσθέτει πληροφορίες σχετικά με τον αριθμό των εγγραφών στο αποτέλεσμα του ερωτήματος
  • $orderby=<Реквизит1>αυξ.<Реквизит2>περιγραφ- ταξινόμηση του αποτελέσματος του ερωτήματος
  • επιτρέπεται μόνο- επιτρέπονται μόνο (χρησιμοποιούνται χωρίς το σύμβολο "$").

1.4 Λάβετε μια σειρά από καταχωρήσεις μητρώου πληροφοριών

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

NamePublications = "WebBuh"; Element = "InformationRegister_Name of Individuals"; Περίοδος = Απροσδιόριστος; ReferenceType Data= new Structure(); ρε DataReferenceType.Insert("Individual",Individual_Key); DataNON-Τύπος αναφοράς= new Structure(); DataNON-Τύπος αναφοράς.Insert("Individual_Type", "StandardODATA.Catalog_Individuals") Array = GetRegisterInfoSet(HTTPConnection,PublicationName,Element,Period, DimensionsReferenceType, Διαστάσεις που δεν είναι τύπου αναφοράς)

Το σώμα της συνάρτησης GetInfoRegisterRecordSet, που καλείται σε αυτό το παράδειγμα, φαίνεται παρακάτω

Λειτουργία &OnServer GetSetRecordRegisterInformation(HTTPConnection,PublicationName,Element,Period =Udefined, DimensionsReferenceType= Απροσδιόριστο Διαστάσεις που δεν είναι τύπου αναφοράς= Απροσδιόριστο) RequestText = "" ;Αν Περίοδος<>Απροσδιόριστο Τότε Μορφοποιημένη Περίοδος= Μορφή (Περίοδος,"DF=εεεε-ΜΜ-ηηΤΗΗ:λλ:δδ"); RequestText = "Period = datetime"" + FormattedPeriod + """ ; τέλος εαν; Αν DimensionsReferenceType <>Απροσδιόριστο Τότε για κάθε KeyValue Of DimensionsReferenceTypeΚύκλος Powered = ? ( ValueFilled(QueryText), "," ,""); RequestText = RequestText+ Ενεργοποιήθηκε + KeyValue.Key+ "=guid(""+ KeyValue.Value+ "")"; EndCycle; EndIf; Εάν Διαστάσεις που δεν είναι τύπου αναφοράς<> Απροσδιόριστο ΤότεΓια κάθε Βασική Έννοια του Διαστάσεις που δεν είναι τύπου αναφοράς Κύκλος Ρωτήθηκε = ? ( ValueFilled(QueryText), "," ,""); QueryText = QueryText + Fed+ Κ κλειδί Σημασία.Κλειδί + "=" + KeyValue.Value; EndCycle; τέλος εαν; ResourceAddress=PublicationName + " /odata/standard.odata/" + Στοιχείο + "("+ Κείμενο ερωτήματος + + ") ?$format=json"; //Κλήση της προσαρμοσμένης συνάρτησής μου Δομή απαντήσεων = Καλέστε το HTTPMethodOnServer("GET",HTTPConnection,ResourceAddress); Αν Δομή απαντήσεων.Κωδικός κατάστασης >= 400 Στη συνέχεια//General PurposeClientServer.NotifyUser(Element+ "Error"+ResponseStructure.StatusCode); //General PurposeClientServer.NotifyUser(ResponseStructure.ServerResponseUndecrypted); Επιστροφή απροσδιόριστο? τέλος εαν; Ταίριασμα = 0

Ξεκινώντας από τη δεύτερη έκδοση 8 της πλατφόρμας, οι χρήστες και οι προγραμματιστές έχουν την ευκαιρία να χρησιμοποιήσουν το αίτημα http απευθείας στο 1C. Το πρόγραμμα υποστηρίζει δύο τύπους αιτημάτων:

  • αιτήματα POST.
  • GET αιτήματα.

Έτσι, δημιουργήθηκε ένα αρκετά βολικό εργαλείο για την ανταλλαγή δεδομένων και την αλληλεπίδραση με υπηρεσίες web και υπηρεσίες που λειτουργούν μέσω http.

Αίτημα GET

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

  1. Ας πάρουμε το σώμα της κύριας σελίδας του ιστότοπού μας.
  2. Θα εργαστούμε για την ανακατεύθυνση του αιτήματος.
  3. Ας πάρουμε τη φωτογραφία από τον ιστότοπο.

Λήψη του σώματος του ιστότοπου

Ας ξεκινήσουμε με κάτι απλό. Στο Σχ..

Το αποτέλεσμα της εκτέλεσης αυτής της ενότητας κώδικα είναι ένα αρκετά μεγάλο κείμενο, το τελευταίο τμήμα του οποίου φαίνεται στο Σχ. 2.

Εικ.2

Στην πρώτη γραμμή κώδικα δημιουργούμε ένα αντικείμενο σύνδεσης στον πόρο http. Ένα αντικείμενο μπορεί να περιέχει τις ακόλουθες ιδιότητες:

  • Διακομιστής - συμβολοσειρά σύνδεσης που περιέχει τη διεύθυνση διακομιστή.
  • Θύρα – περιέχει έναν αριθμό που υποδεικνύει τη θύρα διακομιστή· από προεπιλογή, ανάλογα με τον τύπο σύνδεσης, μπορείτε να ορίσετε 80 για μη ασφαλείς συνδέσεις ή 443 για ασφαλείς συνδέσεις SSL.
  • Όνομα χρήστη – υποδεικνύεται εάν απαιτείται εξουσιοδότηση στον διακομιστή.
  • Κωδικός πρόσβασης – κωδικός πρόσβασης χρήστη στον καθορισμένο πόρο.
  • Proxy – μπορεί να περιέχει ένα αντικείμενο τύπου InternetProxy, που υποδεικνύεται όταν χρησιμοποιείται διακομιστής μεσολάβησης για την επικοινωνία με τον διακομιστή.
  • Ασφαλής σύνδεση – η προεπιλεγμένη τιμή είναι FALSE, η εναλλαγή σε TRUE υποδηλώνει τη χρήση του πρωτοκόλλου https.

Επιπλέον, το αντικείμενο HTTPConnection έχει τις δικές του μεθόδους κλήσης, οι οποίες σας επιτρέπουν να περιγράψετε πληρέστερα τον αλγόριθμο εκτέλεσης του προγράμματος χειρισμού:

  • CallHTTPmethod – περιέχει δύο απαιτούμενες παραμέτρους, HTTPmethod και HTTPrequest, υποστηρίζει τη δυνατότητα εγγραφής του σώματος απόκρισης στο αρχείο που καθορίζεται στην τρίτη παράμετρο.
  • Εγγραφή – χρησιμοποιώντας αίτημα PUT, στέλνει δεδομένα στον διακομιστή.
  • Τροποποίηση – τροποποιεί ένα αντικείμενο με την επεξεργασία αιτημάτων PATCH.
  • SendForProcessing – μια μέθοδος που υποδεικνύει τη χρήση ενός αιτήματος POST, όπως σε όλες τις προηγούμενες μεθόδους, πρέπει να περιέχει το κείμενο του αιτήματος και μπορεί επίσης να μεταδίδει τη διεύθυνση του αρχείου απόκρισης για την καταγραφή δεδομένων.
  • Λήψη - αυτό θα συζητηθεί με περισσότερες λεπτομέρειες παρακάτω.
  • Το GetHeadings είναι μια άλλη μέθοδος που θα χρησιμοποιηθεί στο άρθρο.
  • Το Delete είναι στην πραγματικότητα ένα αίτημα Διαγραφής που αφαιρεί τον πόρο που διαβιβάστηκε στο αίτημα από τον διακομιστή.

Στη δεύτερη γραμμή δημιουργούμε ένα αίτημα στον επιλεγμένο ιστότοπο, το κείμενο του αιτήματός μας περιέχει μία κάθετο, που σημαίνει ότι θέλουμε να λάβουμε αρχική σελίδα. Εάν η κάθετο ακολουθούνταν από οποιαδήποτε έκφραση, για παράδειγμα "σελίδα2" ή "ειδήσεις", θα είχαμε διαφορετική σελίδα.

Η τρίτη γραμμή εκτελεί το αίτημά μας στον διακομιστή.

Στο τέταρτο δείχνουμε το αποτέλεσμα.

Χειρισμός ανακατεύθυνσης αιτήματος http

Ας φανταστούμε μια κατάσταση όπου πρέπει να λάβουμε μέσω προγραμματισμού ένα αποτέλεσμα αναζήτησης μέσω οποιουδήποτε μηχανή αναζήτησηςμε το πλήκτρο "Αιτήματα σε 1". Το τμήμα του κώδικα που απαιτείται για την πρόσβαση στο GOOGLE φαίνεται στην Εικ. 3

Εικ.3

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

Κωδικός κατάστασης – η τυπική τιμή που καθορίζεται στο "Αίτημα για σχόλια", μπορεί να λάβει τις ακόλουθες τιμές:

  1. Εάν όλα είναι καλά, η τιμή θα επιστρέψει στην περιοχή από 100 έως 299.
  2. Σε περίπτωση ανακατεύθυνσης, θα επιστραφεί ένας κωδικός στην περιοχή από 300 έως 399, στην περίπτωσή μας, μια επιτυχημένη μόνιμη ανακατεύθυνση σε έναν πόρο θα καθοριστεί από τον κωδικό 301.
  3. Εάν υπάρχουν σφάλματα στο αίτημα, η παράμετρος θα λάβει μια τιμή από 400 έως 499.
  4. Μια τιμή στην περιοχή 500-599 υποδεικνύει προβλήματα με τον διακομιστή.

Κάθε σελίδα έχει έναν τίτλο, στο κείμενο του οποίου διακρίνονται πολλές παράμετροι (Εικ. 4):

  1. Διάγραμμα σύνδεσης (ό,τι έρχεται πριν από δύο κάθετες "//").
  2. Γραμμή διεύθυνσηςσυνδέσεις?
  3. Ονομα χρήστη και κωδικός;
  4. Θύρα και κεντρικός υπολογιστής για σύνδεση.

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

Εικ.5

Δεν υπάρχουν νέες λειτουργίες ή τρόποι εργασίας με αιτήματα εδώ, στην πραγματικότητα δημιουργούμε Έγγραφο κειμένουαπό το σώμα του ιστότοπου και εκκινήστε τη σελίδα στο πρόγραμμα περιήγησης.

Τοποθετούμε το αρχείο στη ρίζα του δίσκου D και το ονομάζουμε δοκιμή.

Παίρνουμε την εικόνα από τον ιστότοπο

Τίθεται ένα φυσικό ερώτημα: εάν δεν χρειαζόμαστε ολόκληρο τον ιστότοπο, αλλά χρειάζεται μόνο να αποκτήσουμε τα επιμέρους στοιχεία του, μπορεί να γίνει αυτό και πώς; Ναι μπορείς. Ο κώδικας προγράμματος που σας επιτρέπει να το κάνετε αυτό παρουσιάζεται στην Εικ. 6

Εικ.6

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

Χρησιμοποιήσαμε πρόγραμμα περιήγησης Opera για πρόσβαση στον ιστότοπο. Έχει ένα σημαντικό εργαλείο για εμάς: όταν κάνετε δεξί κλικ σε ένα στοιχείο, μπορείτε να καλέσετε ένα μενού περιβάλλοντος, ένα από τα στοιχεία του οποίου είναι "Προβολή κωδικού στοιχείου".

Χάρη σε αυτόν μπορούμε να λάβουμε τη διεύθυνση που θα χρησιμοποιηθεί στο αίτημα Εικ. 7.

Αίτημα POST

Σε αντίθεση με τα απλά αιτήματα λήψης, τα αιτήματα POST http έχουν σώμα κειμένου που μπορεί να αποθηκευτεί όπως σε ένα κανονικό μορφή κειμένου, και σε μορφή αρχείων με κατάληξη xml, soap, json. Υπάρχουν πολλά εργαλεία στο δίκτυο για τη δημιουργία κειμένων αιτημάτων που σας επιτρέπουν να εντοπίσετε σφάλματα και να παρακολουθήσετε την εκτέλεση ορισμένων αιτημάτων.

Στο 1C, για να ξεκινήσει ένα αίτημα με ένα συγκεκριμένο κείμενο, το αντικείμενο αίτησης HTTP έχει τη διαδικασία SetBodyFromString.