XML-RPC - Hızlı Kılavuz
RPC, Uzaktan Prosedür Çağrısı anlamına gelir. Adından da anlaşılacağı gibi, uzak bir bilgisayarda bulunan bir prosedürü veya işlevi çağırmak için bir mekanizmadır. RPC, Web'den çok daha eski bir teknolojidir. Etkili bir şekilde, RPC, geliştiricilere bir ağ üzerinden çağrılabilen arabirimleri tanımlamak için bir mekanizma sağlar. Bu arayüzler, tek bir işlev çağrısı kadar basit veya büyük bir API kadar karmaşık olabilir.
XML-RPC nedir?
XML-RPC, bilgisayarların diğer bilgisayarlardaki prosedürleri çağırmasını kolaylaştıran en basit ve en kusursuz web hizmeti yaklaşımlarından biridir.
XML-RPC, programların bir ağ üzerinden işlev veya prosedür çağrıları yapmasına izin verir.
XML-RPC, bilgileri bir istemci bilgisayardan bir sunucu bilgisayara geçirmek için HTTP protokolünü kullanır.
XML-RPC, isteklerin ve yanıtların doğasını açıklamak için küçük bir XML sözlüğü kullanır.
XML-RPC istemcisi, XML isteğinde bir prosedür adı ve parametreleri belirtir ve sunucu XML yanıtında bir hata veya bir yanıt döndürür.
XML-RPC parametreleri, türlerin ve içeriğin basit bir listesidir - yapılar ve diziler, mevcut en karmaşık türlerdir.
XML-RPC, nesne kavramına ve diğer XML sözcük dağarcığını kullanan bilgileri dahil etme mekanizmasına sahip değildir.
Bununla birlikte, XML-RPC ve web hizmetleri ile Web, bilgisayarların sıkı sıkıya bağlı yollar boyunca bilgi alışverişinde bulundukları bir prosedürel bağlantılar koleksiyonu haline gelir.
XML-RPC, 1998'in başlarında ortaya çıktı; UserLand Software tarafından yayınlandı ve başlangıçta Frontier ürünlerinde uygulandı.
Neden XML-RPC?
Birden fazla bilgi işlem ortamını entegre etmeniz gerekiyorsa, ancak karmaşık veri yapılarını doğrudan paylaşmanız gerekmiyorsa, XML-RPC'nin hızlı ve kolay bir şekilde iletişim kurmanıza olanak tanıdığını göreceksiniz.
Tek bir ortamda çalışsanız bile, RPC yaklaşımının farklı veri modellerine veya işleme beklentilerine sahip programları bağlamayı kolaylaştırdığını ve yeniden kullanılabilir mantığa kolay erişim sağlayabildiğini görebilirsiniz.
XML-RPC, bilgisayarlar arasında çok çeşitli bağlantılar kurmak için mükemmel bir araçtır.
XML-RPC, entegratörlere bilgi alışverişi için standart bir kelime dağarcığı ve yaklaşım kullanma fırsatı sunar.
XML-RPC'nin en belirgin uygulama alanı, Java'nın Perl, Python, ASP vb. İle konuşmasına izin veren farklı ortam türlerini birbirine bağlamaktır.
XML-RPC'ye Teknik Genel Bakış
XML-RPC, nispeten küçük üç bölümden oluşur:
XML-RPC data model : Parametrelerin, dönüş değerlerinin ve hataların (hata mesajları) aktarılmasında kullanılan bir dizi tür.
XML-RPC request structures : Yöntem ve parametre bilgilerini içeren bir HTTP POST isteği.
XML-RPC response structures : Dönüş değerlerini veya hata bilgilerini içeren bir HTTP yanıtı.
Sonraki üç bölümde tüm bu üç bileşeni inceleyeceğiz.
XML-RPC özelliği, tür kombinasyonlarını temsil eden altı temel veri türünü ve iki bileşik veri türünü tanımlar.
XML-RPC'de Temel Veri Türleri
Tür | Değer | Örnekler |
---|---|---|
int veya i4 | - 2.147.483.648 ile 2.147.483.647 arasında 32-bit tamsayılar. | <int> 27 </int> <i4> 27 </i4> |
çift | 64 bit kayan noktalı sayılar | <double> 27.31415 </double> <double> -1.1465 </double> |
Boole | doğru (1) veya yanlış (0) | <boolean> 1 </boolean> <boolean> 0 </boolean> |
dizi | ASCII metni, birçok uygulama Unicode'u desteklese de | <string> Merhaba </string> <string> çılgınlar! @ </string> |
dateTime.iso8601 | ISO8601 biçimindeki tarihler: CCYYMMDDTHH: MM: SS | <dateTime.iso8601> 20021125T02: 20: 04 </dateTime.iso8601> <dateTime.iso8601> 20020104T17: 27: 30 </dateTime.iso8601> |
Base64 | RFC 2045'te tanımlandığı gibi Base 64 olarak kodlanmış ikili bilgiler | <base64> SGVsbG8sIFdvcmxkIQ == </base64> |
Bu temel türler her zaman değer öğelerinin içine alınır . Dizeler (ve yalnızca dizeler) bir değer öğesi içine alınabilir, ancak dize öğesini atlar . Bu temel türler, iki daha karmaşık tür, diziler ve yapılar halinde birleştirilebilir. Diziler sıralı bilgileri temsil ederken, yapılar hashtables, ilişkilendirilebilir diziler veya özellikler gibi ad-değer çiftlerini temsil eder.
Diziler, değerler listesini tutan bir veri öğesini içeren dizi öğesi ile gösterilir. Diğer veri türleri gibi, dizi öğesi de bir değer öğesi içine alınmalıdır . Örneğin, aşağıdaki dizi dört dize içerir:
<value>
<array>
<data>
<value><string>This </string></value>
<value><string>is </string></value>
<value><string>an </string></value>
<value><string>array.</string></value>
</data>
</array>
</value>
Aşağıdaki dizi dört tam sayı içerir:
<value>
<array>
<data>
<value><int>7</int></value>
<value><int>1247</int></value>
<value><int>-91</int></value>
<value><int>42</int></value>
</data>
</array>
</value>
Diziler, burada gösterildiği gibi farklı türlerin karışımlarını da içerebilir:
<value>
<array>
<data>
<value><boolean>1</boolean></value>
<value><string>Chaotic collection, eh?</string></value>
<value><int>-91</int></value>
<value><double>42.14159265</double></value>
</data>
</array>
</value>
Çok boyutlu diziler oluşturmak basittir - bir dizinin içine bir dizi eklemeniz yeterlidir:
<value>
<array>
<data>
<value>
<array>
<data>
<value><int>10</int></value>
<value><int>20</int></value>
<value><int>30</int></value>
</data>
</array>
</value>
<value>
<array>
<data>
<value><int>15</int></value>
<value><int>25</int></value>
<value><int>35</int></value>
</data>
</array>
</value>
</data>
</array>
</value>
Basit bir yapı şöyle görünebilir:
<value>
<struct>
<member>
<name>givenName</name>
<value><string>Joseph</string></value>
</member>
<member>
<name>familyName</name>
<value><string>DiNardo</string></value>
</member>
<member>
<name>age</name>
<value><int>27</int></value>
</member>
</struct>
</value>
Bu şekilde, herhangi bir programlama dili tarafından desteklenen hemen hemen tüm veri türlerini uygulayabilirsiniz.
XML-RPC istekleri, XML içeriği ve HTTP başlıklarının bir kombinasyonudur. XML içeriği, parametreleri iletmek için veri yazma yapısını kullanır ve hangi prosedürün çağrıldığını tanımlayan ek bilgiler içerirken, HTTP üstbilgileri, isteği Web üzerinden geçirmek için bir sarmalayıcı sağlar.
Her istek, kök öğesi bir methodCall öğesi olan tek bir XML belgesi içerir . Her methodCall öğesi, bir methodName öğesi ve bir params öğesi içerir. MethodName ederken eleman tanımlar prosedürün ismi, çağrılacak params eleman parametreleri ve değerlerinin bir listesini içerir. Her bir parametre öğesi, sırayla değer öğeleri içeren bir parametre öğeleri listesi içerir .
Örneğin, bir Double parametresi (yarıçap için) alan circleArea adlı bir yönteme istek iletmek için XML-RPC isteği şöyle görünür:
<?xml version="1.0"?>
<methodCall>
<methodName>circleArea</methodName>
<params>
<param>
<value><double>2.41</double></value>
</param>
</params>
</methodCall>
Bu istekler için HTTP üstbilgileri gönderenleri ve içeriği yansıtacaktır. Temel şablon aşağıdaki gibi görünür:
POST /target HTTP 1.0
User-Agent: Identifier
Host: host.making.request
Content-Type: text/xml
Content-Length: length of request in bytes
Örneğin, circleArea yöntemi / xmlrpc'de dinleyen bir XML-RPC sunucusundan kullanılabiliyorsa , istek şöyle görünebilir:
POST /xmlrpc HTTP 1.0
User-Agent: myXMLRPCClient/1.0
Host: 192.168.124.2
Content-Type: text/xml
Content-Length: 169
Birleştirilmiş, isteğin tamamı şöyle görünecektir:
POST /xmlrpc HTTP 1.0
User-Agent: myXMLRPCClient/1.0
Host: 192.168.124.2
Content-Type: text/xml
Content-Length: 169
<?xml version="1.0"?>
<methodCall>
<methodName>circleArea</methodName>
<params>
<param>
<value><double>2.41</double></value>
</param>
</params>
</methodCall>
Dikkatlice oluşturulmuş bir yüke sahip sıradan bir HTTP isteğidir.
Yanıtlar, fazladan birkaç bükülme ile isteklere çok benzer. Yanıtı başarılı olursa - prosedür sonuçlarını, tespit doğru yürütülür ve döndürüldü - XML-RPC yanıtı o hariç, pek bir istek gibi görünecek methodCall öğesi ile değiştirilmiştir methodResponse elemanı ve hiçbir orada methodName elemanı:
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value><double>18.24668429131</double></value>
</param>
</params>
</methodResponse>
Bir XML-RPC yanıtı yalnızca bir parametre içerebilir.
Bu parametre bir dizi veya yapı olabilir, bu nedenle birden çok değer döndürmek mümkündür.
Her zaman yanıt olarak bir değer döndürmek gerekir. Bir "başarı değeri" - belki de bir Boole değeri true (1) olarak ayarlanmış.
İstekler gibi, yanıtlar da HTTP içinde paketlenir ve HTTP başlıklarına sahiptir. Mesajda bir hata olsa bile, tüm XML-RPC yanıtları 200 OK yanıt kodunu kullanır. Üstbilgiler, isteklere benzer ortak bir yapı kullanır ve tipik bir başlık kümesi şöyle görünebilir:
HTTP/1.1 200 OK
Date: Sat, 06 Oct 2001 23:20:04 GMT
Server: Apache.1.3.12 (Unix)
Connection: close
Content-Type: text/xml
Content-Length: 124
XML-RPC yalnızca HTTP 1.0 desteği gerektirir, ancak HTTP 1.1 uyumludur.
İçerik Türü, metin / xml olarak ayarlanmalıdır.
Content-Length üstbilgisi, yanıtın uzunluğunu bayt cinsinden belirtir.
Hem üstbilgiler hem de bir yanıt yükü içeren eksiksiz bir yanıt şu şekilde görünür:
HTTP/1.1 200 OK
Date: Sat, 06 Oct 2001 23:20:04 GMT
Server: Apache.1.3.12 (Unix)
Connection: close
Content-Type: text/xml
Content-Length: 124
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value><double>18.24668429131</double></value>
</param>
</params>
</methodResponse>
Yanıt XML-RPC sunucusundan XML-RPC istemcisine iletildikten sonra bağlantı kapatılır. Takip isteklerinin ayrı XML-RPC bağlantıları olarak gönderilmesi gerekir.
XML-RPC hataları bir tür yanıttır. XML-RPC isteğinin işlenmesinde bir sorun varsa, methodResponse öğesi, bir params öğesi yerine bir hata öğesi içerecektir. Hata öğesi, params öğesi gibi, bir şeylerin ters gittiğini gösteren yalnızca tek bir değere sahiptir. Bir hata yanıtı şöyle görünebilir:
<?xml version="1.0"?>
<methodResponse>
<fault>
<value><string>No such method!</string></value>
</fault>
</methodResponse>
Bir hatanın ayrıca bir hata kodu olacaktır. XML-RPC, hata kodlarını hiçbir şekilde standartlaştırmaz. Hataları nasıl ele aldıklarını görmek için belirli paketlerin belgelerine bakmanız gerekir.
Bir arıza yanıtı aynı zamanda şöyle de görünebilir:
<?xml version="1.0"?>
<methodResponse>
<fault>
<value>
<struct>
<member>
<name>code</name>
<value><int>26</int></value>
</member>
<member>
<name>message</name>
<value><string>No such method!</string></value>
</member>
</struct>
</value>
</fault>
</methodResponse>
XML-RPC'yi göstermek için, XML-RPC mesajlarını işlemek için Java kullanan bir sunucu oluşturacağız ve bu sunucudaki prosedürleri çağırmak için bir Java istemcisi oluşturacağız.
Görüşmenin Java tarafı, şu adresten ulaşılabilen Apache XML Projesi'nin Apache XML-RPC'sini kullanır. http://xml.apache.org/xmlrpc/
Tüm .jar dosyalarını uygun yola yerleştirin ve JAVA kullanarak bir istemci ve bir küçük XML-RPC sunucusu oluşturmamıza izin verin.
XML-RPC İstemcisi
Sum işlevi adlı bir işlevi çağırmak için bir XML-RPC istemcisi yazalım . Bu işlev iki parametre alır ve bunların toplamını döndürür.
import java.util.*;
import org.apache.xmlrpc.*;
public class JavaClient
{
public static void main (String [] args)
{
try {
XmlRpcClient client = new XmlRpcClient("http://localhost/RPC2");
Vector params = new Vector();
params.addElement(new Integer(17));
params.addElement(new Integer(13));
Object result = server.execute("sample.sum", params);
int sum = ((Integer) result).intValue();
System.out.println("The sum is: "+ sum);
} catch (Exception exception) {
System.err.println("JavaClient: " + exception);
}
}
}
Yukarıdaki örnek istemcide ne olduğunu görelim.
Java paketi org.apache.xmlrpc, XML-RPC Java istemcileri ve XML-RPC sunucusu, örneğin, XmlRpcClient için sınıfları içerir.
Java.util paketi Vector sınıfı için gereklidir.
Server.execute (...) işlevi , isteği sunucuya gönderir. Yordam toplamı (17,13), sunucuda yerel bir yordammış gibi çağrılır. Bir prosedür çağrısının dönüş değeri her zaman bir Nesnedir.
Burada "örnek", sunucuda tanımlanan bir işleyiciyi belirtir.
Prosedür çağrısının tüm parametrelerinin her zaman bir Vector'de toplandığını unutmayın.
XmlRpcClient sınıfı, sunucu makinesinin "web adresi" ve ardından / RPC2 belirtilerek oluşturulur.
localhost - yerel makine anlamına gelir
Localhost yerine bir IP numarası belirtebilirsiniz, ör. 194.80.215.219
Xyz.dyndns.org gibi bir alan adı belirtebilirsiniz.
Etki alanı adıyla birlikte xyz.dyndns.org:8080 olarak bir bağlantı noktası numarası belirtebilirsiniz. Varsayılan bağlantı noktası 80'dir
Uzak prosedür çağrısının sonucunun her zaman bir Nesne olduğunu ve uygun türe dönüştürülmesi gerektiğini unutmayın.
Sorunlar ortaya çıktığında (bağlantı yok vb.), Bir İstisna atılır ve catch deyimi kullanılarak yakalanması gerekir .
Yukarıdaki çağrı nedeniyle, bir istemci sunucuya aşağıdaki mesajı gönderir. Bunun server.execute (...) tarafından dahili olarak ele alındığını ve bununla hiçbir ilginizin olmadığını unutmayın.
<?xml version="1.0" encoding="ISO-8859-1"?>
<methodCall>
<methodName>sample.sum</methodName>
<params>
<param>
<value><int>17</int></value>
</param>
<param>
<value><int>13</int></value>
</param>
</params>
</methodCall>
XML-RPC Sunucusu
Aşağıda Java ile yazılmış XML-RPC Sunucusunun kaynak kodu verilmiştir. Org.apache.xmlrpc'de bulunan yerleşik sınıfları kullanır . *
import org.apache.xmlrpc.*;
public class JavaServer
{
public Integer sum(int x, int y)
{
return new Integer(x+y);
}
public static void main (String [] args)
{
try {
System.out.println("Attempting to start XML-RPC Server...");
WebServer server = new WebServer(80);
server.addHandler("sample", new JavaServer());
server.start();
System.out.println("Started successfully.");
System.out.println("Accepting requests. (Halt program to stop.)");
} catch (Exception exception)
{
System.err.println("JavaServer: " + exception);
}
}
}
Yukarıdaki örnek sunucuda ne yaptığımızı görelim.
Org.apache.xmlrpc paketi, XML-RPC Sunucusu uygulaması için WebSunucusu sınıfını içerir.
Uzaktan çağrılan prosedür toplamı , bir sınıfta genel bir yöntem olarak uygulanır.
Aynı sunucu sınıfının bir örneği, daha sonra istemci tarafından erişilebilen bir işleyiciyle ilişkilendirilir.
Sunucu, bağlantı noktası numarasıyla başlatılır (burada: 80).
Sorunlar ortaya çıktığında, bir İstisna atılır ve catch deyimi kullanılarak yakalanması gerekir .
Verilen örnek istemcide belirtilen çağrı için, sunucu aşağıdaki yanıtı istemciye geri gönderir:
<?xml version="1.0" encoding="ISO-8859-1"?>
<methodResponse>
<params>
<param>
<value><int>30</int></value>
</param>
</params>
</methodResponse>
Artık sunucunuz hazırdır, bu nedenle aşağıdaki şekilde derleyin ve çalıştırın:
C:\ora\xmlrpc\java>java JavaServer
Attempting to start XML-RPC Server...
Started successfully.
Accepting requests. (Halt program to stop.)
Şimdi işlevselliği test etmek için bu sunucuya aşağıdaki şekilde bir çağrı yapın:
C:\ora\xmlrpc\java>java JavaClient
30
Bu eğitimde, XML-RPC'nin ne olduğunu ve neden XML-RPC'ye ihtiyacımız olduğunu öğrendiniz. Veri modelinin yanı sıra istemci ile sunucu arasında değiş tokuş edilecek istek ve yanıt mesajı formatını tartıştık. XML-RPC istemcisi ve sunucusunun bilgi alışverişinde nasıl çalıştığını göstermek için bir örnek verdik.
XML-RPC, sınırlı yeteneklere sahip çok basit bir kavramdır. Bu sınırlamalar birçok yönden XML-RPC'nin en çekici özelliğidir, çünkü protokolü uygulama ve birlikte çalışabilirliğini test etme zorluğunu önemli ölçüde azaltırlar.
XML-RPC basit olsa da, basit araçların yaratıcı uygulaması sofistike ve güçlü mimariler oluşturabilir. Çok çeşitli farklı sistemlerin iletişim kurması gereken durumlarda, XML-RPC en uygun en düşük ortak payda olabilir.
Sıradaki ne?
Bir sonraki adım, WSDL ve SABUN öğrenmektir.
WSDL
WSDL, Web hizmetlerini ve bunlara nasıl erişileceğini açıklayan XML tabanlı bir dildir.
WSDL, Web hizmeti için ileti biçimi ve protokol ayrıntılarıyla birlikte bir web hizmetini açıklar.
WSDL hakkında daha fazla bilgi edinmek istiyorsanız, lütfen WSDL eğitimimize göz atın .
SABUN
SOAP, uygulamaların HTTP üzerinden bilgi alışverişi yapmasına izin veren basit bir XML tabanlı protokoldür.
SABUN hakkında daha fazla bilgi edinmek istiyorsanız, lütfen SABUN öğreticimizi inceleyin .