Senden Sie eine Postanfrage ab 1s 8.3.

Drucken (Strg+P)

Den zweiten Teil können Sie sich ansehen

allgemeine Informationen

In Plattformversion 8.3.5.1068 , veröffentlicht im September 2015, erschien ein Mechanismus zur Integration von 1C mit externen Programmen durch Technologie REST-Schnittstelle. Als Zugriffsprotokoll nutzt die Plattform das OData-Protokoll. Es handelt sich um ein offenes Webprotokoll zum Abfragen und Aktualisieren von Daten. Es ermöglicht Ihnen, Daten mithilfe von HTTP-Befehlen als Anforderungen zu bearbeiten. In Version 8.3.5.1068 war es möglich, Antworten nur im Format zu empfangen Atom/XML . Ab Release 8.3.8.1652 im August 2017 erschien jedoch eine zweite Möglichkeit, Daten im JSON-Format (JavaScript Object Notation) zu empfangen. . Im Vergleich zu XML ist es für Menschen einfacher zu lesen und nimmt weniger Platz ein. Darüber hinaus verfügen alle Browser über integrierte Tools für die Arbeit mit JSON.

Die Arbeit mit dem OData-Protokoll auf der 1C: Enterprise-Plattform finden Sie im Buch 1C: Developer's Guide in Kapitel 17 Mechanismen von Internetdiensten, Absatz 17.2.1 Standard-OData-Schnittstelle. Sie können sich auch Beispiele für die Erweiterung der Unterstützung für das OData-Protokoll ansehen.

Vorteil der Verwendung REST-Schnittstelle. kommt zu dem Schluss, dass für den Zugriff auf Systemdaten aus einer externen Anwendung keine Änderung des Anwendungslösungscodes erforderlich ist (z. B. wenn die Anwendungslösung unterstützt wird). Um diesen Zugriff zu erhalten, müssen Sie Ihre Anwendung auf eine bestimmte Weise auf einem Webserver veröffentlichen und angeben, welche Konfigurationsobjekte auf diese Weise verwendet werden. Danach Drittsysteme kann über HTTP-Anfragen auf Ihre Anwendung zugreifen.

Die Veröffentlichung der Standard-OData-Schnittstelle erfolgt über den Veröffentlichungsdialog auf dem Webserver (Administration – Veröffentlichung auf Webserver) und im Buch 1C:Enterprise 8.3 beschrieben. „Administratorhandbuch“.
Wichtig! Damit Konfigurationsobjekte über die Standard-OData-Schnittstelle zugänglich sind, muss dies über die globale Kontextmethode aktiviert werden SetComposition ofStandardInterfaceOData().
Der Mechanismus zum Festlegen der Zusammensetzung der über die Standard-OData-Schnittstelle verfügbaren Objekte kann im Formular erfolgen externe Verarbeitung. Dies erfordert keine Änderung der Anwendungslösung.

Um mit einem externen REST-Webserver von 1C:Enterprise zu interagieren, verwenden wir die auf der Plattform verfügbaren Tools für die Arbeit mit HTTP:-Objekten HTTPConnection, HTTPRequest und HTTPResponse.

In dieser Artikelserie zeige ich Beispiele typischer Vorgänge mit der entsprechenden HTTP-Methode;

  • Daten empfangen - Methode ERHALTEN;
  • Erstellen einer Objekt-Methode POST;
  • Daten aktualisieren: Methode PATCH– In diesem Fall können Sie nur die Eigenschaften angeben, die aktualisiert werden müssen. Methode SETZEN– In diesem Fall müssen alle Eigenschaften des Unternehmens angegeben werden.
  • Daten löschen - Methode LÖSCHEN.

1. Beispiele zur Datenerfassung. HTTP-GET-Methode

Der Server wird eine auf dem Webserver veröffentlichte Datenbank mit dem Namen sein WebBuh(Demodatenbank „Enterprise Accounting 3.0“). Als Datenaustauschformat verwende ich das JSON-Format. Weitere Informationen zum Arbeiten mit JSON finden Sie in der verfügbaren Dokumentation. Um Daten vom Server mit der HTTP-GET-Methode zu empfangen, müssen Sie ein Objekt erstellen JSON lesen um JSON-Daten sequentiell aus einer Datei oder Zeichenfolge zu lesen. Um die sequentielle Aufzeichnung von Objekten und Texten auf dem Server mithilfe der HTTP POST PATCH PUT-Methode zu organisieren, müssen Sie ein Objekt erstellen JSON-Eintrag. Beachten Sie, dass die DELETE-Methode kein JSON erfordert.

Um den Ablauf des Lesens und Schreibens von JSON beim Zugriff auf eine REST-Schnittstelle zu veranschaulichen, rufe ich die folgende benutzerdefinierte Allzweckfunktion auf Rufen Sie HTTPMethodOnServer auf :

&Auf dem Server // <Описание функции>// // Optionen: // - Ein String mit dem Namen der HTTP-Methode für die Anfrage („POST“, „PATCH“, „PUT“, „GET“, „DELETE“ // - HTTPConnection-Objekt //<АдресРесурса>– String der http-Ressource, an die die HTTP-Anfrage gesendet wird. //<ОтправляемыеДанные>- Eine Struktur oder Übereinstimmung mit Daten, die an die angegebene Adresse zur Verarbeitung // auf dem Server mithilfe der angegebenen HTTP-Methode „POST“ oder „PATCH“ oder „PUT“ gesendet werden // Rückgabewert: // Die Struktur der Serverantwort abhängig von die HTTP-Methode// Funktion Rufen Sie HTTPMethodOnServer(HTTPMethod, HTTPConnection, ResourceAddress, SentData = auf Nicht definiert ) // Eine HTTP-Anfrage erstellen Header = new Match(); Überschriften.Einfügen(„Content-Type“, „application/json“); HTTP-Anfrage = Neue HTTP-Anfrage ( ResourceAddress, Header ); // Json schreiben, um Daten zu erstellen und zu aktualisieren Wenn HTTPMethod = „POST“ oder HTTPMethod = „PATCH“ oder HTTPMethod = „PUT“, dann JSON Record = New JSON Record ; ParameterJSON = Neu ParametersRecordsJSON(Line WrapJSON.Auto,"",True); RecordJSON.SetString(ParametersJSON); WriteJSON(WriteJSON, Gesendete Daten ); // Gesendete Daten sind in diesem Fall LineForBody = erforderlich RecordJSON.Close(); RequestHTTP.SetBodyFromString(StringForBody, TextEncoding.UTF8, UsingByteOrderMark. Nicht verwenden); endIf; // Rufen Sie die HTTPConnection-Methode auf ResponseHTTP = HTTPConnection.CallHTTPMethod(HTTPMethod, HTTPRequest) ; Antwortstruktur= Neue Struktur; Antwortstruktur.Insert("StatusCode", ResponseHTTP.StatusCode); // JSON nur für die GET-Methode lesen Wenn HTTPMethod="GET" Dann TryReadJSON = NewReadJSON ; ServerResponse = ResponseHTTP.GetBodyAsString("UTF-8"); ReadJSON.SetString(ServerResponse); Übereinstimmung = ReadJSON(ReadJSON,WAHR); Antwortstruktur.Insert("ServerResponse",Korrespondenz) ; Antwortstruktur.Einfügen (" ServerantwortUnentschlüsselt", ServerResponse); Ausnahme Bericht(ErrorDescription()); Rückgabe undefiniert; EndAttempt; EndIf ; Zurückkehren Antwortstruktur ; EndFunction // HTTPMethodOnServer() aufrufen

Um beim Zugriff auf die REST-Schnittstelle der Anwendungslösung vom Server im JSON-Format zu empfangen, müssen Sie in der Ressourcenadresse angeben $format=json. Oder geben Sie den MIME-Typ an „application/json“ im Titel:

Header = new Match(); Headings.Insert("Content-Type", „application/json“) ; ResourceAddress = " WebBuh/odata/standard.odata/ ?$format=json" RequestHTTP = Neu HTTPRequest(ResourceAddress, Header);

Merkmal des globalen Kontexts ReadJSON(ReadJSON, True)

  • Wenn der zweite Parameter auf True gesetzt ist, lesen Sie das Objekt JSON wird in abgeschlossen sein Korrespondenz.Wenn auf False gesetzt, werden Objekte in ein Objekt vom Typ eingelesen Struktur.
  • Wenn Sie JSON-Objekte in eine Struktur deserialisieren, müssen Sie die Strukturschlüsselanforderungen kennen. Wenn beim Deserialisieren eines Objekts ein Eigenschaftsname gefunden wird, der für einen Strukturschlüssel nicht gültig ist, wird eine Ausnahme ausgelöst.

1. 1 Konfigurieren von HTTP-Verbindungsparametern

Um den Client-Teil der Interaktion mit einem externen REST-Webserver zu organisieren, habe ich eine Client-Konfiguration basierend auf dem BSP von Grund auf erstellt. Mit dieser Konfiguration habe ich eine Referenz zum Einrichten von Verbindungsparametern erstellt (siehe Abb. 1).

Abb. 1 Verzeichnis zum Einstellen von Parametern für die HTTP-Verbindung zur externen Informationssicherheit über die Rest-Schnittstelle

Nach dem Drücken der Taste Überprüfen Sie die Serverantwort. Es wird eine Prozedur aufgerufen, bei der der Client versucht, eine Antwort vom Server zu erhalten. Programmcode Das Verfahren ist unten beschrieben:

&OnClient-Prozedur CheckConnection(Command) Address = Object.ServerAddress; Benutzer = Objekt.Benutzer; Passwort = Object.Password; Datenbankname = Objektname; Port = ? (Objekt.Port<>0,Objekt.Port,80); HTTPConnection = Neu HTTPConnection (Adresse, Port, Benutzer, Passwort); ResourceAddress = Datenbankname + "/odata/standard.odata/ $Metadaten "; //Eine benutzerdefinierte Funktion aufrufen Antwortstruktur= B Rufen Sie HTTPMethodOnServer auf("ERHALTEN" , HTTPConnection, ResourceAddress) ; Wenn Antwortstruktur <> Dann undefiniert General PurposeClientServer.NotifyUser("Statuscode"+Antwortstruktur.Statuscode); Endlos; EndProzedur

Der Zweck dieses Verfahrens ist Überprüfung des Dienstes und ob der Benutzer die Verbindungsparameter korrekt eingegeben hat. Führen Sie dazu einfach eine GET-Anfrage aus:
HTTPConnection.CallHTTPMethod( "ERHALTEN", HTTP-Anfrage);
Verwenden der Ressourcenadresse:
Ressourcenadresse =Basisname+ /odata/standard.odata/ “;
Sie können den Dienst auch in Ihrem Browser überprüfen
URL
http://host/WebBuh/odata/standard.odata. Das Ergebnis einer solchen Abfrage ist lediglich eine Liste von Entitäten. Zum Erhalten Gesamte Beschreibung Standard-OData-Schnittstelle (Liste der verfügbaren Entitäten, ihrer Attribute und Funktionen in Form von XML
Dokument.) müssen Sie eine GET-Anfrage mit dem Parameter durchführen $Metadaten. URL http://host/WebBuh/odata/standard.odata/$metadata. Detaillierte Beschreibung Das Dokument kann unter http://www.odata.org/documentation/ (auf Englisch) bezogen werden.
Sie können Antworten im Format erhalten Atom/XML oder JSON. HTTP-Antwortstatuscodes können in den folgenden Bereichen angezeigt werden:

  • 100-199 – Informationsantworten, aus denen hervorgeht, dass die Anfrage des Kunden angenommen wurde und bearbeitet wird.
  • 200-299 – bedeutet, dass die Anfrage des Kunden erfolgreich bearbeitet wurde.
  • 300-399 bedeutet, dass die Anfrage nicht abgeschlossen wurde und der Client Maßnahmen ergreifen muss, um die Anfrage zu erfüllen.
  • 400-499 – informiert über Fehler auf der Seite der Clientanwendung. Diese Codes können auch darauf hinweisen, dass vom Kunden zusätzliche Informationen benötigt werden.
  • 500-599 – Informiert über einen serverseitigen Fehler und weist darauf hin, dass auf dem Server ein Fehler aufgetreten ist und die Anfrage des Clients wahrscheinlich nicht erfüllt werden kann.

1.2 Suche nach einem Objekt anhand der ID

Die nächste Funktion dient der Suche nach einem Verzeichnis oder Dokument anhand einer eindeutigen Kennung auf dem Server. Wenn das Objekt gefunden wird, gibt die Funktion den String-Wert des Bezeichners (Ref_Key) zurück, andernfalls gibt sie zurück nicht definiert. Die folgenden Parameter werden an die Funktion übergeben:

  • HTTPConnection – Objekt vom Typ HTTPConnection
  • PublicationName – Der Name der veröffentlichten Serverdatenbank
  • Element – ​​Objektentitätsidentifikator, zum Beispiel Katalog_Organisationen oder Document_- Verzeichnis der Organisation.
  • Bezeichner – Der Bezeichner des zu durchsuchenden Objekts auf dem Server, z. B. Organization.UniqueIdentifier()
&OnServer-Funktion SearchObjectByGUID (HTTPConnection,PublicationName,Element,UniqueIdentifier) GUID = String(UniqueIdentifier); // in den String konvertieren ResourceAddress = + Element+ "(guid""+ GUID+ "")?$format=json" ; Antwortstruktur = BRufen Sie HTTPMethodOnServer auf("ERHALTEN" , HTTPConnection, ResourceAddress) ; Wenn Antwortstruktur .StatusCode >= 400 Dann //General PurposeClientServer.NotifyUser(Element+ "Error"+ResponseStructure.StatusCode+ //GeneralPurposeClientServer.NotifyUser(ResponseStructure.ServerResponseUndecrypted); Rückgabe undefiniert; EndIf ; Übereinstimmung = Antwortstruktur. ReplyServer a; Array = Übereinstimmung["Wert"]; Wenn Array = Undefiniert, dann Return Match["Ref_Key"] Else Return Array["Ref_Key"]; endIf; EndFunction

Parameter Ressourcenadresse Wird für den Zugriff auf einen REST-Dienst verwendet. Um den Betrieb des Dienstes zu überprüfen, können Sie die Ressource wie folgt im Browser angeben

http://(WebServerAddress)/(PublicationName)/odata/standard.odata/(Element)?(Parameters) ,Wo

  • Webserver-Adresse– Die Adresse des Webservers, auf dem der Dienst veröffentlicht ist, zum Beispiel Localhost
  • NameVeröffentlichungen- Name Informationsbasis bei Veröffentlichung der Entscheidung angegeben
  • /odata/standard.odata/ – Zeichen des Zugriffs auf die Standard-OData-Schnittstelle
  • Element – Ressourcenkennung oder vordefinierte Ressourcen. Beispiel: Catalog_Account(guid’value’).
  • Optionen– Ressourcenparameter. Wird beispielsweise zur Auswahl in der für HTTP-Anfragen akzeptierten Weise verwendet: ?key=value&key2=value2

1.3 Suche nach einem Objekt mithilfe von Suchfeldern

Die folgende benutzerdefinierte Funktion dient zur Suche nach einem Objekt anhand von Suchfeldern, wenn das Objekt anhand einer Identifikationsnummer ermittelt wird. Zeichenfolge für Funktionsobjekte Ref_Key –Kennzahl.

&OnServer-Funktion P searchObjectBySearchFields(HTTPConnection,PublicationName,Element,SearchFields) Bedingung = "" ; Für jeden Schlüsselwert aus der Suchfeldschleife Zustand = Zustand + KeyValue.Key+ "eq"" + Schlüsselwert.Wert+ "" und "; EndCycle; Abfragetext =Lev(Bedingung, StrLength(Bedingung)-5); // Letzte 5 Zeichen entfernen Ressourcenadresse= Publikationsname+ „/odata/standard.odata/“ +Element+ "?$filter=" + Abfragetext+ "&$format=json& $select=Ref_Key" ; //Meine benutzerdefinierte Funktion aufrufen Antwortstruktur= CallHTTPMethodOnServer( "ERHALTEN",HTTPConnection,ResourceAddress); Wenn Antwortstruktur .StatusCode >= 400 Dann //General PurposeClientServer.NotifyUser(Element+ "Error"+ResponseStructure.StatusCode); //General PurposeClientServer.NotifyUser(ResponseStructure.ServerResponseUndecrypted); Rückgabe undefiniert; endIf; Übereinstimmung = Antwortstruktur. ReplyServer a; Array = Übereinstimmung["Wert"]; Wenn Array = Undefiniert, dann Return Match ["Ref_Key" ] Else Return Array ["Ref_Key" ]; endIf; EndFunction

Wie aus dem Hauptteil des Verfahrens hervorgeht P searchObjectBySearchFields, die Auswahl beginnt mit dem Schlüsselwort$filterin der Ressourcenadresse. Formaler ParameterSuchfelder –Dabei handelt es sich um eine Korrespondenz, die die Namen und Werte der Details enthält.

Bitte beachten Sie, dass die Namen der Details manchmal nicht offensichtlich sind. Bei Nachschlagewerken ist Folgendes zu beachten:

  • Code - Code,
  • Beschreibung – Name
  • DeletionMark – Löschmarkierung,
  • IsFolder – Gruppenzeichen,
  • Parent_Key – übergeordneter Schlüssel.
  • Wenn es sich bei dem Attribut um einen Referenztyp handelt, sollte das Suffix _Key zu seinem Namen hinzugefügt werden, zum Beispiel Account_Key.

Für Dokumente:

  • Nummer – Dokumentennummer,
  • Datum – Dokumentdatum.

Logische Auswahloperationen

  • eq – Gleich; /Catalog_Cities?$filter=Name eq ‚Main‘;
  • ne – Nicht gleich; /Catalog_Cities?$filter=Name ist „Perm“;
  • gt – Mehr; /Catalog_Products?$filter= Preis gt 10;
  • ge – Größer oder gleich; /Catalog_Products?$filter=Preis ge 10;
  • lt – Weniger; /Catalog_Products?$filter=Preis lt 10;
  • le – Kleiner oder gleich; /Catalog_Products?$filter=Preis ab 10;
  • oder - Logisches ODER; /Catalog_ Products ?$filter= Preis lt 10 oder Preis gt 100;
  • und - Logisches UND; / Catalog _Products?$ filter =Preis g t 10 und Preis l t 100;
  • nicht - Negation; /Catalog_ Products ?$filter=not (Price eq 10);

Beachten Sie auch den Wert des tatsächlichen Parameters Element(oder Entität)), die ich an die Funktion übergebe wird nach folgender Regel gebildet:

Name Prefix_ConfigurationObjectName_Name Suffix.

Über die Standard-OData-Schnittstelle können Sie auf folgende Objekte zugreifen ( Namenspräfix):

  • Verzeichnis - Katalog;
  • Dokument - Dokument;
  • Dokumentenjournal - DocumentJournal;
  • Konstante – Konstante;
  • Austauschplan - ExchangePlan;
  • Kontenplan - ChartOfAccounts
  • Diagramm der Berechnungstypen - ChartOfCalculationTypes;
  • Merkmalstypendiagramm - ChartOfCharacteristicTypes;
  • Informationsregister - Informationsregister;
  • Akkumulationsregister - AccumulationRegister;
  • Berechnungsregister - CalculationRegister;
  • Buchhaltungsregister - Buchhaltungsregister;
  • Geschäftsprozess - BusinessProcess;
  • Aufgabe - Aufgabe.

ConfigurationObjectName- die Eigenschaft „Name“ des Konfigurationsobjekts, wie sie im Konfigurator angegeben ist.

Namenszusatz- wird zur Verdeutlichung des Ressourcennamens benötigt, optional, kann folgende Werte annehmen:

  • Der Name des tabellarischen Teils des Objekts;
  • Name virtueller Tisch Objekt;
  • RowType – Zeile des tabellarischen Teils des Objekts;
  • RecordType – ein separater Registereintrag.

Parameter für den Zugriff auf Ressourcen

Nachdem Sie den Ressourcennamen gebildet haben, müssen Sie die Parameter für den Zugriff auf die Ressource definieren, z. B. ?$filter= Bedeutung &$format=json& $select= Ref_Key ,

  • $filter- Auswahl beim Empfang von Daten
  • $format- gibt das Format der zurückgegebenen Daten an,
  • $wählen– Auflistung der Entitätseigenschaften, die in das Abfrageergebnis einbezogen werden;
  • $Metadaten– gibt eine Beschreibung der Standard-OData-Schnittstelle zurück (wird ohne Angabe eines Namenssuffixes verwendet, Beispiel in einem der Bilder oben);
  • $top- Begrenzung der Anzahl der zurückgegebenen Datensätze;
  • $überspringen– entfernt die angegebene Anzahl von Datensätzen aus dem Abfrageergebnis;
  • $count- gibt die Anzahl der Datensätze in der Abfrageauswahl zurück;
  • $inlinecount=allpage(=none)- Fügt dem Abfrageergebnis Informationen über die Anzahl der Datensätze hinzu
  • $orderby=<Реквизит1>aufsteigend,<Реквизит2>absteigend- Sortieren des Abfrageergebnisses
  • erlaubenNur- nur erlaubte (ohne das „$“-Zeichen verwendet).

1.4 Holen Sie sich ein Array von Informationsregistereinträgen

Schauen wir uns ein Beispiel für den Erhalt einer Reihe von Registereinträgen an, um Informationen über vollständige Namen von Personen zu erhalten, beispielsweise den Änderungsverlauf vollständiger Namen Individuell

NameVeröffentlichungen = "WebBuh"; Element = "InformationRegister_Name of Individuals"; Zeitraum = Undefiniert; ReferenceType-Daten= neue Struktur(); D DataReferenceType.Insert("Individual",Individual_Key); DataNON-ReferenceType= neue Struktur(); DataNON-ReferenceType.Insert("Individual_Type", "StandardODATA.Catalog_Individuals") Array = GetRegisterInfoSet(HTTPConnection,PublicationName,Element,Period, DimensionsReferenceType, Nicht-Referenztyp-Dimensionen)

Der Hauptteil der GetInfoRegisterRecordSet-Funktion, die in diesem Beispiel aufgerufen wird, ist unten dargestellt

&OnServer-Funktion GetSetRecordRegisterInformation(HTTPConnection,PublicationName,Element,Period =Undefiniert, DimensionsReferenceType= Undefiniert Nicht-Referenztyp-Dimensionen= Undefiniert) RequestText = "" ; Wenn Punkt<>Dann undefiniert Formatierter Zeitraum= Format (Punkt, „DF=yyyy-MM-ddTHH:mm:ss“); RequestText = "Period = datetime"" + FormattedPeriod + """ ; endIf; Wenn DimensionsReferenceType <>Dann für jeden Schlüsselwert undefiniert DimensionsReferenceType Einschaltzyklus = ? ( ValueFilled(QueryText), "," ,""); RequestText = RequestText+ Eingeschaltet + KeyValue.Key+ "=guid(""+ Schlüsselwert.Wert+ "")"; EndCycle; EndIf; If Nicht-Referenztyp-Dimensionen<> Dann undefiniert Für jede Schlüsselbedeutung von Nicht-Referenztyp-Dimensionen Zyklus Gefragt = ? ( ValueFilled(QueryText), "," ,""); Abfragetext = Abfragetext + Fed+ K keyBedeutung.Schlüssel + "=" + Schlüsselwert.Wert; EndCycle; endIf; ResourceAddress=Publikationsname + " /odata/standard.odata/" + Element + "("+ Abfragetext + + ") ?$format=json"; //Meine benutzerdefinierte Funktion aufrufen Antwortstruktur = Rufen Sie HTTPMethodOnServer auf("GET",HTTPConnection,ResourceAddress); Wenn Antwortstruktur.StatusCode >= 400 Dann//General PurposeClientServer.NotifyUser(Element+ "Error"+ResponseStructure.StatusCode); //General PurposeClientServer.NotifyUser(ResponseStructure.ServerResponseUndecrypted); Rückgabe undefiniert; endIf; Übereinstimmung = 0

Bei der Entwicklung eines Verfahrens zum Senden von Informationen von 1C an die Site mit Plattformversion 8.3.9.2170 bin ich auf ein Problem gestoßen: Der Site-Entwickler hat mir die Möglichkeit zur Aufzeichnung gegeben notwendige Informationen ausschließlich über eine HTTP-Anfrage mit der PUT-Methode.

Ohne lange nachzudenken, skizzierte ich einen einfachen Code:

Connection = New HTTPConnection("www.mysite.ru"); Kopfzeilen = Neue Übereinstimmung; Headers["Content-Type"] = "application/x-www-form-urlencoded"; Request = New HTTPRequest("/api/order_items/93076?order_item=30", Headers); Connection.Write(Request);

Aufgrund der Ausführungsergebnisse hätte die im Lager eingegangene Warenmenge in die entsprechende Zeile der Bestellung des Käufers auf der Website eingetragen werden müssen.

Wie Sie wahrscheinlich bereits verstanden haben, ist jedoch nichts passiert. Nachdem ich sichergestellt hatte, dass auf der Website keine Fehler aufgetreten waren (indem ich eine ähnliche Anfrage über ein Chrome-Plugin gesendet hatte), startete ich sie auf meinem lokalen Computer Webserver und begann zu experimentieren.

Sofort wurde etwas Merkwürdiges klar: Der obige Code generiert keine PUT-, sondern eine HEAD-Anfrage!

In den Apache-Protokollen habe ich Folgendes gesehen:

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

Ich war ein wenig überrascht (schließlich stand im Handbuch schwarz auf weiß PUT), aber ich war nicht verwirrt – Sie können die Methode direkt aufrufen:

Connection.CallHTTPMethod("PUT",Request);

Die Protokolle zeigen dasselbe:

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

„Vielleicht mache ich etwas falsch?“ - Ich habe mir eine Frage gestellt. Im Internet oder in den Handbüchern gab es aber keine Hinweise dazu. Nun, noch hat niemand die Methode des wissenschaftlichen Stocherns abgesagt. Zunächst habe ich Folgendes versucht:

Connection.CallHTTPMethod("fyvfyv",Request);

In den Protokollen, die ich erhalten habe:

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

Kurioserweise bedeutet dies, dass 1C speziell die PUT-Methode ersetzt (warum gefiel sie 1C nicht?).

Nach ein paar weiteren Versuchen kam ich auf Folgendes:

Connection.CallHTTPMethod("PUT",Request);

In den Protokollen, die ich erhalten habe:

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

Und diese Option hat auf der Website bereits funktioniert und alle waren zufrieden.

Er schlug eine korrektere Lösung des Problems vor: Sie müssen einen Anforderungstext angeben, einen beliebigen Textkörper, sogar einen leeren. Diese Option funktioniert beispielsweise:

Connection = New HTTPConnection("www.mysite.ru"); Kopfzeilen = Neue Übereinstimmung; 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);

Und es ist wahrscheinlich völlig richtig, die Parameterwerte selbst im Hauptteil der Anfrage zu übergeben.

Das Fazit lautet wie folgt: Die 1C-Plattform betrachtet eine PUT-Anfrage ohne Body als fehlerhaft und ersetzt die Methode durch HEAD.

Es ist merkwürdig, dass 1C eine POST-Anfrage ohne Text nicht verfolgt und sie nicht in ein GET umwandelt. Ich habe es zum Spaß überprüft.

Wie der bekannte Wowotschka aus dem berühmten Witz sagen würde: „Wo ist die Logik?“

Ich hoffe, dass meine Veröffentlichung jemandem bei der Suche nach einer Antwort mehrere Stunden seines Lebens erspart. =)))

Ab der zweiten Version 8 der Plattform haben Benutzer und Entwickler die Möglichkeit, http-Request direkt in 1C zu verwenden. Das Programm unterstützt zwei Arten von Anfragen:

  • POST-Anfragen;
  • GET-Anfragen.

Somit wurde ein recht komfortables Tool für den Datenaustausch und die Interaktion mit Webdiensten und über http laufenden Diensten geschaffen.

GET-Anfrage

Natürlich veranschaulichen die einfachsten Beispiele für die Verwendung von Abfragen ihre Fähigkeiten viel besser als viele Beschreibungszeilen. Lass es uns versuchen:

  1. Lassen Sie uns den Hauptteil unserer Website abrufen.
  2. Wir werden daran arbeiten, die Anfrage umzuleiten.
  3. Machen wir das Bild von der Website.

Abrufen des Site-Textes

Beginnen wir mit etwas Einfachem. In Abb..

Das Ergebnis der Ausführung dieses Codeabschnitts ist ein ziemlich großer Text, dessen letzter Abschnitt in Abb. 2 dargestellt ist.

Abb.2

In der ersten Codezeile erstellen wir ein Verbindungsobjekt zur http-Ressource. Ein Objekt kann die folgenden Eigenschaften enthalten:

  • Server – Verbindungszeichenfolge, die die Serveradresse enthält;
  • Port – enthält eine Nummer, die den Server-Port angibt; je nach Verbindungstyp können Sie standardmäßig 80 angeben ungesicherte Verbindungen oder 443 für SSL-gesichert.
  • Benutzername – wird angezeigt, wenn eine Autorisierung auf dem Server erforderlich ist;
  • Passwort – Benutzerpasswort für die angegebene Ressource;
  • Proxy – kann ein Objekt vom Typ InternetProxy enthalten, das angezeigt wird, wenn ein Proxy für die Kommunikation mit dem Server verwendet wird;
  • Sichere Verbindung – der Standardwert ist FALSE, der Wechsel zu TRUE zeigt die Verwendung des https-Protokolls an.

Darüber hinaus verfügt das HTTPConnection-Objekt über eigene Methoden, deren Aufruf eine ausführlichere Beschreibung des Handler-Ausführungsalgorithmus ermöglicht:

  • CallHTTPmethod – enthält zwei erforderliche Parameter, HTTPmethod und HTTPrequest, unterstützt die Möglichkeit, den Antworttext in die im dritten Parameter angegebene Datei zu schreiben;
  • Schreiben – sendet Daten mithilfe einer PUT-Anfrage an den Server;
  • Ändern – ändert ein Objekt durch die Verarbeitung von PATCH-Anfragen;
  • SendForProcessing – eine Methode, die die Verwendung einer POST-Anfrage angibt, wie alle vorherigen Methoden, muss den Text der Anfrage enthalten und kann auch die Adresse der Antwortdatei zur Datenaufzeichnung übermitteln;
  • Empfangen – dies wird weiter unten ausführlicher besprochen;
  • GetHeadings ist eine weitere Methode, die im Artikel verwendet wird;
  • Beim Löschen handelt es sich eigentlich um eine Delite-Anfrage, die die in der Anfrage übergebene Ressource vom Server entfernt.

In der zweiten Zeile erstellen wir eine Anfrage an die ausgewählte Site. Der Text unserer Anfrage enthält einen Schrägstrich, was bedeutet, dass wir empfangen möchten Startseite. Würde dem Schrägstrich ein beliebiger Ausdruck folgen, zum Beispiel „Seite2“ oder „Nachrichten“, würden wir eine andere Seite erhalten.

Die dritte Zeile führt unsere Anfrage an den Server aus.

Im vierten zeigen wir das Ergebnis.

Behandelt die Umleitung von HTTP-Anfragen

Stellen wir uns eine Situation vor, in der wir programmgesteuert ein Suchergebnis über irgendein Suchergebnis erhalten müssen Suchmaschineüber die Taste „Anfragen in 1s“. Der für den Zugriff auf GOOGLE erforderliche Codeabschnitt ist in Abb. 3 dargestellt

Abb. 3

Hier gibt es zusätzlich zu den uns bereits bekannten Strukturen Header und Statuscode. Beschäftigen wir uns mit ihnen.

Statuscode – Standardwert, der in „Anfrage nach Kommentaren“ angegeben wird, kann die folgenden Werte annehmen:

  1. Wenn alles in Ordnung ist, wird der Wert im Bereich von 100 bis 299 zurückgegeben;
  2. Im Falle einer Umleitung wird ein Code im Bereich von 300 bis 399 zurückgegeben, in unserem Fall wird eine erfolgreiche dauerhafte Umleitung zu einer Ressource durch Code 301 bestimmt;
  3. Bei Fehlern in der Anfrage nimmt der Parameter einen Wert zwischen 400 und 499 an;
  4. Ein Wert im Bereich 500–599 weist auf Probleme mit dem Server hin.

Jede Seite hat einen Titel, in dessen Text mehrere Parameter unterschieden werden können (Abb. 4):

  1. Verbindungsdiagramm (alles, was vor zwei Schrägstrichen „//“ steht);
  2. Verbindungsadresszeile;
  3. Benutzername und Passwort;
  4. Port und Host, zu dem eine Verbindung hergestellt werden soll.

Diese Aufteilung wird von der SplitAddressLine-Funktion durchgeführt. Nachdem wir so eine neue Adresse erhalten haben, können wir die Seite auf unserem Computer speichern und im Standardbrowser öffnen (GetPage-Verfahren).

Abb.5

Es gibt hier keine neuen Funktionen oder Möglichkeiten, mit Anfragen zu arbeiten, wir erstellen sie tatsächlich Text dokument aus dem Hauptteil der Website und starten Sie die Seite im Browser.

Wir legen die Datei im Stammverzeichnis von Laufwerk D ab und nennen sie test.

Wir nehmen das Bild von der Website

Es stellt sich natürlich die Frage: Wenn wir nicht die gesamte Website benötigen, sondern nur ihre einzelnen Elemente benötigen, kann dies dann erfolgen und wie? Ja, du kannst. Der Programmcode, der Ihnen dies ermöglicht, ist in Abb. 6 dargestellt

Abb.6

Wie Sie der Abbildung entnehmen können, befindet sich im Hauptteil der Anfrage der Code des Site-Strukturelements, das wir erhalten müssen. Dieser Teil war in unserer vorherigen Beschreibung nicht enthalten und wir müssen näher auf diesen Punkt eingehen.

Wir haben einen Browser verwendet Opera, um auf die Website zuzugreifen. Es enthält ein wichtiges Tool für uns, wenn Sie klicken Rechtsklick Bewegen Sie die Maus über ein Element, das Sie aufrufen können Kontextmenü, einer der Punkte ist „Elementcode anzeigen“.

Ihm ist es zu verdanken, dass wir die Adresse erhalten können, die in der Anfrage verwendet wird (Abb. 7).

POST-Anfrage

Im Gegensatz zu einfachen Get-Anfragen verfügen POST-HTTP-Anfragen über einen Textkörper, der entweder im Klartext oder in Form von Dateien mit der Erweiterung xml, Soap, JSON gespeichert werden kann. Im Netzwerk gibt es eine ganze Reihe von Tools zum Erstellen von Anforderungstexten, mit denen Sie die Ausführung bestimmter Anforderungen debuggen und überwachen können.

Um in 1C eine Anfrage mit einem bestimmten Text zu starten, verfügt das HTTP-Anfrageobjekt über die SetBodyFromString-Prozedur.



Wird geladen...
Spitze