SOAP

**SOAP (Simple Object Access Protocol - Basit Nesne Erişim Protokolü)**, Service-oriented Architecture felsefesini pratiğe uyarlayan iki interface'den biridir. Üzerinde bulunan Universal Description Discovery and Integration (UDDI) ile birlikte hizmet yönelimli mimarinin pratikte kullanılmasını mümkün kılar.

SOAP (Basit Nesne Erişim Protokolü) dağıtık uygulamalarda ve web servislerinin haberleşmesinde kullanılmak üzere tasarlanan, RPC (Remote Procedure Call) modelini kullanan, istemci/sunucu mantığına dayalı bir protokoldür. Daha genel olarak SOAP, web üzerinden fonksiyonları kullanmak için geliştirilmiş bir sistemin XML tabanlı kurallar topluluğudur. SOAP ile ilgili bütün mesajlar XML formatında iletilir ve temel olarak bir SOAP mesajı 3 şekilde oluşabilir:

* Metot Çağırımı
* Cevap Mesajı
* Hata Mesajı

## Bir SOAP mesajının yapısı

### Envelope
Bütün SOAP mesajlarının içinde olduğu elemandır. SOAP mesajına ilişkin XML belgesinin root elemanı olmak zorundadır. Envelope elemanı içinde Body veya Header gibi elemanlar bulunur. Envelope elemanının içinde her zaman bir Body elemanı vardır fakat Header elemanı olmak zorunda değildir. SOAP mimarisine göre eğer Envelope elemanı içinde Header elemanı varsa bu eleman Envelope elemanının içindeki ilk eleman olmalıdır. Soap kullanan mimarilerde kesinlikle erişim protokolü olarak TCP kullanılmalıdır.

### Header
SOAP mesajlarındaki Header elemanını HTML standartlarında bulunan  etiketlerine benzetebiliriz. Header bölümü metot çağrımı ile doğrudan ilişkili değildir. Header bölümü ile meta-data dediğimizi bilgiler gönderilir.

### Body
Body elemanı SOAP mesajının en önemli kısmını oluşturur. Body bölümünde web metodunun adı ve metodun parametrik bilgileri XML formatında gönderilir. Cevap mesajında ise metodun geri dönüş değeri Body bölgesine eklenir. Metodun parametrik yapısının bu şekilde XML formatında yazılmasına SOAP Serialization denir. Son olarak hata mesajlarında ise Body bölümünde hatanın adı ve tanımı gibi bilgiler bulunur.

SOAP isteklerinin oluşturulması ve yanıtların işlenmesi kolaydır. İlk olarak, bir müşteri tarafından bir XML belgesi kullanılarak bir hizmet talebi oluşturulur. Ardından, bir SOAP istemcisi, XML belgesini bir SOAP sunucusuna gönderir. Sunucu SOAP mesajını aldığında, mesajı istenen sunucu tarafı uygulamaya bir hizmet çağrısı olarak gönderir. İstemci için istenen parametreleri, dönüş değerlerini ve verileri içeren bir yanıt, önce SOAP istek işleyicisine ve ardından istekte bulunan istemciye döndürülür. Hem SOAP istekleri hem de yanıtları, Güvenli Köprü Metni Aktarım Protokolü (HTTPS) veya HTTP gibi benzer bir protokol kullanılarak taşınır.

## Özellikleri
SOAP, web hizmetleri için bir web hizmetleri protokol yığınının Mesajlaşma Protokolü katmanını sağlar. Mesaj yapısını ve nasıl işleneceğini tanımlayan bir zarf, uygulama tanımlı veri tiplerinin örneklerini ifade etmek için kullanılan bir kodlama kuralları kümesi ve işlem çağrılarını ve yanıtlarını temsil etmek için bir kural kümesi içerir. SOAP'un üç ana özelliği vardır:

# Uzatılabilirlik (güvenlik ve WS-Addressing geliştirilen uzantılardan bazılarıdır)
# Tarafsızlık (SOAP, HTTP, SMTP, TCP, UDP gibi herhangi bir protokol üzerinde çalışabilir)
# Bağımsızlık (SOAP, herhangi bir programlama modeline izin verir)

SOAP işlemlerinin ne yapabileceğine dair bir örnek olarak, bir uygulama, gerçek bir emlak fiyat veritabanı gibi web hizmetleri etkinleştirilmiş bir sunucuya bir SOAP isteği gönderebilir ve arama için parametreleri içerebilir. Sunucu daha sonra, örneğin fiyatlar, konum, özellikler gibi sonuç verileri ile bir SOAP yanıtı (bir XML biçimli belge) döndürür. Oluşturulan veriler, standartlaştırılmış bir makine-parselenebilir formatta geldiği için, istek gönderen uygulama doğrudan entegre edebilir.

SOAP mimarisi, birkaç katmandan oluşan özellikleri için aşağıdaki özelliklerin özelliklerine sahip şartnameleri içerir:

* mesaj formatı
* Mesaj Değişim Şablonları (MEP)
* altta yatan taşıma protokolü bağlantıları
* mesaj işleme modelleri
* protokol uzatılabilirliği

SOAP, XML-RPC'nin bir devamı olarak evrimlese de, Web Service Addressing'den (WS-Adressing) taşıma ve etkileşim tarafsızlığını ve zarf/başlık/gövdeyi başka yerlerden (muhtemelen WDDX'den) ödünç almaktadır.

## Tarihçe
SOAP, nesne erişim protokolü olarak tasarlandı ve Dave Winer, Don Box, Bob Atkinson ve Mohsen Al-Ghosein tarafından Microsoft için hazırlandı ve XML-RPC olarak Haziran 1998'de Frontier 5.1'in bir parçası olarak piyasaya sürüldü. İki kişi Atkinson ve Al-Ghosein, Microsoft'ta çalışıyordu.[3] Özellik, 13 Eylül 1999'da IETF'ye sunulana kadar herhangi bir yerde yayınlanmadı. Don Box'a göre, bunun sebebi Microsoft'taki politikalardı. Microsoft'ın tereddüdü nedeniyle, Dave Winer XML-RPC'yi 1998 yılında gönderdi.

Gönderilen Internet Taslağı, RFC durumuna ulaşmadı ve bu nedenle "web standardı" olarak kabul edilmiyor. 1.1 sürümü, 8 Mayıs 2000'de W3C Notu olarak yayınlandı. Ancak 1.1 sürümü W3C önerisi olarak kabul edilmediğinden, "web standardı" olarak kabul edilemez. Ancak, 1.2 sürümü, 24 Haziran 2003'te W3C önerisi olarak kabul edildi.

SOAP spesifikasyonu, Dünya Çapında Ağ Konsorsiyumu'nun XML Protokol Çalışma Grubu tarafından yönetiliyordu ve grup 10 Temmuz 2009'da kapatıldı. SOAP, başlangıçta "Simple Object Access Protocol" (Basit Nesne Erişim Protokolü) olarak adlandırıldı, ancak standardın 1.2 sürümü bu kısaltmayı bıraktı.

SOAP ilk olarak tanıtıldıktan sonra, WSDL, XSD ve UDDI'ye dayanan daha karmaşık bir web hizmetleri kümesinin altındaki katman haline geldi. Bu farklı hizmetler, özellikle UDDI, çok daha az ilgi göstermiştir, ancak bunların takdir edilmesi, SOAP'un beklenen rolünün, web hizmetleri nasıl evrimleştiğine göre nasıl olduğunun tam bir anlayışını sağlar.

## Terimler
SOAP belirtimi genel olarak üç kavramsal bileşenden oluşur: protokol kavramları, kapsülleme kavramları ve ağ kavramları.

### Protokol kavramları

#### SOAP
Bu, bir SOAP göndericisi ile bir SOAP alıcısı arasında değiş tokuş edilen bilginin biçimlendirme ve işlem kurallarını formalize eden ve yöneten bir dizi kuraldır.

#### SOAP düğümleri
SOAP mesajlarını iletmek/ilerletmek, almak ve işlemek için kullanılan işlem birimleri olan fiziksel/mantıksal makinelerdir. Bunlar bir ağdaki düğümlere benzer.

#### SOAP rolleri
Bir SOAP mesajının yolu boyunca, tüm düğümler belirli bir role sahip olurlar. Düğümün rolü, aldığı mesaj üzerinde gerçekleştirdiği eylemi tanımlar. Örneğin, "hiçbiri" rolü, hiçbir düğümün SOAP başlığını herhangi bir şekilde işlemeyeceği ve sadece mesajı yol boyunca ileteceği anlamına gelir.

#### SOAP protokol bağı
Bir SOAP mesajı, bir ağ üzerinde aktarılması için diğer protokollerle birlikte çalışması gerekir. Örneğin, bir SOAP mesajı, mesajları aktarmak için bir alt katman protokolü olarak TCP'yi kullanabilir. Bu bağlar, SOAP protokol bağı çerçevesinde tanımlanmıştır.

#### SOAP özellikleri
SOAP yalnızca bir mesajlaşma çerçevesi sağlar. Ancak, güvenilirlik, güvenlik vb. gibi özellikler eklemek için genişletilebilir. SOAP çerçevesine özellik eklerken izlenmesi gereken kurallar vardır.

#### SOAP modülü
SOAP üzerine genişletilen herhangi yeni özelliği tanımlayan SOAP başlığı hakkındaki anlamsal özellikler koleksiyonudur. Bir modül, sıfır veya daha fazla özelliği gerçekleştirmesi gerekir. SOAP, modüllerin belirli kurallara uymasını gerektirir.

### Veri kapsülleme kavramları

#### SOAP mesajı
2 SOAP düğümü arasında değiş tokuş edilen bilgiyi temsil eder.

#### SOAP zarfı
XML mesajının bir SOAP mesajı olarak tanımlanmasını sağlayan kaplayan öğedir.

#### SOAP başlık bloku
Bir SOAP başlığı birden fazla blok içerebilir ve her biri başlık içinde ayrı bir hesaplama blokudur. Genel olarak, SOAP rol bilgisi, yoldaki düğümleri hedeflemek için kullanılır. Bir başlık bloku, SOAP rolü, SOAP düğümü tarafından işletilen bir rolün adı ise, bir SOAP düğümüne hedeflenir.

#### Spesifikasyon
SOAP spesifikasyonu, mesajlaşma çerçevesini tanımlar ve şunları içerir:

* SOAP işlem modeli, bir SOAP mesajının işlenmesi için kuralları tanımlar
* SOAP genişletilebilirlik modeli, SOAP özellikleri ve SOAP modülleri kavramlarını tanımlar
* SOAP altta yatan protokol bağlama çerçevesi, SOAP düğümleri arasında SOAP mesajlarının değişimi için kullanılabilen bir alt protokole bağlama kurallarını tanımlar
* SOAP mesaj yapısı, bir SOAP mesajının yapısını tanımlar

## Taşıma yöntemleri
SMTP ve HTTP, SOAP'un taşıma yöntemi olarak kullanılan geçerli uygulama katmanı protokolleridir, ancak HTTP, bugünün internet altyapısı ile iyi çalıştığı için daha geniş kabul görmüştür; özellikle, HTTP ağ güvenlik duvarlarıyla iyi çalışır. SOAP ayrıca basit veya karşılıklı kimlik doğrulama ile HTTPS üzerinden de kullanılabilir (bu, uygulama düzeyinde HTTP ile aynı protokoldür, ancak altında şifreli bir iletişim protokolü kullanır); bu, WS-I Temel Profil 1.1'de belirtildiği gibi web servis güvenliği sağlamak için önerilen WS-I yöntemidir.

Bu, GIOP/IIOP veya DCOM gibi diğer dağıtılmış protokollere göre bir avantajdır, bunlar genellikle güvenlik duvarları tarafından filtrelenir. Bazı uygulamaların desteklediği bir başka seçenek de SOAP'un AMQP üzerinden kullanılmasıdır. SOAP'un, gönderen ve alıcı düğümlerin bilgisine ihtiyaç duyan makinelerde yapılandırılan güvenlik haklarından etkilenmeyen bir avantajı da vardır. Bu, SOAP'un DCOM ile mümkün olmayan bir şekilde gevşek bir şekilde eşleştirilmesine izin verir. Ayrıca SOAP üzerinden UDP OASIS standardı da vardır.

## Örnek Mesaj Yapısı

```xml
POST /InStock HTTP/1.1
Host: www.example.org
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 299
SOAPAction: "http://www.w3.org/2003/05/soap-envelope"

<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:m="http://www.example.org">
  <soap:Header>
  </soap:Header>
  <soap:Body>
    <m:GetStockPrice>
      <m:StockName>T</m:StockName>
    </m:GetStockPrice>
  </soap:Body>
</soap:Envelope>
```


## Avantajlar
* SOAP'un tarafsızlık özelliği, herhangi bir taşıma protokolüyle kullanıma uygun olduğunu açıkça belirtir. Uygulamalar genellikle bir taşıma protokolü olarak HTTP kullanır, ancak diğer popüler taşıma protokolleri de kullanılabilir. Örneğin, SOAP ayrıca SMTP, JMS ve mesaj kuyrukları üzerinden de kullanılabilir.
* SOAP, HTTP post/cevap alışverişleriyle birleştirildiğinde, mevcut güvenlik duvarları ve proxy'ler üzerinden kolayca tüneller oluşturur ve bu nedenle HTTP post/cevap alışverişleri işlemek için mevcut olan yaygın hesaplama ve iletişim altyapılarının değiştirilmesini gerektirmez.
* SOAP, XML dahil olmak üzere tüm XML olanaklarına sahiptir, bu da XML Namespaces ile kolay uluslararasılaşma ve genişletilebilirlik anlamına gelir.

## Dezavantajlar
* Standart uygulama ve varsayılan SOAP/HTTP bağlama kullanıldığında, XML bilgi kümesi XML olarak serileştirilir. Gömülü ikili nesnelerle XML'in özel durumunda performansı artırmak için Mesaj İletim Optimizasyon Mekanizması tanıtılmıştır.
* HTTP'ye güvenerek bir taşıma protokolü olarak ve Web Hizmetleri Adresleme veya Kurumsal Servis Otobüsü kullanılmadığında, etkileşen tarafların rolleri sabittir. Yalnızca bir taraf (istemci), diğerinin hizmetlerini kullanabilir.
* SOAP, adı önerdiği kadar "basit" değildir. Protokolün ayrıntılı olması, XML'in yavaş ayrıştırma hızı ve standartlaştırılmış bir etkileşim modelinin olmaması, HTTP protokolünü daha doğrudan kullanan hizmetlerin hakimiyetine neden oldu. Örneğin, REST.
* Protokol-özgür olması nedeniyle, SOAP, REST'in Uniform Interface veya önbellekleme gibi protokol özgü özelliklerinden ve optimizasyonlarından yararlanamaz - bunları yeniden uygulamak zorunda kalır (örneğin WS-Addressing ile olduğu gibi).

## Kaynakça

## Bağlantılar
* SoaMoa, SOAP protokolünü öğrenmek için yararlı bir araç

## Kaynakça
* Sefer ALGAN 
* https://www.w3.org/TR/soap/ 
* https://developer.ibm.com/articles/soap-and-rest/ 
* https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/ws03/soap/ws03-soap.htm