RESTful programlama tam olarak nedir?
RESTful programlama tam olarak nedir?
Yanıtlar:
REST (Temsili Durum Transferi) adı verilen bir mimari stil , web uygulamalarının orijinal haliyle HTTP kullanması gerektiğini savunmaktadır . Aramalar istekleri kullanmalıdır . , ve istekleriGET
PUT
POST
DELETE
için kullanılmalıdır sırasıyla mutasyon, yaratılış ve silme .
REST destekçileri aşağıdaki URL'leri tercih etme eğilimindedir:
http://myserver.com/catalog/item/1729
ancak REST mimarisi bu "güzel URL'leri" gerektirmez. Parametreli bir GET isteği
http://myserver.com/catalog?item=1729
her bit RESTful kadar.
Bilgileri güncellemek için GET isteklerinin asla kullanılmaması gerektiğini unutmayın. Örneğin, bir alışveriş sepetine öğe eklemek için bir GET isteği
http://myserver.com/addToCart?cart=314159&item=1729
uygun olmaz. GET istekleri idempotent olmalıdır . Yani, iki kez bir talepte bulunmak, bir kez talepte bulunmaktan farklı olmamalıdır. İstekleri önbelleğe alınabilir yapan da budur. Bir "sepete ekle" isteği idempotent değildir; iki kez yayınlanması, öğenin iki kopyasını sepete ekler. Bu bağlamda bir POST isteği açıkça uygundur. Böylece, RESTful web uygulaması POST istekleri payına ihtiyacı var.
Bu, mükemmel çekirdek Core JavaServer'ın David M. Geary'nin kitabından alınmıştır.
REST , web'in altında yatan mimari ilkedir. Web ile ilgili şaşırtıcı olan şey, istemcilerin (tarayıcılar) ve sunucuların, istemci, sunucu ve barındırdığı kaynaklar hakkında önceden bir şey bilmeden karmaşık şekillerde etkileşime girebilmesidir. Temel kısıtlama, sunucunun ve istemcinin , web'de HTML olan medya üzerinde hemfikir olması gerektiğidir .
REST prensiplerine uyan bir API , müşterinin API'nin yapısı hakkında hiçbir şey bilmesini gerektirmez. Bunun yerine, sunucunun istemcinin hizmetle etkileşime girmesi için gereken bilgileri sağlaması gerekir. Bir HTML formu bu bir örnektir: Sunucu kaynak ve gerekli alanları konumunu belirtir. Tarayıcı, bilgilerin nereye gönderileceğini önceden bilmiyor ve hangi bilgilerin gönderileceğini önceden bilmiyor. Her iki bilgi formu da tamamen sunucu tarafından sağlanır. (Bu ilke HATEOAS olarak adlandırılır : Uygulama Durumunun Motoru Olarak Hiper Ortam .)
Peki, bu HTTP için nasıl geçerlidir ve pratikte nasıl uygulanabilir? HTTP fiillere ve kaynaklara yöneliktir. Ana akım kullanımdaki iki fiil GET
ve POST
bence herkes tanıyacak. Ancak, HTTP standardı PUT
ve gibi birkaç tanesini tanımlar DELETE
. Bu fiiller daha sonra sunucu tarafından sağlanan talimatlara göre kaynaklara uygulanır.
Örneğin, bir web hizmeti tarafından yönetilen bir kullanıcı veritabanımız olduğunu düşünelim. Hizmetimiz, mime türünü atadığımız JSON'a dayalı özel bir hiper ortam kullanır application/json+userdb
(Ayrıca application/xml+userdb
ve application/whatever+userdb
birçok medya türü desteklenebilir). İstemci ve sunucu bu biçimi anlayacak şekilde programlanmıştır, ancak birbirleri hakkında hiçbir şey bilmemektedirler. Roy Fielding'in belirttiği gibi :
Bir REST API, neredeyse tüm tanımlayıcı çabalarını kaynakları temsil etmek ve uygulama durumunu göstermek için kullanılan ortam türlerini tanımlamak veya mevcut standart ortam türleri için genişletilmiş ilişki adlarını ve / veya hipermetin özellikli işaretlemeyi tanımlamak için harcamalıdır.
Temel kaynak talebi şu şekilde /
olabilir:
İstek
GET /
Accept: application/json+userdb
Tepki
200 OK
Content-Type: application/json+userdb
{
"version": "1.0",
"links": [
{
"href": "/user",
"rel": "list",
"method": "GET"
},
{
"href": "/user",
"rel": "create",
"method": "POST"
}
]
}
Medyamızın açıklamasından "bağlantılar" adı verilen bölümlerden ilgili kaynaklar hakkında bilgi bulabileceğimizi biliyoruz. Buna Hipermedya kontrolleri denir . Bu durumda, böyle bir bölümden, başka bir istekte bulunarak bir kullanıcı listesi bulabileceğimizi söyleyebiliriz./user
:
İstek
GET /user
Accept: application/json+userdb
Tepki
200 OK
Content-Type: application/json+userdb
{
"users": [
{
"id": 1,
"name": "Emil",
"country: "Sweden",
"links": [
{
"href": "/user/1",
"rel": "self",
"method": "GET"
},
{
"href": "/user/1",
"rel": "edit",
"method": "PUT"
},
{
"href": "/user/1",
"rel": "delete",
"method": "DELETE"
}
]
},
{
"id": 2,
"name": "Adam",
"country: "Scotland",
"links": [
{
"href": "/user/2",
"rel": "self",
"method": "GET"
},
{
"href": "/user/2",
"rel": "edit",
"method": "PUT"
},
{
"href": "/user/2",
"rel": "delete",
"method": "DELETE"
}
]
}
],
"links": [
{
"href": "/user",
"rel": "create",
"method": "POST"
}
]
}
Bu yanıttan çok şey söyleyebiliriz. Örneğin, şimdi yeni bir kullanıcı oluşturmak biliyorum POST
için ing /user
:
İstek
POST /user
Accept: application/json+userdb
Content-Type: application/json+userdb
{
"name": "Karl",
"country": "Austria"
}
Tepki
201 Created
Content-Type: application/json+userdb
{
"user": {
"id": 3,
"name": "Karl",
"country": "Austria",
"links": [
{
"href": "/user/3",
"rel": "self",
"method": "GET"
},
{
"href": "/user/3",
"rel": "edit",
"method": "PUT"
},
{
"href": "/user/3",
"rel": "delete",
"method": "DELETE"
}
]
},
"links": {
"href": "/user",
"rel": "list",
"method": "GET"
}
}
Ayrıca mevcut verileri değiştirebileceğimizi de biliyoruz:
İstek
PUT /user/1
Accept: application/json+userdb
Content-Type: application/json+userdb
{
"name": "Emil",
"country": "Bhutan"
}
Tepki
200 OK
Content-Type: application/json+userdb
{
"user": {
"id": 1,
"name": "Emil",
"country": "Bhutan",
"links": [
{
"href": "/user/1",
"rel": "self",
"method": "GET"
},
{
"href": "/user/1",
"rel": "edit",
"method": "PUT"
},
{
"href": "/user/1",
"rel": "delete",
"method": "DELETE"
}
]
},
"links": {
"href": "/user",
"rel": "list",
"method": "GET"
}
}
Farklı HTTP fiilleri kullandığınızı Bildirimi ( GET
, PUT
, POST
, DELETE
vb) bu kaynakları işlemek ve biz müşterinin kısmında tahmin sadece bilgi bizim medya tanımı olduğunu için.
Daha fazla okuma:
(Bu cevap, noktayı kaçırmak için adil bir eleştiri konusu olmuştur. Çoğunlukla, bu adil bir eleştiri olmuştur. Başlangıçta tarif ettiğim şey, REST'in birkaç yıl önce genellikle nasıl uygulandığımla daha uyumlu idi. ilk önce, gerçek anlamından ziyade bunu yazdı. Cevabı, gerçek anlamı daha iyi temsil etmek için revize ettim.)
RESTful programlama hakkında:
Create
, Retrieve
, Update
, Delete
olur POST
, GET
, PUT
, ve DELETE
. Ancak REST HTTP ile sınırlı değildir, şu anda sadece en yaygın kullanılan aktarımdır.Sonuncusu muhtemelen REST'in sonuçları ve genel etkinliği açısından en önemlisidir. Genel olarak, RESTful tartışmalarının çoğu HTTP ve bunun bir tarayıcıdan kullanımı ve ne olmadığı üzerinde odaklanıyor gibi görünüyor. R. Fielding'in HTTP'ye götüren mimariyi ve kararları tanımlarken bu terimi kullandığını anlıyorum. Tezi, HTTP'den çok kaynakların mimarisi ve önbellek yeteneği ile ilgilidir.
RESTful mimarisinin ne olduğu ve neden işe yaradığıyla gerçekten ilgileniyorsanız , tezini birkaç kez okuyun ve sadece 5. Bölümü değil her şeyi okuyun ! Sonra DNS'nin neden çalıştığına bakın . DNS hiyerarşik organizasyonu ve yönlendirmelerin nasıl çalıştığı hakkında bilgi edinin. Ardından, DNS önbelleğinin nasıl çalıştığını okuyun ve düşünün. Son olarak, HTTP spesifikasyonlarını (özellikle RFC2616 ve RFC3040 ) okuyun ve önbelleğin nasıl ve neden çalıştığı gibi çalıştığını düşünün. Sonunda, sadece tıklayacak. Benim için son vahiy, DNS ve HTTP arasındaki benzerliği gördüğüm zamandı. Bundan sonra, SOA ve İleti Geçiş Arabirimlerinin neden ölçeklenebilir olduğunu anlamak tıklamaya başlar.
RESTful and Shared Nothing hiçbir mimarinin mimari önemini ve performans sonuçlarını anlamanın en önemli hilesinin , teknoloji ve uygulama detaylarına takılmaktan kaçınmak olduğunu düşünüyorum. Kaynaklara kimlerin sahip olduğuna, bunları yaratmaktan / korumaktan kimin sorumlu olduğuna vb. Odaklanın. Sonra temsilleri, protokolleri ve teknolojileri düşünün.
PUT
ve POST
güncelleme ve oluşturma ile birebir eşleme yapmayın. PUT
istemci URI'nin ne olacağını dikte ederse oluşturmak için kullanılabilir. POST
sunucu yeni URI'yi atarsa oluşturur.
urn:
şemayı kullanan bir URI'dır . Kavramsal olarak hiçbir fark yoktur; ancak, bir URN, URN tarafından tanımlanan (adlandırılan) kaynağı "bulmak" için ayrı olarak tanımlanmış bir yönteminizin olmasını gerektirir. Adlandırılmış kaynakları ve konumlarını ilişkilendirirken örtülü kuplaj uygulamadığınızdan emin olunmalıdır.
Böyle görünebilir.
Üç özelliğe sahip bir kullanıcı oluşturun:
POST /user
fname=John&lname=Doe&age=25
Sunucu yanıt veriyor:
200 OK
Location: /user/123
Gelecekte, kullanıcı bilgilerini alabilirsiniz:
GET /user/123
Sunucu yanıt veriyor:
200 OK
<fname>John</fname><lname>Doe</lname><age>25</age>
Kaydı değiştirmek için ( lname
ve age
değişmeden kalacaktır):
PATCH /user/123
fname=Johnny
Kaydını güncellemek için (ve dolayısıyla lname
ve age
NULL olacaktır):
PUT /user/123
fname=Johnny
PUT fname=Jonny
. Bu ayar lname
ve age
varsayılan değerlere (muhtemelen NULL veya boş dize ve tamsayı 0) ayarlayacaktır , çünkü sağlanan PUT
kaynağın verilerinin tamamını kaynağın üzerine yazar . "Güncelleme" ile ima edilen bu değildir, gerçek bir güncelleme yapmak için, PATCH
yöntemi gösterimle belirtilmeyen alanları değiştirmediğinden kullanın .
/user/1
hiçbir anlam ifade etmez ve adresinde bir giriş olmalıdır /users
. Bu durumda yanıt 201 Created
sadece iyi değil , bir de olmalıdır .
REST hakkında harika bir kitap Pratikte REST'tir .
Zorunluluk okur vardır rest (DİNLENME) ve REST API'leri köprü odaklı olmalıdır
RESTful hizmetinin ne olduğuna ilişkin açıklama için Richardson Olgunluk Modeli (RMM) başlıklı Martin Fowlers makalesine bakın .
Dürüst olmak için bir Hizmetin , Uygulama Durumunun Motoru olarak Hipermedya'yı yerine getirmesi gerekir . (HATEOAS) , yani RMM'de 3. seviyeye ulaşması, ayrıntılar veya qcon konuşmasından slaytlar için makaleyi okuması gerekir .
HATEOAS kısıtlaması, Uygulama Durumunun Motoru olarak Hipermedya için kullanılan bir kısaltmadır. Bu ilke, bir REST ile istemci sunucu sisteminin diğer birçok biçimi arasındaki temel ayırıcıdır.
...
RESTful uygulamasının bir istemcisinin erişmek için yalnızca tek bir sabit URL bilmesi gerekir. Gelecekteki tüm eylemler, o URL'den döndürülen kaynakların gösterimlerine dahil edilen hiper medya bağlantılarından dinamik olarak keşfedilebilir olmalıdır. Standartlaştırılmış ortam türlerinin de RESTful API kullanabilen herhangi bir istemci tarafından anlaşılması beklenir. (Vikipedi, özgür ansiklopedi)
Web Çerçeveleri için REST Litmus Testi, web çerçeveleri için benzer bir olgunluk testidir.
Saf REST'e yaklaşmak: HATEOAS'u sevmeyi öğrenmek , iyi bir bağlantı koleksiyonudur.
Genel Bulut için REST'e karşı SOAP , mevcut REST kullanım düzeylerini tartışır.
REST ve sürüm oluşturma , Genişletilebilirlik, Sürüm Oluşturma, Evrilebilirlik, vb.
REST nedir?
REST, Temsil Edici Devlet Transferi anlamına gelir. (Bazen "ReST" olarak yazılır.) Vatansız, istemci-sunucu, önbelleğe alınabilir iletişim protokolüne dayanır - ve neredeyse tüm durumlarda, HTTP protokolü kullanılır.
REST, ağa bağlı uygulamalar tasarlamak için bir mimari tarzıdır. Fikir, makineler arasında bağlantı kurmak için CORBA, RPC veya SOAP gibi karmaşık mekanizmalar kullanmak yerine, makineler arasında arama yapmak için basit HTTP'nin kullanılmasıdır.
Birçok yönden, HTTP tabanlı World Wide Web'in kendisi REST tabanlı bir mimari olarak görülebilir. RESTful uygulamaları veri göndermek (oluşturmak ve / veya güncellemek), verileri okumak (ör. Sorgu yapmak) ve verileri silmek için HTTP isteklerini kullanır. Böylece REST, dört CRUD (Oluştur / Oku / Güncelle / Sil) işlemi için HTTP kullanır.
REST, RPC (Uzaktan Yordam Çağrıları) ve Web Hizmetleri (SOAP, WSDL ve diğerleri) gibi mekanizmalara hafif bir alternatiftir. Daha sonra REST'in ne kadar basit olduğunu göreceğiz.
Basit olmasına rağmen, REST tam özellikli; temel olarak RESTful mimarisiyle yapılamayan Web Hizmetlerinde yapabileceğiniz hiçbir şey yoktur. REST bir "standart" değildir. Örneğin, REST için hiçbir zaman W3C önerisi olmayacaktır. Ve REST programlama çerçeveleri olsa da, REST ile çalışmak o kadar basittir ki Perl, Java veya C # gibi dillerde standart kütüphane özellikleriyle "kendinizinkini yuvarlayabilirsiniz".
Dinlenmenin basit gerçek anlamını bulmaya çalıştığımda bulduğum en iyi referanslardan biri.
REST, verileri işlemek için çeşitli HTTP yöntemlerini (çoğunlukla GET / PUT / DELETE) kullanır.
Bir yöntemi (örneğin, /user/123/delete
) silmek için belirli bir URL kullanmak yerine, URL'ye bir DELETE isteği gönderir /user/[id]
, bir kullanıcıyı düzenler, GET isteği gönderdiğiniz bir kullanıcı hakkında bilgi alırsınız/user/[id]
Örneğin, aşağıdakilerden bazıları gibi görünebilecek bir URL kümesi ..
GET /delete_user.x?id=123
GET /user/delete
GET /new_user.x
GET /user/new
GET /user?id=1
GET /user/id/1
HTTP "fiiller" kullanın ve ..
GET /user/2
DELETE /user/2
PUT /user
Sisteminizin mimarisinin , tezinde Roy Fielding tarafından ortaya konan REST stiline uyduğu yerde programlama yapıyor . Bu, web'i (az ya da çok) açıklayan mimari tarz olduğundan, birçok insan onunla ilgileniyor.
Bonus cevap: Hayır. Yazılım mimarisini akademik olarak incelemediğiniz veya web hizmetleri tasarlamadığınız sürece, terimi duymak için gerçekten hiçbir neden yoktur.
RESTful programlamanın REST mimari stilini takip eden sistemler (API) yaratmak olduğunu söyleyebilirim.
Dr.M.Elkstein'ın REST hakkında bu harika, kısa ve anlaşılması kolay öğreticiyi buldum ve çoğunlukla sorunuza cevap verecek önemli kısmı alıntıladım:
REST, ağa bağlı uygulamalar tasarlamak için bir mimari tarzıdır . Fikir, makineler arasında bağlantı kurmak için CORBA, RPC veya SOAP gibi karmaşık mekanizmalar kullanmak yerine, makineler arasında arama yapmak için basit HTTP'nin kullanılmasıdır.
- Birçok yönden, HTTP tabanlı World Wide Web'in kendisi REST tabanlı bir mimari olarak görülebilir.
RESTful uygulamaları veri göndermek (oluşturmak ve / veya güncellemek), verileri okumak (ör. Sorgu yapmak) ve verileri silmek için HTTP isteklerini kullanır. Böylece REST, dört CRUD (Oluştur / Oku / Güncelle / Sil) işlemi için HTTP kullanır.
Yığın Taşması dışında REST hakkında bir şey duymamanız için aptal hissetmemen gerektiğini sanmıyorum ..., ben de aynı durumda olurdum !; REST'in neden şimdi büyüdüğü hakkındaki diğer SO sorusunun cevapları bazı duyguları hafifletebilir.
Soruyu doğrudan cevaplamadığım için özür dilerim, ancak tüm bunları daha ayrıntılı örneklerle anlamak daha kolaydır. Fielding, tüm soyutlama ve terminoloji nedeniyle anlaşılması kolay değildir.
Burada oldukça iyi bir örnek var:
REST ve Hipermetin Açıklaması: Spam-E Spam Temizleme Robotu
Ve daha da iyisi, burada basit örneklerle temiz bir açıklama var (powerpoint daha kapsamlı, ancak çoğunu html sürümünde alabilirsiniz):
http://www.xfront.com/REST.ppt veya http://www.xfront.com/REST.html
Örnekleri okuduktan sonra Ken'in neden REST'in hipermetin güdümlü olduğunu söylediğini görebiliyordum. Aslında onun doğru olduğundan emin değilim, çünkü bu / user / 123 bir kaynağa işaret eden bir URI ve sadece müşteri "bant dışı" hakkında bilgi sahibi olduğu için bana kötü gelmiyor.
Bu xfront belgesi REST ve SOAP arasındaki farkı açıklıyor ve bu da gerçekten yardımcı oluyor. Fielding, " Bu RPC. RPC bağırıyor. " Dediğinde, RPC'nin RESTful olmadığı açıktır, bu yüzden bunun kesin nedenlerini görmek yararlıdır. (SOAP bir RPC türüdür.)
REST nedir?
REST resmi olarak, mevcut “Web” temellerini kullanarak belirli prensipler üzerine inşa edilmiş bir mimari stildir. REST hizmetleri oluşturmak için kullanılan web'in 5 temel temeli vardır.
Communication is Done by Representation
geliyor?
123 kullanıcısı hakkında her şeyi "/ user / 123" kaynağına koymak RESTful olduğunu söyleyen bir sürü cevap görüyorum.
Terimi kazanan Roy Fielding, REST API'lerinin hipermetin güdümlü olması gerektiğini söylüyor . Özellikle, "Bir REST API'sı sabit kaynak adlarını veya hiyerarşilerini tanımlamamalıdır".
Dolayısıyla, "/ user / 123" yolunuz istemcide sabit kodlanmışsa, gerçekten RESTful değildir. HTTP'nin iyi kullanımı belki de olmayabilir. Ama RESTful değil. Hipermetinden gelmek zorundadır.
Cevap çok basit, Roy Fielding tarafından yazılmış bir tez var .] 1 Bu tezde REST ilkelerini tanımlar. Bir uygulama bu ilkelerin tümünü karşılıyorsa, bu bir REST uygulamasıdır.
RESTful terimi, ppl, REST olmayan uygulamalarını REST olarak çağırarak REST kelimesini tükettiği için yaratılmıştır. Bundan sonra RESTful terimi de tükendi. Günümüzde Web API'ları ve Hiper Ortam API'larından bahsediyoruz , çünkü REST uygulamalarının çoğu tek tip arabirim kısıtlamasının HATEOAS bölümünü karşılamıyor.
REST kısıtlamaları şunlardır:
istemci-sunucu mimarisi
Bu nedenle, örneğin PUB / SUB soketleri ile çalışmaz, REQ / REP'ye dayanır.
vatansız iletişim
Böylece sunucu istemcilerin durumlarını korumaz. Bu, sunucuda yan oturum depolamasını kullanamayacağınız ve her isteğin kimliğini doğrulamanız gerektiği anlamına gelir. İstemcileriniz büyük olasılıkla şifreli bir bağlantı üzerinden temel yetkilendirme başlıkları gönderir. (Büyük uygulamalarla birçok oturumu sürdürmek zordur.)
yapabiliyorsanız önbellek kullanımı
Böylece aynı istekleri tekrar tekrar yerine getirmek zorunda değilsiniz.
istemci ve sunucu arasında ortak sözleşme olarak tek tip arayüz
İstemci ve sunucu arasındaki sözleşme sunucu tarafından sağlanmaz. Başka bir deyişle, müşteri hizmetin uygulanmasından ayrılmalıdır. Kaynakları tanımlamak için IRI (URI) standardı, mesaj alışverişi için HTTP standardı, gövde serileştirme formatını tanımlamak için standart MIME türleri, meta veriler (muhtemelen RDF kelimeleri, mikro biçimler vb.) Gibi standart çözümleri kullanarak bu duruma ulaşabilirsiniz. Mesaj gövdesinin farklı bölümlerinin anlambilimini açıklar. IRI yapısını istemciden ayırmak için istemcilere (HTML, JSON-LD, HAL, vb.) Hiper ortam formatlarında köprüler göndermeniz gerekir. Böylece bir istemci, mevcut hedefine ulaşmak için uygulamanın durum makinesinde uygun durum geçişleri arasında gezinmek için köprülere atanan meta verileri (muhtemelen bağlantı ilişkileri, RDF sözcükleri) kullanabilir.
Örneğin, bir müşteri bir web mağazasına sipariş göndermek istediğinde, web mağazasının gönderdiği yanıtlardaki köprüleri kontrol etmesi gerekir. Bağlantıları kontrol ederek http://schema.org/OrderAction ile açıklanan bir tanesini bulur . İstemci schema.org kelimesini bilir, bu nedenle bu köprüyü etkinleştirerek sipariş göndereceğini anlar. Böylece köprüyü etkinleştirir ve POST https://example.com/api/v1/order
uygun gövdeye sahip bir mesaj gönderir . Bundan sonra hizmet iletiyi işler ve uygun HTTP durum üstbilgisine sahip olan sonuçla, örneğin 201 - created
başarı ile yanıt verir . Ayrıntılı meta veri içeren mesajlara açıklama eklemek için standart çözüm bir RDF formatı kullanmaktır, örneğin bir REST kelime haznesine sahip JSON-LD , örneğin Hydra haznesine ve etki alanına özgü kelimelerschema.org veya başka birbağlantılı veri kelime haznesi ve gerekirse özel bir uygulamaya özgü kelime haznesi. Şimdi bu kolay değil, bu yüzden çoğu kişi HAL ve genellikle sadece bir REST kelime hazinesi sağlayan ancak bağlantılı veri desteği olmayan diğer basit formatları kullanır.
ölçeklenebilirliği artırmak için katmanlı bir sistem oluşturmak
REST sistemi hiyerarşik katmanlardan oluşur. Her katman, aşağıdaki sonraki katmanda yer alan bileşenlerin hizmetlerini kullanan bileşenler içerir. Böylece zahmetsizce yeni katmanlar ve bileşenler ekleyebilirsiniz.
Örneğin, istemcileri içeren bir istemci katmanı vardır ve bunun altında tek bir hizmet içeren bir hizmet katmanı vardır. Şimdi aralarına istemci tarafı önbellek ekleyebilirsiniz. Bundan sonra başka bir servis örneği ve bir yük dengeleyici vb. Ekleyebilirsiniz ... İstemci kodu ve servis kodu değişmez.
istemci işlevlerini genişletmek için isteğe bağlı kod
Bu kısıtlama isteğe bağlıdır. Örneğin, istemciye belirli bir ortam türü için bir ayrıştırıcı gönderebilirsiniz, vb ... Bunu yapmak için istemcide standart bir eklenti yükleyici sistemine ihtiyacınız olabilir veya istemciniz eklenti yükleyici çözümüne bağlanır .
REST kısıtlamaları, istemcilerin hizmet uygulamalarından ayrıldığı oldukça ölçeklenebilir bir sistemle sonuçlanır. Böylece istemciler yeniden kullanılabilir, genel olarak web'deki tarayıcılar gibi. Müşteriler ve hizmetler aynı standartları ve kelimeleri paylaşır, böylece müşterinin hizmetin uygulama ayrıntılarını bilmemesine rağmen birbirlerini anlayabilirler. Bu, hedeflerine ulaşmak için REST hizmetlerini bulabilen ve kullanabilen otomatik müşteriler oluşturmayı mümkün kılar. Uzun vadede bu müşteriler, tıpkı insanlar gibi, görevlerle iletişim kurabilir ve birbirlerine güvenebilirler. Bu tür müşterilere öğrenme kalıpları eklersek, sonuç tek bir sunucu parkı yerine makinelerin ağını kullanarak bir veya daha fazla yapay zeka olacaktır. Sonunda Berners Lee'nin rüyası: anlamsal ağ ve yapay zeka gerçek olacak. 2030'da Skynet tarafından feshedildik. O zamana kadar ... ;-)
RESTful (Temsili durum aktarımı) API programlama, 5 temel yazılım mimari stil ilkesini izleyerek herhangi bir programlama dilinde web uygulamaları yazmaktadır :
Başka bir deyişle, her bir “kaynağın” ortaya koyduğu arabirimin standartlaştırılmasını öneren RESTful mimarisini uygulayarak GET, POST, PUT veya DELETE gibi fiilleri kullanan HTTP üzerinden basit noktadan noktaya ağ uygulamaları yazıyorsunuz. Web'in mevcut özelliklerini basit ve etkili bir şekilde kullanmanın (başarılı, kanıtlanmış ve dağıtılmış mimari) hiçbir şey yoktur. SOAP , CORBA ve RPC gibi daha karmaşık mekanizmalara bir alternatiftir .
RESTful programlama Web mimarisi tasarımına uygundur ve düzgün bir şekilde uygulandığında ölçeklenebilir Web altyapısından tam olarak yararlanmanıza olanak tanır.
REST'teki orijinal tezi sadece 3 kısa cümleye indirmem gerekirse, aşağıdakilerin özünü yakaladığını düşünüyorum:
Bundan sonra, uyarlamalar, kodlama kuralları ve en iyi uygulamalar hakkında tartışmalara girmek kolaydır.
İlginçtir ki, tezde HTTP POST, GET, DELETE veya PUT işlemlerinden bahsedilmemektedir. Bu, daha sonra "tekdüze arayüz" için "en iyi uygulama" nın yorumlanması olmalıdır.
Web hizmetleri söz konusu olduğunda, arayüze önemli ölçüde ek yük ve muhtemelen çok fazla karmaşıklık katan WSDL ve SOAP tabanlı mimarileri ayırt etmenin bir yoluna ihtiyacımız var gibi görünüyor. Ayrıca uygulamak için ek çerçevelere ve geliştirici araçlarına ihtiyaç duyarlar. REST'in sağduyu arabirimleri ile WSDL ve SOAP gibi aşırı tasarlanmış arabirimler arasında ayrım yapmak için en iyi terim olup olmadığından emin değilim. Ama bir şeye ihtiyacımız var.
REST, mimari bir desen ve dağıtılmış uygulamalar yazma stilidir. Dar anlamda bir programlama tarzı değildir.
REST stilini kullandığınızı söylemek, belirli bir stilde bir ev inşa ettiğinizi söylemeye benzer: örneğin Tudor veya Victoria. Hem bir yazılım tarzı olarak REST hem de bir ev tarzı olarak Tudor veya Victoria, onları oluşturan nitelikler ve kısıtlamalar ile tanımlanabilir. Örneğin, REST, iletilerin kendi kendini tanımladığı İstemci Sunucusu ayrımına sahip olmalıdır. Tudor tarzı evlerde, ön taraftaki çitlerle dik eğimli örtüşen çatılar ve çatılar var. REST'i oluşturan kısıtlamalar ve nitelikler hakkında daha fazla bilgi edinmek için Roy'un tezini okuyabilirsiniz.
REST, ev stillerinin aksine, tutarlı ve pratik olarak uygulanması zor bir zaman geçirdi. Bu kasıtlı olmuş olabilir. Gerçek uygulamasını tasarımcıya bırakmak. Böylece REST Sistemleri oluşturduğunuz tezde belirtilen kısıtlamalara uyduğunuz sürece istediğinizi yapmakta özgürsünüz.
Bonus:
Tüm web REST'e (veya REST web'e dayanıyordu) dayanmaktadır. Bu nedenle bir web geliştiricisi olarak, iyi web uygulamaları yazmak gerekli olmamasına rağmen bunun farkında olabilirsiniz.
İşte REST'in temel hatları. RESTful mimarisindeki bileşenlerin her birinin arkasındaki düşünceyi göstermeye çalıştım, böylece kavramın anlaşılması daha sezgisel olur. Umarım bu bazı insanlar için REST'in anlaşılmasında yardımcı olur!
REST (Temsili Durum Transferi), ağa bağlı kaynakların (yani bilgi paylaşan düğümlerin) nasıl tasarlandığını ve ele alındığını özetleyen bir tasarım mimarisidir. Genel olarak, RESTful mimarisi, istemcinin (istekte bulunan makine) ve sunucunun (yanıt veren makine), istemcinin sunucunun nasıl çalıştığını ve sunucunun nasıl geçebileceğini bilmesine gerek kalmadan verileri okumak, yazmak ve güncellemek isteyebilmesini sağlar. müşteri hakkında hiçbir şey bilmeden geri. Tamam, havalı ... ama bunu pratikte nasıl yaparız?
En bariz gereksinim, sunucunun istemciye istekle ne yapmaya çalıştığını ve sunucunun yanıt vermesini söyleyebilmesi için bir tür evrensel dil olması gerektiğidir.
Ancak herhangi bir kaynağı bulmak ve daha sonra müşteriye bu kaynağın nerede yaşadığını söylemek için, kaynaklara işaret etmenin evrensel bir yolu olmalıdır. Burası Evrensel Kaynak Tanımlayıcılarının (URI'ler) devreye girdiği yerdir; kaynakları bulmak için benzersiz adreslerdir.
Ancak REST mimarisi burada bitmiyor! Yukarıdakiler istediğimiz şeyin temel ihtiyaçlarını karşılasa da, belirli bir sunucu genellikle birkaç istemciden gelen yanıtları ele aldığı için yüksek hacimli trafiği destekleyen bir mimariye de sahip olmak istiyoruz. Bu nedenle, önceki istekler hakkında bilgi hatırlatarak sunucuyu bunaltmak istemiyoruz.
Bu nedenle, istemci ile sunucu arasındaki her istek yanıt çiftinin bağımsız olduğu kısıtlamasını uygularız, yani sunucunun yeni bir yanıt vermek için önceki istekler (istemci-sunucu etkileşiminin önceki durumları) hakkında hiçbir şey hatırlaması gerekmez. istek. Bu, etkileşimlerimizin vatansız olmasını istediğimiz anlamına gelir.
Sunucumuzdaki yükü, belirli bir istemci için yakın zamanda yapılmış olan hesaplamaların yeniden yapılmasını daha da kolaylaştırmak için, REST ayrıca önbelleğe almayı da sağlar. Temel olarak, önbellekleme, istemciye sağlanan ilk yanıtın bir anlık görüntüsünü almak anlamına gelir. İstemci aynı isteği yeniden yaparsa, sunucu ilk yanıtı oluşturmak için gerekli olan tüm hesaplamaları yeniden yapmak yerine istemciye anlık görüntü sağlayabilir. Ancak, anlık görüntü olduğundan, anlık görüntünün süresi dolmadıysa - sunucu önceden bir son kullanma süresi ayarlar - ve ilk önbellekten bu yana yanıt güncelleştirilir (yani istek önbelleğe alınan yanıttan farklı bir yanıt verir) , önbellek sona erene (veya önbellek temizlenene) ve yanıt tekrar sıfırdan görüntülenene kadar istemci güncellemeleri görmez.
RESTful mimarileri hakkında sık sık burada olacağınız son şey onların katmanlı olmalarıdır. İstemci ve sunucu arasındaki etkileşimi tartışmamızda bu gereksinimi aslında örtük olarak tartışıyoruz. Temel olarak, bu, sistemimizdeki her katmanın yalnızca bitişik katmanlarla etkileşime girdiği anlamına gelir. Bu nedenle tartışmamızda, istemci katmanı sunucu katmanımızla etkileşime girer (veya tersi), ancak birincil sunucunun istemcinin doğrudan iletişim kurmadığı bir isteği işlemesine yardımcı olan başka sunucu katmanları olabilir. Bunun yerine, sunucu gerektiğinde isteği iletir.
Şimdi, eğer tüm bunlar tanıdık geliyorsa, o zaman harika. World Wide Web üzerinden iletişim protokolünü tanımlayan Köprü Metni Aktarım Protokolü (HTTP), RESTful mimarisinin soyut kavramının (veya benim gibi bir OOP fanatiği iseniz REST sınıfının bir örneğinin) bir uygulamasıdır. REST'in bu uygulamasında, istemci ve sunucu, evrensel dilin bir parçası olan GET, POST, PUT, DELETE, vb. Yoluyla etkileşime girer ve kaynaklar URL'leri kullanmaya yönlendirilebilir.
Dinlendirici olan nokta , interneti (protokol) vatansız bir taşıma katmanı olarak kullanırken durumsallığın daha yüksek bir katmana ayrılması olduğunu düşünüyorum . Diğer yaklaşımların çoğu işleri karıştırır.
İnternet çağında programlamanın temel değişikliklerini ele almak için en pratik yaklaşım olmuştur. Temel değişikliklerle ilgili olarak, Erik Meijer'in burada gösteri hakkında bir tartışması var: http://www.infoq.com/interviews/erik-meijer-programming-language-design-effects-purity#view_93197 . Bunu beş efekt olarak özetler ve çözümü bir programlama diline tasarlayarak bir çözüm sunar. Çözüm, dilden bağımsız olarak platform veya sistem düzeyinde de elde edilebilir. Dinlendirici, mevcut uygulamada çok başarılı olan çözümlerden biri olarak görülebilir.
Dinlendirici bir stil ile, güvenilmez bir internet üzerinden uygulamanın durumunu alır ve manipüle edersiniz. Doğru ve geçerli durumu almak için geçerli işlem başarısız olursa, uygulamanın devam etmesine yardımcı olmak için sıfır doğrulama ilkesine ihtiyaç duyar. Durumu değiştiremezse, işleri doğru tutmak için genellikle birden çok onay aşaması kullanır. Bu anlamda, dinlenmenin kendisi tam bir çözüm değildir, çalışmasını desteklemek için web uygulaması yığınının diğer kısmındaki işlevlere ihtiyaç duyar.
Bu bakış açısı göz önüne alındığında, dinlenme stili gerçekten internet veya web uygulamasına bağlı değildir. Programlama durumlarının çoğu için temel bir çözümdür. Bu da basit değil, sadece arayüzü gerçekten basit hale getiriyor ve diğer teknolojilerle inanılmaz iyi başa çıkıyor.
Sadece benim 2c.
Düzenleme: İki önemli özellik daha:
Vatansızlık yanıltıcıdır. Uygulama veya sistemle değil, huzurlu API ile ilgilidir. Sistemin durum bilgisi olması gerekir. Huzurlu tasarım, vatansız bir API'ye dayalı durum bilgisi olan bir sistem tasarlamakla ilgilidir. Başka bir KG'den bazı alıntılar :
İdempotence : REST'in sıklıkla gözden kaçan bir kısmı çoğu fiilin idempotensidir. Bu, sağlam sistemlere ve anlambilimin kesin yorumlarının daha az karşılıklı bağımlılığına yol açar .
Bu inanılmaz derecede uzun bir "tartışma" ve yine de en azından söylemek oldukça kafa karıştırıcı.
IMO:
1) Dinlendirici bir programlama diye bir şey yoktur, büyük bir ortak ve bir sürü bira olmadan :)
2) Temsili Devlet Transferi (REST), Roy Fielding'in tezinde belirtilen mimari bir stildir . Bir takım kısıtlamaları var. Hizmet / Müşteriniz bunlara saygı duyuyorsa RESTful. Budur.
Kısıtlamaları (önemli ölçüde) şu şekilde özetleyebilirsiniz:
Başka var şeyleri güzel açıklayan çok iyi bir yazı daha var.
Birçok cevap geçerli bilgileri karıştırarak / karışıklık ekleyerek geçerli bilgileri kopyaladı / yapıştırdı. İnsanlar burada seviyeler hakkında, RESTFul URI'leri hakkında konuşurlar (böyle bir şey yoktur!), GET, POST, PUT ... HTTP yöntemlerini uygularlar.
Örneğin bağlantılar - güzel görünen bir API'ye sahip olmak güzel ama sonunda istemci / sunucu aldığınız / aldığınız bağlantıları gerçekten önemsemiyor, önemli olan içerik.
Sonuçta herhangi bir RESTful istemcisi, içerik biçimi bilindiği sürece herhangi bir RESTful hizmetini kullanabilmelidir.
Eski soru, cevaplamanın yeni yolu. Bu kavram hakkında çok fazla yanlış anlaşılma var. Her zaman hatırlamaya çalışıyorum:
Dinlendirici programlamayı şu şekilde tanımlarım:
Bir uygulama, istemcinin anlayacağı bir medya türünde kaynaklar (veri + durum geçişleri denetimlerinin birleşimi olması) sağlarsa dinlendiricidir
Dinlendirici bir programcı olmak için oyuncuların bir şeyler yapmasına izin veren uygulamalar geliştirmeye çalışmalısınız. Sadece veritabanını açığa çıkarmak değil.
Durum geçiş denetimleri yalnızca istemci ve sunucu kaynağın ortam türü temsilini kabul ederse anlamlıdır. Aksi takdirde, neyin kontrol olduğunu ve neyin olmadığını ve nasıl kontrol yapılacağını bilmenin bir yolu yoktur. Tarayıcılar bilmiyorsa IE<form>
etiketleri , tarayıcınızdaki geçiş durumuna göndermeniz için hiçbir şey .
Kendini tanıtmak istemiyorum, ancak konuşmamda bu fikirleri derinlemesine genişletiyorum http://techblog.bodybuilding.com/2016/01/video-what-is-restful-200.html .
Konuşmamdan bir alıntı, sıklıkla richardson olgunluk modeline atıfta bulunuyor, seviyelere inanmıyorum, ya RESTful (seviye 3) ya da değilsiniz, ama ne hakkında söylemek istediğim her seviye RESTful yolunda sizin için yapar
REST, herhangi bir web hizmetini gerçek bir RESTful API yapan 6 mimari kısıtlama tanımlar .
REST === HTTP benzetmesi, "ZORUNLU" OLMASI GEREKTİĞİNE vurgu yapana kadar doğru değildir güdümlü .
Roy burada temizledi .
İlk URI (yer imi) ve hedeflenen kitleye uygun (yani API'yı kullanabilecek herhangi bir müşteri tarafından anlaşılması beklenen) standartlaştırılmış ortam türleri kümesi dışında önceden bilgi olmadan bir REST API girilmelidir. Bu noktadan sonra, tüm uygulama durumu geçişleri, alınan sunumlarda mevcut olan veya kullanıcının bu sunumları manipüle etmesiyle ima edilen sunucu tarafından sağlanan seçeneklerin istemci seçimiyle yönlendirilmelidir. Geçişler, müşterinin medya türleri ve kaynak iletişim mekanizmaları hakkındaki bilgileri, her ikisi de anında (ör. İsteğe bağlı kod) geliştirilebilecek şekilde belirlenebilir (veya sınırlandırılabilir).
[Buradaki başarısızlık, bant dışı bilginin köprü metni yerine etkileşimi tetiklediğini gösterir.]
REST , web standartlarına ve HTTP protokolüne (2000'de tanıtıldı) dayanan mimari bir stildir.
REST tabanlı bir mimaride, her şey bir kaynaktır (Kullanıcılar, Siparişler, Yorumlar). Bir kaynağa HTTP standart yöntemlerine (GET, PUT, PATCH, DELETE vb.) Dayalı ortak bir arabirim üzerinden erişilir.
REST tabanlı bir mimaride, kaynaklara erişim sağlayan bir REST sunucunuz vardır. REST istemcisi REST kaynaklarına erişebilir ve bunları değiştirebilir.
Her kaynak HTTP ortak işlemlerini desteklemelidir. Kaynaklar global kimliklerle tanımlanır (bunlar genellikle URI'lardır).
REST, kaynakların metin, XML, JSON vb. Gibi farklı temsillerine sahip olmasına izin verir. REST istemcisi HTTP protokolü (içerik anlaşması) aracılığıyla belirli bir gösterim isteyebilir.
HTTP yöntemleri:
PUT, GET, POST ve DELETE yöntemleri REST tabanlı mimarilerde tipik olarak kullanılır. Aşağıdaki tablo bu işlemlerin bir açıklamasını vermektedir.
REST , temsili devlet transferini ifade eder .
Durum bilgisi olmayan, istemci-sunucu, önbelleğe alınabilir iletişim protokolüne dayanır ve neredeyse tüm durumlarda HTTP protokolü kullanılır.
REST genellikle mobil uygulamalarda, sosyal ağ Web sitelerinde, karma araçlarda ve otomatik iş süreçlerinde kullanılır. REST stili, sınırlı sayıda işlem (fiil) gerçekleştirerek istemciler ve hizmetler arasındaki etkileşimlerin arttığını vurgular. Esneklik, kaynaklara (isimler) kendi benzersiz evrensel kaynak göstergelerini (URI'ler) atayarak sağlanır.
Konuşmak sadece bilgi alışverişinden daha fazlasıdır . Protokol aslında hiçbir konuşmanın gerçekleşmeyeceği şekilde tasarlanmıştır. Taraflardan her biri, protokolde belirtildiği için kendi işlerinin ne olduğunu bilir. Protokoller, olası eylemlerde herhangi bir değişiklik yapılması pahasına saf bilgi alışverişine izin verir. Öte yandan konuşmak, bir tarafın diğer taraftan ne gibi önlemler alınabileceğini sormasına izin verir. Hatta aynı soruyu iki kez sorabilir ve iki farklı cevap alabilirler, çünkü diğer tarafın Devleti geçici olarak değişmiş olabilir. Konuşmak RESTful mimarisidir . Fielding'in tezi, makinelerin basitçe değil, birbirleriyle konuşmasına izin vermek istiyorsa takip etmesi gereken mimariyi belirtir. iletişim kurmasına .
Kendi başına "RESTful programlama" diye bir düşünce yoktur. Daha iyi RESTful paradigması veya daha iyi RESTful mimarisi olarak adlandırılacaktır. Bu bir programlama dili değildir. Bu bir paradigma.
Hesaplamada, temsili durum aktarımı (REST) web geliştirme için kullanılan mimari bir stildir.
Geri kalan nokta, temel işlemler (http fiiller) için ortak bir dil kullanmayı kabul edersek, altyapının bunları anlamak ve düzgün bir şekilde optimize etmek için yapılandırılabilir, örneğin, önbellekleme uygulamak için önbellek başlıklarını kullanarak seviyeleri.
Düzgün uygulanmış dinlendirici bir GET işlemi ile, bilgilerin sunucunuzun DB'sinden, sunucunuzun memcache'inden, CDN'den, proxy önbelleğinden, tarayıcınızın önbelleğinden veya tarayıcınızın yerel deposundan gelmesi önemli değildir. Oruçlu, en kolay ulaşılabilir güncel kaynak kullanılabilir.
Rest'in GET isteklerini bir action parametresiyle kullanmaktan, mevcut http fiillerini kullanmaya kadar sözdizimsel bir değişiklik olduğunu söylemek, hiçbir faydası yok ve tamamen kozmetik gibi görünmesini sağlar. Amaç, zincirin her parçası tarafından anlaşılabilen ve optimize edilebilen bir dil kullanmaktır. GET işleminizin yan etkileri olan bir eylemi varsa, tüm HTTP önbelleğe almayı atlamanız gerekir, aksi takdirde tutarsız sonuçlar elde edersiniz.
Nedir API Testi ?
API testi, API'ya çağrı göndermek ve verimi almak için programlamayı kullanır. Test, test edilen segmenti bir kara kutu olarak görür. API testinin amacı, bir uygulamada koordinasyonundan önceki parçanın doğru bir şekilde yürütüldüğünü ve köreltilmiş muameleyi doğrulamaktır.
REST API'sı
REST: Temsil Edici Devlet Transferi.
4 Yaygın Olarak Kullanılan API Yöntemleri: -
API'yi Manuel Olarak Test Etme Adımları: -
API'yı manuel olarak kullanmak için tarayıcı tabanlı REST API eklentilerini kullanabiliriz.
Bu her yerde çok daha az bahsedilmektedir, ancak Richardson'un Olgunluk Modeli aslında Restful'ın API'sının ne kadar olduğunu yargılamak için en iyi yöntemlerden biridir. Burada daha fazlası:
REST'i anlamada önemli bir yapı taşının uç noktalarda veya eşlemelerde olduğunu söyleyebilirim /customers/{id}/balance
.
Web sitesinden (ön uç) veritabanınıza / sunucunuza (arka uç) bağlantı hattı olarak bir uç nokta düşünebilirsiniz. Bunları kullanarak ön uç, uygulamanızdaki herhangi bir REST eşlemesinin karşılık gelen yöntemlerinde tanımlanan arka uç işlemleri gerçekleştirebilir.