{"id":19762950,"url":"https://github.com/vbondarevsky/Connector","last_synced_at":"2025-04-30T14:31:33.530Z","repository":{"id":37451213,"uuid":"118373121","full_name":"vbondarevsky/Connector","owner":"vbondarevsky","description":"Коннектор: удобный HTTP-клиент для 1С:Предприятие 8","archived":false,"fork":false,"pushed_at":"2024-10-21T10:31:48.000Z","size":588,"stargazers_count":625,"open_issues_count":25,"forks_count":205,"subscribers_count":55,"default_branch":"master","last_synced_at":"2024-10-21T15:19:47.903Z","etag":null,"topics":["1c","1c-enterprise","aws4","cookies","cookies-url","digest-authentication","gzip","hacktoberfest","hacktoberfest2021","hmac-sha256","http","httpconnection","httprequest","httpresponse","json","multipart-formdata","post","ssl","url","x-www-form-urlencoded"],"latest_commit_sha":null,"homepage":"","language":"1C Enterprise","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vbondarevsky.png","metadata":{"files":{"readme":"README-EN.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-01-21T20:55:06.000Z","updated_at":"2024-10-21T10:31:52.000Z","dependencies_parsed_at":"2022-07-15T22:01:18.338Z","dependency_job_id":"590ec744-9167-42a3-8432-1bf334d7f87c","html_url":"https://github.com/vbondarevsky/Connector","commit_stats":{"total_commits":181,"total_committers":16,"mean_commits":11.3125,"dds":"0.16022099447513816","last_synced_commit":"735bd71b1f8b8c32c73b597e81d8dda172fd1920"},"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vbondarevsky%2FConnector","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vbondarevsky%2FConnector/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vbondarevsky%2FConnector/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vbondarevsky%2FConnector/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vbondarevsky","download_url":"https://codeload.github.com/vbondarevsky/Connector/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224214104,"owners_count":17274524,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["1c","1c-enterprise","aws4","cookies","cookies-url","digest-authentication","gzip","hacktoberfest","hacktoberfest2021","hmac-sha256","http","httpconnection","httprequest","httpresponse","json","multipart-formdata","post","ssl","url","x-www-form-urlencoded"],"created_at":"2024-11-12T04:07:32.054Z","updated_at":"2025-04-30T14:31:33.500Z","avatar_url":"https://github.com/vbondarevsky.png","language":"1C Enterprise","readme":"Publication on [Infostart](https://infostart.ru/public/709325/)\n\n\n[![Quality Gate Status](https://sonar.openbsl.ru/api/project_badges/measure?project=connector_en\u0026metric=alert_status)](https://sonar.openbsl.ru/dashboard?id=connector_en)\n[![Stars](https://img.shields.io/github/stars/vbondarevsky/Connector.svg?label=Github%20%E2%98%85\u0026a)](https://github.com/vbondarevsky/Connector/stargazers)\n[![Release](https://img.shields.io/github/tag/vbondarevsky/Connector.svg?label=Last%20release\u0026a)](https://github.com/vbondarevsky/Connector/releases)\n\n# Connector: handy HTTP-client for 1C:Enterprise 8 platform\nPython world has a very popular library working with HTTP requests - [Requests](http://docs.python-requests.org/en/master) (author: Kenneth Reitz).\nThe library allows you to send HTTP requests extremely easily. \nLiterally a single line of your code can receive or send data, not caring about making URL, encoding data etc. \n\n**Connector** is \"Requests\" for 1C world.\n\nThe original of the library in Russian is [here](./README.md)\n\n## Features\nMain library features:\n- Passing parameters in URLs\n- Working with requests and responses in `JSON` format\n- Submitting form data (form fields), `application/x-www-form-urlencoded`\n- Submitting form data (form fields and files), `multipart/form-data`\n- `GZip` compressed response support\n- `GZip` request body compression\n- `Basic`, `Digest` and `AWS4-HMAC-SHA256` authentification\n- Auto resolution of redirections\n- Cookies setting and getting\n- Session with state persistance across requests (cookies, authentification и пр.)\n- Reusing `HTTPConnection` in the session\n- Configurable retries of connection/sending request with exponential latency\n- Mobile platform support\n- And much more\n\n## Requirements\n- 1C:Enterprise platform version **8.3.10** and higher.\n- Mobile platform (tested version **8.3.15** only)\n\n## How to use\nTo use the library in your code simply copy the `HTTPConnector` common module to your configuration.\n\n## Library's power example\n*What is so good about the library? Let’s show you an example.*\n\nLet's get `JSON` data using `GET` request:\n\nThis is how it's done using built-in programming language\n```bsl\nSecureConnection = New OpenSSLSecureConnection(Undefined, New OSCertificationAuthorityCertificates);\nConnection = New HTTPConnection(\"api.github.com\", 443,,,, 30, SecureConnection);\t\nQuery = New HTTPRequest(\"/events\");\nResponse = Connection.Get(Query);\nStream = Response.GetBodyAsStream();\nEncoding = \"utf-8\"; // suppose we know that there is such encoding\n\nReader = New JSONReader;\nReader.OpenStream(Stream, Encoding); // Encoding in response header\nResult = ReadJSON(Reader);\nReader.Close();\n```\n\nThis is how it's done using **Connector**\n```bsl\nResult = HTTPConnector.GetJson(\"https://api.github.com/events\");\n```\n\nThat's all! You will get in `Result` a deserialized server response from `JSON`. \nAt the same time:\n- Connector parsed the URL\n- Established secured connection \n- Defined response encoding from headers\n- Deserialized `JSON`\n \nAnd this is a simple example enough. All the library's power follows further.\n\n## Passing parameters in URLs\nWorking with request parameters is very easy:\n```bsl\nRequestParameters = New Structure;\nRequestParameters.Insert(\"name\", StrSplit(\"John,Doe\", \",\"));\nRequestParameters.Insert(\"salary\", Format(100000, \"ЧГ=\"));\n\nResponse = HTTPConnector.GetJson(\"https://httpbin.org/anything/params\", RequestParameters);\t\n```\n\nYou can also pass an `Array` of values for a parameter (see. `name`).\n\nRequest parameters can be set:\n- In URL by hand\n- In `RequestParameters` parameter\n- Combined both\n\nThe result will be the same:\n- Connector will add parameters as key/value pairs in the URL after a question mark\n- Encode URL, using `URLEncoding`\n- Execute request\n\nYou can see that the URL has been correctly encoded by checking the reponse property `URL`\n```bsl\nResponse = HTTPConnector.Get(\"https://httpbin.org/anything/params\", RequestParameters);\n```\n`Response.URL` - https://httpbin.org/anything/params?name=%D0%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2\u0026name=%D0%9F%D0%B5%D1%82%D1%80%D0%BE%D0%B2\u0026salary=100000\n\n## Custom HTTP headers\nIn the main scenarios of using the library, headers are generated automatically.\nCustom headers can be set using `AdditionalParameters` parameter, property `Headers`.\n```bsl\nHeaders = New Map;\nHeaders.Insert(\"X-My-Header\", \"Hello!!!\");\nResult = HTTPConnector.GetJson(\"http://httpbin.org/headers\", Undefined, New Structure(\"Headers\", Headers));\n```\n\n## Working with JSON\nTo make it easier to work with JSON, there are methods: \n`GetJson`, `PostJson`, `PutJson`, `DeleteJson`.\nRequests are sent in JSON format, responses are converted into `Map`/`Structure` from JSON. \n```bsl\nResult = HTTPConnector.GetJson(\"http://httpbin.org/get\");\nResult = HTTPConnector.PostJson(\"http://httpbin.org/post\", New Structure(\"Title\", \"HTTPConnector\"));\nResult = HTTPConnector.PutJson(\"http://httpbin.org/put\", New Structure(\"Title\", \"HTTPConnector\"));\nResult = HTTPConnector.DeleteJson(\"http://httpbin.org/delete\", New Structure(\"Title\", \"HTTPConnector\"));\n```\n\nSerialization to JSON and deserialization from JSON are configured in parameters of `AdditionalParameters.JSONConversionParameters`.\n\n## Submitting form data\nSubmitting form data is easy.\nWe transfer (`Structure` or `Map`) in `POST` method and that's all. \n```bsl\nData = New Structure;\nData.Insert(\"comments\", \"Knock to the door\");\nData.Insert(\"custemail\", \"vasya@mail.ru\");\nData.Insert(\"custname\", \"Вася\");\nData.Insert(\"custtel\", \"112\");\nData.Insert(\"delivery\", \"20:20\");\nData.Insert(\"size\", \"medium\");\nData.Insert(\"topping\", StrSplit(\"bacon,mushroom\", \",\"));\n\nResponse = HTTPConnector.Post(\"http://httpbin.org/post\", Data);\n```\n\nThe `Data` will be encoded, `Content-Type` header value will be set to `application/x-www-form-urlencoded`.\n\n## Submitting file\nTo send a file you should create its description and put it to `AdditionalParameters.Files` parameter.\n```bsl\nFiles = New Structure;\nFiles.Insert(\"Name\", \"f1\");\nFiles.Insert(\"FileName\", \"file1.txt\");\nFiles.Insert(\"Data\", Base64Value(\"0J/RgNC40LLQtdGCINCc0LjRgCE=\"));\nFiles.Insert(\"Type\", \"text/plain\");\n\nResult = HTTPConnector.Post(\"https://httpbin.org/post\", Undefined, New Structure(\"Files\", Files));\n```\n\nThe file will be encoded in a request body, `Content-Type` header value will be set to `multipart/form-data`.\n\n## Submitting files and form data\nFor submitting form data and files in a single request you should create a description of files and from data and transfer them to `AdditionalParameters.Files`, `AdditionalParameters.Data` parameters.\n```bsl\nFiles = New Array;\nFiles.Add(New Structure(\"Name,Data,FileName\", \"f1\", Base64Value(\"ZmlsZTE=\"), \"file1.txt\"));\nFiles.Add(New Structure(\"Name,Data,FileName\", \"f2\", Base64Value(\"ZmlsZTI=\"), \"file2.txt\"));\n\nData = New Structure(\"field1,field2\", \"value1\", \"Значение2\");\n\nResult = HTTPConnector.Post(\"https://httpbin.org/post\", Undefined, New Structure(\"Files,Data\", Files, Data));\n```\n\nFiles and form data will be encoded in a request body, `Content-Type` header value will be set to `multipart/form-data`.\n\n## Sending arbitrary data\nArbitrary data (`String`, `BinaryData`) should be put to `Data` parameter.\n```bsl\nXML = \n\"\u003c?xml version=\"\"1.0\"\" encoding=\"\"utf-8\"\"?\u003e\n|\u003csoap:Envelope xmlns:xsi=\"\"http://www.w3.org/2001/XMLSchema-instance\"\" xmlns:xsd=\"\"http://www.w3.org/2001/XMLSchema\"\" xmlns:soap=\"\"http://schemas.xmlsoap.org/soap/envelope/\"\"\u003e\n|  \u003csoap:Body\u003e\n|    \u003cGetCursOnDate xmlns=\"\"http://web.cbr.ru/\"\"\u003e\n|      \u003cOn_date\u003e2019-07-05\u003c/On_date\u003e\n|    \u003c/GetCursOnDate\u003e\n|  \u003c/soap:Body\u003e\n|\u003c/soap:Envelope\u003e\";\n    \nHeaders = New Map;\nHeaders.Insert(\"Content-Type\", \"text/xml; charset=utf-8\");\nHeaders.Insert(\"SOAPAction\", \"http://web.cbr.ru/GetCursOnDate\");\nResponse = HTTPConnector.Post(\n    \"https://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx\",\n    XML, \n    New Structure(\"Headers\", Headers));\n```\n\n## Response content\nMethods that do not end with Json, return response as `Structure`:\n- `ExecutionTime` - Number - execution response duration in milliseconds\n- `Cookies` - cookies received from host\n- `Headers` - HTTP response headers\n- `IsPermanentRedirect` - permanent redirect flag\n- `IsRedirect` - redirect flag\n- `Encoding` - response text encoding\n- `Body` - response body\n- `StatusCode` - response status code\n- `URL` - final request URL\n\nYou can get the data from the response in JSON, text or binary data using methods described below.\n\n### Reading response as JSON\nMethod `AsJson` returns deserialized JSON data of a response.\n```bsl\nResult = HTTPConnector.AsJson(HTTPConnector.Get(\"http://httpbin.org/get\"));\n```\n\n### Reading response as Text\nMethod `AsText` returns response data as text.\n```bsl\nResult = HTTPConnector.AsText(HTTPConnector.Get(\"http://httpbin.org/encoding/utf8\"));\n```\nYou can set the encoding as an argument. \nIf the encoding argument is undefined, **Connector** will get its value from response headers.\n \n### Reading response as BinaryData\nMethod `AsBinaryData` converts response into `BinaryData`.\n```bsl\nResult = HTTPConnector.AsBinaryData(HTTPConnector.Get(\"http://httpbin.org/image/png\"));\n```\n\n### Reading XML response as XDTO \nMethod `КакXDTO` converts XML response into `XDTOObject`.\n```bsl\nResult = HTTPConnector.КакXDTO(Response);\n```\n\n## Request body GZip-encoding\n**Connector** can automatically compress the request body into `GZip`.\nTo do this you should add the header `Content-Encoding` = `gzip`.\n\n**Note**: the server must be configured appropriately to decompress incoming requests.\n\n```bsl\nJson = New Structure;\nJson.Insert(\"field\", \"value\");\nJson.Insert(\"field2\", \"value2\");\nHeaders = New Map;\nHeaders.Insert(\"Content-Encoding\", \"gzip\");\nResult = HTTPConnector.PostJson(\"http://httpbin.org/anything\", Json, New Structure(\"Headers\", Headers));\n```\n\n## Response body GZip-decoding\n**Connector** by default asks the host to encode responses into `GZip` format.\n\n**Note**: any response body encoding can be turned off by setting the header `Accept-Encoding` = `identity`.\n\nDecoding is perfomed in methods `GetJson`, `PostJson`, `PutJson`, `DeleteJson`, `AsJson`, `AsText`, `AsBinaryData`.\n```bsl\nResult = HTTPConnector.GetJson(\"http://httpbin.org/gzip\");\n```\n\n## Timeout\nTimeout can be set in `AdditionalParameters.Timeout` parameter.\n```bsl\nResponse = HTTPConnector.Get(\"https://httpbin.org/delay/10\", Undefined, New Structure(\"Timeout\", 1));\n```\nValue by default - 30 sec.\n\n## Basic-authentification\nBasic-authentification parameters can be set in `AdditionalParameters.authentification` parameter.\n```bsl\nAuthentication = New Structure(\"User, Password\", \"user\", \"pass\");\nResult = HTTPConnector.GetJson(\n    \"https://httpbin.org/basic-auth/user/pass\",\n    Undefined,\n    New Structure(\"Authentication\", Authentication));\n```\nor in `URL`\n```bsl\nResult = HTTPConnector.GetJson(\"https://user:pass@httpbin.org/basic-auth/user/pass\");\n```\n\n## Digest-authentification\nDigest-authentification parameters can be set in `AdditionalParameters.authentification` parameter.\nIn this case `Type` must be set to the value `Digest`.\n```bsl\nAuthentication = New Structure(\"User, Password, Type\", \"user\", \"pass\", \"Digest\");\nResult = HTTPConnector.GetJson(\n    \"https://httpbin.org/digest-auth/auth/user/pass\",\n    Undefined,\n    New Structure(\"Authentication\", Authentication));\n```\n\n## AWS4-HMAC-SHA256-authentification\nAWS4-HMAC-SHA256-authentification parameters can be set in `AdditionalParameters.authentification` parameter.\nIn this case `Type` must be set to the value `AWS4-HMAC-SHA256` and properties `AccessKeyID`, `SecretKey`, `Service`, `Region` must be filled.\n\n```bsl\nAuthentication = New Structure;\nAuthentication.Insert(\"Type\", \"AWS4-HMAC-SHA256\");\nAuthentication.Insert(\"AccessKeyID\", \"AKIAU00002SQ4MT\");\nAuthentication.Insert(\"SecretKey\", \"MySecretKey\");\nAuthentication.Insert(\"Region\", \"ru-central1\");\nAuthentication.Insert(\"Service\", \"s3\");\n\nFile = New BinaryData(\"my_file.txt\");\n\nHeaders = New Map;\nHeaders.Insert(\"Content-Type\", \"text/plain\");\nHeaders.Insert(\"x-amz-meta-author\", \"Vladimir Bondarevskiy\");\nHeaders.Insert(\"Expect\", \"100-continue\");\n\nAdditionalParameters = New Structure;\nAdditionalParameters.Insert(\"Headers\", Headers);\nAdditionalParameters.Insert(\"Authentication\", Authentication);\nAdditionalParameters.Insert(\"Timeout\", 300);\nResponse = HTTPConnector.Put(\"https://test.storage.yandexcloud.net/my_file.txt\", File, AdditionalParameters);\n```\n\n## Proxies\nProxy settings can be set in the `AdditionalParameters.Proxy` parameter.\n```bsl\nProxy = New InternetProxy;\nProxy.Set(\"http\", \"192.168.1.51\", 8192);\nResult = HTTPConnector.GetJson(\"http://httpbin.org/headers\", Undefined, New Structure(\"Proxy\", Proxy));\n```\nIf your configuration based on `SSL`, proxy settings will be taken from `SSL` by default.\n\n## Supported HTTP verbs\nSuch HTTP verbs as `GET`, `OPTIONS`, `HEAD`, `POST`, `PUT`, `PATCH`, `DELETE` have their corresponding methods in Connector.\nYou can send request for any of HTTP verbs calling `CallMethod` method.\n\n## Redirections\n**Connector** automatically allows redirections by default.\nLet's try to get a search result from Yandex (http://ya.ru).\n```bsl\nResult = HTTPConnector.Get(\"http://ya.ru/\", New Structure(\"q\", \"how to delete metadata cache infostart\"));\n```\nWhat will happen actually while executing this code line:\n- **Connector** will perform the request to URL `http://ya.ru/`\n- Host will require to perform a request with `https` scheme, i.e. will return the status code `302` and the header `Location`=`https://ya.ru/?q=...`\n- **Connector** will perform the redirect using `https` scheme\n- Host will require to perform a request with another URL, i.e. will return the status code `302` and the header `Location`=`https://yandex.ru/search/?text=...` \n- **Connector** will perform the redirect to URL `https://yandex.ru/search/?text=...`\n- Finally, the host will response with `html` result\n\nAuto redirection can be turned off in the parameter of argument `AdditionalParameters.AllowRedirect`.\n\n## Server SSL certificate verification\nThe `AdditionalParameters.VerifySSL` parameter is responsible for server SSL certificate verification and which root certificates to use.\n```bsl\nResult = HTTPConnector.Get(\"https://my_super_secret_server.ru/\", New Structure(\"VerifySSL\", False));\n```\n\n## Client certificates\nClient certificate can be set in the parameter `AdditionalParameters.ClientSSLCertificate`.\n```bsl\nClientSSLCertificate = New FileClientCertificate(\"my_cert.p12\", \"123\");\nResult = HTTPConnector.Get(\"https://my_super_secret_server.ru/\", New Structure(\"ClientSSLCertificate\", ClientSSLCertificate));\n```\n\n## Cookies\n**Connector** extracts cookies from response headers `Set-Cookie` for future use. \nReceived cookies can be found in a response property `Cookies`.\n\nYou can send custom cookies to the server using the parameter `AdditionalParameters.Cookies`.\n```bsl\nCookies = New Array;\nCookies.Add(New Structure(\"Description,Value\", \"k1\", String(New UUID)));\nCookies.Add(New Structure(\"Description,Value\", \"k2\", String(New UUID)));\nResponse = HTTPConnector.Get(\"http://httpbin.org/cookies\", Undefined, New Structure(\"Cookies\", Cookies));\n```\n\n## Session object\n**Connector** allows you to persist certain parameters across requests using Session object.\nFor this you need:\n- To create a `Session` object with `NewSession` method\n- To use the created `Session` object in every request method\n\nFor example, let's try to get a list of updates from the releases.1c.ru website.\n```bsl\nSession = HTTPConnector.NewSession();\nResponse = HTTPConnector.Get(\"https://releases.1c.ru/total\", Undefined, Undefined, Session);\n\nData = New Structure;\nData.Insert(\"execution\", ExtractExecution(Response));\nData.Insert(\"username\", Login);\nData.Insert(\"password\", Password);\nData.Insert(\"_eventId\", \"submit\");\nData.Insert(\"geolocation\", \"\");\nData.Insert(\"submit\", \"Login\");\nData.Insert(\"rememberMe\", \"on\");\n\nResponse = HTTPConnector.Post(Response.URL, Data, Undefined, Session);\n```\n\nWhat will happen:\n- **Connector** will perform `GET` request to URL `https://releases.1c.ru/total`\n- Host will require to perform request to URL `https://login.1c.ru/login?service=https%3A%2F%2Freleases.1c.ru%2Fpublic%2Fsecurity_check`\n- **Connector** will save received cookies and perform `GET` request to URL `https://releases.1c.ru/total`\n- Host will return the authorization form\n- We will extract the data from the form and send them to the host together with our login and password\n- **Connector** will perform `POST` request and send the form data with previously received cookies\n- Host will verify form parameters and if everything is ok issue a ticket and require to perform the request to `https://releases.1c.ru/total`\n- **Connector** will perform `GET` request to URL `https://releases.1c.ru/total` and transfer previously received cookies\n- Host will response with `html` result\n\nThen using `Session` you can make requests to the server and download updates.\n\n## Retry attempts of connection/sending request\n**Connector** can automatically retry connection/request sending attempts with delay.\nThis is useful if:\n- Connection is unstable\n- Host is overloaded and returns 500th codes\n- Host is under maintenance (reboot, configs change, update etc)\n- Host limits the number of requests from the client\n\nYou can enable retries using the parameter `AdditionalParameters.MaximumNumberOfRetries`, setting a value \u003e 0.\n\nParameter `AdditionalParameters.MaximumTimeOfRetries` allows you to limit the total time (timeouts + delays between retries).\nValue by default: 10 min.\n\nDelay duration between attempts:\n- Grows exponentially (1 sec, 2 sec, 4 sec, 8 sec, 16 sec, ...). Can be adjusted by the parameter \n`AdditionalParameters.ExponentialDelayRatio`\n- For staus codes `413`, `429` or `503` delay duration value is taken from the header `Retry-After` (duration in seconds or the exact date).\n\nThe parameter `AdditionalParameters.ToRetryForStatusesCodes` allows to set status codes, for which retry attempt should be run.\nIf this parameter is empty, retry attempt will run for all status codes \u003e=`500`.\n\n```bsl\nAdditionalParameters = New Structure;\nAdditionalParameters.Insert(\"MaximumNumberOfRetries\", 5);\nAdditionalParameters.Insert(\"Headers\", Headers);\n    \nURL = \"http://127.0.0.1:5000/retry_after_date\";\nResponse = HTTPConnector.Get(URL, Undefined, AdditionalParameters);\n```\n","funding_links":[],"categories":["Репозитории"],"sub_categories":["Репозитории сообщества"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvbondarevsky%2FConnector","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvbondarevsky%2FConnector","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvbondarevsky%2FConnector/lists"}