Http hizmeti 1c 8.3 örnek gönderi. Bir http istek yönlendirmesi üzerinde çalışmak

Platformun ikinci versiyonu 8'den başlayarak, kullanıcılar ve geliştiriciler, http isteğini doğrudan 1C'de kullanma fırsatına sahiptir. Aynı zamanda, program iki tür isteği destekler:

  • POST istekleri;
  • GET istekleri.

Böylece, veri alışverişi yapmak ve http üzerinden çalışan web servisleri ve servisleri ile etkileşim kurmak için oldukça uygun bir araç yaratıldı.

GET isteği

Tabii ki, sorgu kullanmanın en basit örnekleri, yeteneklerini birçok açıklama satırından çok daha iyi gösterir. Hadi deneyelim:

  1. Gelelim sitemizin ana sayfasının gövdesine;
  2. İsteğin yeniden yönlendirilmesini çözelim;
  3. Siteden bir fotoğraf çekelim.

Site gövdesini alma

Basitten başlayalım. İncirde ..

Kodun bu bölümünün yürütülmesinin sonucu, son bölümü Şekil 2'de gösterilen oldukça büyük bir metindir.

İncir. 2

Kodun ilk satırında bir http kaynak bağlantı nesnesi oluşturuyoruz. Bir nesne aşağıdaki özellikleri içerebilir:

  • Sunucu - sunucu adresini içeren bağlantı dizesi;
  • Bağlantı Noktası - sunucunun bağlantı noktasını gösteren bir sayı içerir, varsayılan olarak bağlantı türüne bağlı olarak, güvenli olmayan bağlantılar için 80 veya güvenli SSL için 443 belirtebilirsiniz.
  • Kullanıcı adı - sunucuda yetkilendirme gerekiyorsa belirtilir;
  • Şifre - belirtilen kaynak için kullanıcı şifresi;
  • Proxy - sunucuyla iletişim kurmak için bir proxy kullanıldığında belirtilen, InternetProxy türünde bir nesne içerebilir;
  • SecureConnection - varsayılan olarak YANLIŞ'tır, DOĞRU'ya geçiş, https protokolünün kullanıldığını gösterir.

Ek olarak, HTTPConnection nesnesinin, işleyici yürütme algoritmasının daha eksiksiz bir açıklamasına izin veren erişimi olan kendi yöntemleri vardır:

  • CallHTTPmethod - iki gerekli parametreyi içerir - HTTPmethod ve HTTPrequest, yanıt gövdesini üçüncü parametrede belirtilen dosyaya yazma yeteneğini destekler;
  • Yaz - bir PUT isteği kullanarak sunucuya veri gönderir;
  • Değiştir - PATCH isteklerini işleyerek nesneyi değiştirir;
  • SendForProcessing - önceki tüm yöntemlerde olduğu gibi, bir POST isteğinin kullanımını gösteren yöntem, istek metnini içermelidir, ayrıca veri yazmak için yanıt dosyasının adresini de aktarabilir;
  • Alın - aşağıda daha ayrıntılı olarak açıklanacaktır;
  • GetHeaders makalede kullanılacak bir diğer yöntem ise;
  • Sil aslında istekte iletilen kaynağı sunucudan silen bir Delite isteğidir.

İkinci satırla, seçilen siteye bir istek oluşturuyoruz, itirazımızın metni bir eğik çizgi içeriyor, bu da almak istediğimiz anlamına geliyor. ana sayfa... Eğik çizgiden sonra herhangi bir ifade, örneğin "sayfa2" veya "haberler" olsaydı, başka bir sayfa alırdık.

Üçüncü satır, sunucuya isteğimizi gerçekleştirir.

Dördüncüde sonucu gösteriyoruz.

Bir http istek yönlendirmesi üzerinde çalışmak

Herhangi bir arama sonucu programlı olarak almamız gerektiğinde bir durum hayal edelim. arama motoru"1s içinde İstekler" tuşu ile. GOOGLE'a erişmek için gereken kodun bölümü Şekil 3'te gösterilmektedir.

Şekil 3

Burada zaten aşina olduğumuz yapılara ek olarak Headers ve StateCode var. Onlarla ilgilenelim.

StatusCode, "Yorum Talebi"nde belirtilen standart bir değerdir ve aşağıdaki değerleri alabilir:

  1. Her şey yolundaysa, değer 100 ile 299 arasında dönecektir;
  2. Yönlendirme durumunda, 300 ile 399 aralığında bir kod döndürülecektir, bizim durumumuzda kaynağa başarılı bir kalıcı yönlendirme 301 kodu ile belirlenecektir;
  3. İstekte hata olması durumunda parametre 400 ile 499 arasında bir değer alacaktır;
  4. 500-599 aralığındaki bir değer, bir sunucu sorununu gösterir.

Her sayfanın, metninde birkaç parametrenin ayırt edilebildiği bir başlığı vardır (Şekil 4):

  1. Bağlantı şeması (iki eğik çizgiye kadar olan her şey "//");
  2. Adres çubuğu bağlantılar;
  3. Kullanıcı adı ve şifre;
  4. Bağlantı için bağlantı noktası ve ana bilgisayar.

Bu tam olarak SplitAddrString işlevinin gerçekleştirdiği dökümdür. Böylece yeni bir adres aldıktan sonra, sayfayı bilgisayarımıza kaydedebilir ve varsayılan tarayıcıda açabiliriz (Sayfa Al prosedürü).

Şekil 5

Burada isteklerle çalışmanın yeni işlevleri ve yolları yok, aslında biz yaratıyoruz. Metin belgesi sitenin gövdesinden ve sayfayı tarayıcıda başlatın.

Dosyayı D sürücüsünün kök dizinine koyuyoruz ve test diyoruz.

Siteden bir fotoğraf çekiyoruz

Doğal bir soru ortaya çıkıyor: sitenin tamamına bir bütün olarak değil, yalnızca bireysel öğelerini almamız gerekiyorsa, bu yapılabilir mi ve nasıl? Evet yapabilirsin. Bunu yapmanızı sağlayan program kodu Şekil 6'da gösterilmiştir.

Şekil 6

Şekilden de görebileceğiniz gibi, istek gövdesinde almamız gereken site yapı öğesinin kodu var. Bu kısım önceki açıklamamızda yoktu ve bu nokta üzerinde daha detaylı durmamız gerekiyor.

Bir tarayıcı kullandık Siteye erişmek için Opera. Tıkladığınızda bizim için önemli bir aracı var. sağ tık fareyi öğenin üzerine getirdiğinizde, öğelerden biri "Öğe kodunu görüntüle" olan bağlam menüsünü çağırabilirsiniz.

Onun sayesinde istekte kullanılacak adresi alabiliyoruz.

POST isteği

Basit Get isteklerinin aksine, POST http isteklerinin hem düz metin biçiminde hem de xml, soap, json uzantılı dosyalar olarak saklanabilen bir metin gövdesi vardır. Ağda, belirli isteklerin yürütülmesini hata ayıklamanıza ve izlemenize olanak tanıyan istek metinleri oluşturmak için birçok araç vardır.

1C'de, belirli bir metinle bir istek başlatmak için, HTTP istek nesnesinin bir SetBodyFromString prosedürü vardır.

1C Enterprise 8.3 platformunda HTTP hizmetleri oluşturmak mümkün hale geldi

Yerleşik dilin yardımıyla artık bir talebe yanıt oluşturmak mümkün. Aynı zamanda, kaynağın gövdesine, başlıklarına ve satırına kolayca erişebilirsiniz. rica etmek, ayrıca kod, gövde ve başlıklar oluşturmak da mümkündür. cevap kendi takdirine bağlı olarak.

SOAP platformunda bulunan web servisleriyle karşılaştırıldığında, HTTP servislerinin çeşitli avantajları vardır:

  • Bu tür hizmetler için istemci programlama kolaylığı;
  • Potansiyel olarak daha az miktarda veri aktarımı;
  • Potansiyel olarak daha az hesaplama yükü;
  • HTTP hizmetleri kaynak odaklıyken, SOAP hizmetleri eylem odaklıdır.

Veritabanı, http hizmetlerinin uygulanmasını gösterir.

http servis Fatura Listesi

Http hizmeti, URL kalıplarını kullandı, mülk işlemeyi uyguladı parametrelerURL nesne HTTPServiceRequest
V bu örnekçalışma tabanı ve kurumsal site arasında nasıl bir taban altlığı oluşturabileceğinizi gösterir
Demo veritabanına bağlantı yapılır” Ticaret Yönetimi 11", Adıyla ek bir özellik ayarlamanız gereken Web şifresi , erişim için şifreyi nerede saklayacağız.
Http isteği, URL parametrelerine iletilecektir: INN, kullanıcı adı ve şifre olarak.
Bir talep işlenirken ComConnector üzerinden UT ile bağlantı kurulur (frenler garantilidir) ve oradan seçim yapılır.
Bu çözümün hızını ve güvenliğini iddia etmiyorum, bu bir örnek

Yani. Meta veri ağacında yeni bir dal belirdi - HTTP hizmetleri
Biz yaratırız yeni hizmet, adını ve kök URL'sini belirtin (liste)
Http hizmetimizi aramak için kök url kullanılacaktır.
Ardından, şablon olarak “/ (Giriş) / (Şifre)” belirterek URL Şablonunu http hizmetine ekleyin
Böyle bir şablon, bir http isteğini işlerken, URL parametrelerinde karşılık gelen parametre yapısını ve değerlerini almaya izin verecektir.
Şimdi, URL modelimize “get” adında bir yöntem ekleyin, http yöntemi olarak GET'i seçin.
İşleyiciyi açın ve kodu yazın
Yöntem işleyici, türde bir değer döndürmesi gereken bir işlevdir. HTTPHizmetYanıtla

http hizmeti Sipariş Durumu

Örnek, POST yöntemiyle geçirilen değişkenlerin işlenmesini, bir html sayfası biçiminde bir yanıtın oluşturulmasını uygular.
Bu sefer veriler hs'nin bulunduğu veritabanından alınır, bu nedenle önceki http servisinden çok daha hızlı çalışır.
uygularken çalışma sistemi veritabanında (hizmetle birlikte) nesneler oluşturmak ve kaynak veritabanından veri geçişini yapılandırmak (örneğin, ayrı bir arka plan işleminde) mantıklıdır. Bir http isteği işlenirken, seçim doğrudan bulunduğu veritabanından yapılmalıdır.

yayın

Bir web sunucusunu kurmak ve yapılandırmak hakkında birçok bilgi vardır.
Buradan httpd-2.2.25-win32-x86-openssl-0.9.8y.exe derlemesini kullandım
"Sonraki-Sonraki-Bitir" yöntemine göre kurulur 🙂
Http hizmetlerini yayınlamak, web hizmetlerini yayınlamak ile aynı yerdedir ve özellikle farklı değildir.
Web sunucusunu “Konfigüratör” modunda kurduktan sonra “Yönetim” - “Web sunucusunda yayınlama” menüsüne gidin
"HTTP servisleri" sekmesinde, yayın adını, web sunucusunu, yayın dizinini ayarlayın ve hizmetlerimizi işaretleyin (benim durumumda ad "web", Apache web sunucusu 2.2)
Yayınlarken ilgili bloklar otomatik olarak httpd.conf yapılandırma dosyasına yazılır ve sunucu yeniden başlatılır (ilk yayında)
http servisine başvurma
Örnek: http: // sitem / web / hs / liste, nerede
benim sitem- sunucu adresi (web sunucusu yerel olarak kuruluysa - 127.0.0.1 kullanabilirsiniz)
- yayın sırasında belirtilen ad (takma ad)
hs- http servisleriyle çalışan sunucuyu bilgilendiren yolun zorunlu bir bölümü yer alacak
liste- web hizmetinin kök url'si

Test yapmak

fatura listesi

http://127.0.0.1/web/hs/list/7705260681/pswMP (Parola için UT'de ek özellik yapılandırmayı unutmayın)

Kullanıcının belge kaydına erişmek için TIN ve şifreyi içeren doğrudan bir bağlantıya eriştiği varsayılmaktadır.

Sipariş durumu

http://127.0.0.1/web/hs/check

İstek ve yanıt aynı URL'de bulunur. Sayfaya girerken, GET yöntemi tetiklenir ve bir html formu döndürülür

"Kontrol Et"e tıkladığınızda, POST yöntemi kullanılarak aynı URL'ye sipariş numarası gönderilir, yanıt, talep edilen siparişe ilişkin verilerle tamamlanan aynı talep formuyla döndürülür.

Ekli dosyada - 1C 8.3 için veritabanının boşaltılması. Konfigürasyon, 2 http servisini (yayından), UT 11 demo tabanı, “Sipariş” belgesi ile bir bağlantı kurmayı içerir.

Başlatma ve test için gerekenler

  • Web sunucusu
  • herhangi bir web tarayıcısı
  • mevcut sürüm1C: Kurumsal 8.3

Platform sürümü 8.3.9.2170 ile 1C'den siteye bilgi göndermek için bir prosedür geliştirirken bir sorunla karşılaştım: site geliştiricisi bana sadece PUT yöntemini kullanarak bir HTTP isteği kullanarak gerekli bilgileri yazma fırsatı verdi.

İki kere düşünmeden basit bir kod yazdım:

Bağlantı = Yeni HTTP Bağlantısı ("www.mysite.ru"); Başlıklar = Yeni Eşleşme; Başlıklar ["Content-Type"] = "application / x-www-form-urlencoded"; İstek = Yeni HTTPRequest ("/ api / order_items / 93076? Order_item = 30", Başlıklar); Connection.Write (İstek);

Yürütmenin sonuçlarına göre, depoda alınan malların tutarı, alıcının sitedeki siparişinin ilgili satırına girilmiş olmalıdır.

Ancak, muhtemelen zaten anladığınız gibi, hiçbir şey olmadı. Sitede hata olmadığından emin olduktan sonra (Chrome eklentisi aracılığıyla benzer bir istek göndererek) yerel bilgisayar web sunucusu ve denemeye başladı.

Garip bir şey hemen açıklığa kavuştu: yukarıdaki kod bir PUT değil, bir HEAD isteği oluşturur!

Apache günlüklerinde aşağıdakileri gördüm:

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

Biraz şaşırdım (kılavuzda siyah beyaz PUT ile yazılmıştır), ancak kafam karışmadı - yöntemi doğrudan çağırabilirsiniz:

Connection.CallHTTPMethod ("PUT", İstek);

Günlükler aynı:

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

"Belki yanlış bir şey yapıyorum?" - Kendime bir soru sordum. Ancak internette ve kılavuzlarda hiçbir ipucu yoktu. Henüz kimse bilimsel dürtme yöntemini iptal etmedi. İlk önce şunu yapmaya çalıştım:

Connection.CallHTTPMethod ("fwfw", İstek);

Aldığım günlüklerde:

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

Merakla, 1C'nin özellikle PUT yönteminin yerini aldığı anlamına gelir (neden 1C'yi memnun etmedi?).

Birkaç denemeden sonra bir seçenek buldum:

Connection.CallHTTPMethod ("PUT", İstek);

Aldığım günlüklerde:

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

Ve bu seçenek sitede zaten çalıştı ve herkes memnun kaldı.

Soruna daha doğru bir çözüm önerdi: istek gövdesini, herhangi birini, hatta boş olarak ayarlamak gerekiyor. Örneğin, bu seçenek çalışacaktır:

Bağlantı = Yeni HTTP Bağlantısı ("www.mysite.ru"); Başlıklar = Yeni Eşleşme; Başlıklar ["Content-Type"] = "application / x-www-form-urlencoded"; İstek = Yeni HTTPRequest ("/ api / order_items / 93076? Order_item = 30", Başlıklar); Request.SetBodyFromString ("", TextCode.UTF8, UsingByteOrderMark.Do not use); Connection.Write (İstek);

Ve muhtemelen, istek gövdesinde parametre değerlerini kendileri iletmek zaten oldukça doğrudur.

Sonuç şu şekildedir: 1C platformu, gövdesi olmayan bir PUT talebini hatalı kabul eder ve yöntemi HEAD ile değiştirir.

1C'nin POST isteğini gövdesi olmadan izlememesi ve herhangi bir şekilde GET'e dönüştürmemesi ilginçtir, spor ilgisi uğruna kontrol edilmiştir.

Ünlü Küçük Johnny'nin ünlü anekdottan dediği gibi: "Mantık nerede?"

Umarım birileri için yayınım bir cevap arayışında birkaç saatlik hayat kurtarır. =)))