RESTful programlama tam olarak nedir?


3983

RESTful programlama tam olarak nedir?


3
aşağıdaki bağlantıdaki yanıta da bakınız. stackoverflow.com/a/37683965/3762855
Ciro Corvino

3
REST şimdi biraz yaşlanıyor olabilir;) youtu.be/WQLzZf34FJ8
Vlady Veselinov

1
Ayrıca, daha fazla bilgi için bu bağlantıya bakın news.ycombinator.com/item?id=3538585
Ashraf.Shk786


5
@ OLIVER.KOO güzel gözlem. Sadece yeni bir şey olduğu bir zamanda sordum. Çok fazla atılıyordu ama pek çok insan bunun ne hakkında olduğunu bilmiyordu. En azından ben yapmadım ve bana bunu sormak bana yardım etti çünkü onlar da bilmek istiyorlardı.
hasen

Yanıtlar:


743

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 istekleriGETPUTPOSTDELETE 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.


2
Mevcut Idempotent İşlemlerini Lisiting: GET (Güvenli), PUT & DELETE (Bu bağlantıda istisna olarak restapitutorial.com/lessons/idempotency.html belirtilmiştir). Güvenli ve İdempotent Yöntemler için Ek Referans w3.org/Protocols/rfc2616/rfc2616-sec9.html
Abhijeet

5
a) GET ile ilgili önemli nokta, idempotence değil, güvenliktir, b) Abhijeet: RFC 2616, 2014 yılında kullanımdan kaldırılmıştır; bkz. RF 7230ff.
Julian Reschke


4
@kushalvm REST'in akademik tanımı uygulamada kullanılmamaktadır.
Warlike Şempanze

3
Etkili bir şekilde bir kavramın işlevsel olup olmadığını merak edebiliriz çünkü ona herkes için istikrarlı ve anlaşılır bir tanım
veremiyoruz

2918

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 GETve POSTbence herkes tanıyacak. Ancak, HTTP standardı PUTve 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+userdbve application/whatever+userdbbirç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 POSTiç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, DELETEvb) 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.)


178
Hayır. REST başka bir moda kelimesi olarak ortaya çıkmadı. SOAP tabanlı veri alışverişine bir alternatif tanımlamanın bir yolu olarak ortaya çıktı. REST terimi, verilerin nasıl aktarılacağı ve verilere erişileceği hakkındaki tartışmanın çerçevelenmesine yardımcı olur.
tvanfosson

111
Bununla birlikte, REST'in kalbi (pratik uygulamada) "değişiklik yapmak için GET'i kullanma, POST / PUT / DELETE kullanın", yani SOAP ortaya çıkmadan çok önce duyduğum (ve takip ettiğim) tavsiyedir. REST her zaman oradaydı, yakın zamana kadar "bunu yapmanın yolu" nun ötesinde bir isim bulamadı.
Dave Sherohman

37
"Uygulama durumunun motoru olarak Köprü Metni" ni unutmayın.
Hank Gay

45
Bu cevap noktayı kaçırıyor. HTTP, Fielding'in tezinde zar zor geçiyor.
user359996

18
Bu cevap REST'in amacından bahsetmiyor ve her şeyin temiz URI'lerle ilgili olduğunu gösteriyor. Bu REST'in popüler algısı olsa da, D.Shawley ve oluylerin cevapları daha doğrudur - önbelleğe almak gibi mimaride yerleşik özelliklerden yararlanmak yerine onunla çalışmaktan ibarettir. Daha güzel URI'lar çoğunlukla yaygın bir yan etkidir.
TR

534

RESTful programlama hakkında:

  • kaynaklar kalıcı bir tanımlayıcı tarafından tanımlanıyor: URI'ler bu günlerde her yerde tanımlayıcı seçimi
  • kaynaklar fiiller ortak seti kullanılarak manipüle ediliyor: HTTP yöntemleri sıklıkla görülen harfe - saygıdeğer Create, Retrieve, Update, Deleteolur 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.
  • bir kaynak için alınan gerçek temsil, tanıtıcıya değil isteğe bağlıdır: XML, HTTP ve hatta kaynağı temsil eden bir Java Nesnesi isteyip istemediğinizi kontrol etmek için Accept üstbilgilerini kullanın
  • nesnedeki durumu korumak ve temsildeki durumu temsil etmek
  • Kaynağın temsilindeki kaynaklar arasındaki ilişkileri temsil eden: nesneler arasındaki bağlantılar doğrudan temsile gömülür
  • kaynak gösterimleri, gösterimin nasıl kullanılabileceğini ve hangi koşullar altında tutarlı bir şekilde atılması / yeniden oluşturulması gerektiğini açıklar: HTTP Cache-Control başlıklarının kullanımı

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.


36
Bu soru için okuma listesi sağlayan bir cevap çok uygundur.
ellisbben

25
Güncelleme için teşekkürler. PUTve POSTgüncelleme ve oluşturma ile birebir eşleme yapmayın. PUTistemci URI'nin ne olacağını dikte ederse oluşturmak için kullanılabilir. POSTsunucu yeni URI'yi atarsa ​​oluşturur.
D.Shawley

8
PATCH'i unutmayın.
epitka

4
URN, 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.
D.Shawley

2
@ellisbben Kabul etti. Doğru anlıyorsam bu REST'e
Philip Couling

408

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 ( lnameve agedeğişmeden kalacaktır):

PATCH /user/123
fname=Johnny

Kaydını güncellemek için (ve dolayısıyla lnameve ageNULL olacaktır):

PUT /user/123
fname=Johnny

39
Benim için bu cevap istenen cevabın özünü yakaladı. Basit ve pragmatik. Başka birçok kriter var, ancak sağlanan örnek harika bir fırlatma rampası.
CyberFonic

92
Son örnekte @pbreitenbach kullanır PUT fname=Jonny. Bu ayar lnameve agevarsayı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, PATCHyöntemi gösterimle belirtilmeyen alanları değiştirmediğinden kullanın .
Nicholas Shanks

24
Nicholas haklı. Ayrıca, bir kullanıcı oluşturan ilk POST için URI kullanıcı olarak adlandırılmalıdır, çünkü /user/1hiçbir anlam ifade etmez ve adresinde bir giriş olmalıdır /users. Bu durumda yanıt 201 Createdsadece iyi değil , bir de olmalıdır .
DanMan

1
Bu sadece RESTful api değil bir API örneğidir. Bir RESTful'in uyduğu kısıtlamalar vardır. İstemci-Sunucu Mimarisi, Durum Bilgisi Olmayan, Önbellek Yeteneği, Katmanlı Sistem, Düzgün Arayüz.
Radyasyon

Tüm http servlet erişim yöntemlerini kapsayan çok kompakt bir cevap
Himanshu Ahuja

181

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 .

Richardson Olgunluk Modeli

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.


5
Bence bu cevap REST'i anlamak için kilit noktaya değiniyor: Temsili kelimesinin anlamı nedir. Seviye 1 - Kaynaklar devlet hakkında der . Seviye 2 - HTTP Fiiller aktarım hakkında bilgi verir (okuma değişikliği ). Seviye 3 - HATEOAS, gelecekteki aktarımları temsil yoluyla (JSON / XML / HTML iade edildi) desteklediğini, yani döndürülen bilgilerle bir sonraki konuşmayı nasıl söyleyeceğinizi bildiğiniz anlamına geliyor. Böylece REST şunu okur: "((temsili durum) aktarımı)" yerine "(temsili (durum aktarımı))".
9c 14


136

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.

http://rest.elkstein.org/


Bu gerçekten özlü bir cevap. Ayrıca REST'in neden vatansız olarak adlandırıldığını açıklayabilir misiniz?
Chaklader Asfak Arefe

89

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

18
Bu, "dinlendirici" ile aynı olmayan "HTTP'yi doğru kullanmak" (bununla ilgili olmasına rağmen)
Julian Reschke

2
Ayrıca / user / del / 2 ve / user / remove / 2 veya ... GET / DELETE / PUT / POST, bu tür şeyleri yapmak için sadece standart, "uygun" bir yoldur (ve Julian'ın dediği gibi, hepsi bu değil REST var)
dbr

1
Tabii, ama onlardan kaçınmak için bir sebep yok .. REST her seferinde tekerleği yeniden keşfetmenizi sağlar. Bir API için, REST harika (tutarlılık!), Ancak rastgele bir web sitesi yapılandırmak için gerçekten söyleyeceğim önemli değil (değerinden daha fazla güçlük olabilir)
dbr

14
Vadim, bu sadece RPC olurdu. Bir arama motoru silme bağlantılarınızı örterek hepsini ziyaret edebileceğinden, verileri değiştirmek için GET'i kullanmak da tehlikelidir.
aehlke

7
@aehlke - Bence asıl soru "Neden anonim bir kullanıcı sisteminizden kayıtları silme yeteneğine sahip?"
Spencer Ruport

68

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.


2
ama düz ileri değil .. olması gerektiği daha karmaşık hale getirir.
hasen

4
Ayrıca, REST ve RESTful terimleri hemen hemen yalnızca web uygulamaları alanında kullanılsa da, teknik olarak REST'i HTTP'ye bağlayan hiçbir şey yoktur.
Hank Gay

3
Fielding'in blogunda REST ve yaygın yanılgılarla ilgili bazı iyi, daha kolay anlaşılır makaleler var: roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven
aehlke

3
@HankGay Daha ezoterik olmamasının sebebi, çoğu web hizmeti geliştiricisinin REST'i SOAP gibi alternatiflere göre harika bir basitleştirme olarak görmesidir. Tüm REST tekniklerini doğru yapmaya ve muhtemelen REST fanatiklerini çılgına döndürmeye bağlı kalmazlar - ancak çoğu durumda sonuçlarının "hiper ortam etkin" olduğundan emin olmak gibi şeyler hakkında endişelenmeleri gerekmez.
moodboom

47

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'i Öğrenin: Bir Eğitim

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.


Bu makalede, HTTP ve REST arasındaki ilişki açıklanmaktadır freecodecamp.org/news/…
Only You

45

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.)


12
havalı bağlantılar, teşekkürler. Bazı örnek "REST-ful" olmadığını söyleyen bu REST adamlarından bıktım, ancak örneği REST-ful olarak nasıl değiştireceğimizi söylemeyi reddediyorum.
coder_tim

38

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.

  • İlke 1: Herşey Bir Kaynaktır REST mimari tarzında, veri ve işlevsellik kaynaklar olarak kabul edilir ve bunlara genellikle Web'de bağlantı sağlayan Tekdüzen Kaynak Tanımlayıcıları (URI'ler) kullanılarak erişilir.
  • İlke 2: Her Kaynak Benzersiz Bir Tanımlayıcı (URI) ile Tanımlanır
  • İlke 3: Basit ve Düzgün Arayüzler Kullanın
  • İlke 4: İletişim Temsil Edilerek Yapılır
  • İlke 5: Vatansız Olun

1
Ne anlama Communication is Done by Representationgeliyor?
mendez7

33

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.


7
peki .... bu örnek nasıl dinlendirici olur? dinlendirmek için URL'yi nasıl değiştirirdiniz?
hasen

1
hasen: Bütün işlemler için tek bir kaynak kullanma olabilir gerekli dinlendiriciliğin için değil, aynı değildir yeterli .
Ken

18
tamam iyi .. daha fazla açıklayabilir misin? Doğru olduğunu bildiğiniz (veya düşündüğünüz) söylemeden "bu adamlar yanlış .. Neyin doğru olduğunu biliyorum" demenin anlamı nedir?
hasen

5
Bağlantıyı Fielding'in tanımına verdim. Ben diğer tepkilere tam olarak farklı olduğunu söylediğimi düşündüm: hipermetin tarafından yönlendirilmesi gerekiyor. "/ User / 123" bazı bant dışı API belgelerinden geliyorsa, RESTful değildir. Köprü metninizdeki bir kaynak tanımlayıcısından geliyorsa, o zaman öyledir.
Ken

1
Veya / users / gibi bir giriş noktası kullanabilirsiniz ve her biri için kullanıcı kaynaklarının VE URI'nin bir listesini verecektir. Sonra kaynaklar keşfedilebilir ve gezinti hipermetin güdümlü olur.
aehlke

26

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:

  1. istemci-sunucu mimarisi

    Bu nedenle, örneğin PUB / SUB soketleri ile çalışmaz, REQ / REP'ye dayanır.

  2. 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.)

  3. yapabiliyorsanız önbellek kullanımı

    Böylece aynı istekleri tekrar tekrar yerine getirmek zorunda değilsiniz.

  4. 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/orderuygun 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 - createdbaş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.

  5. ö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.

  6. 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 ... ;-)


22

RESTful (Temsili durum aktarımı) API programlama, 5 temel yazılım mimari stil ilkesini izleyerek herhangi bir programlama dilinde web uygulamaları yazmaktadır :

  1. Kaynak (veri, bilgi).
  2. Benzersiz global tanımlayıcı (tüm kaynaklar URI tarafından tanımlanmış benzersizdir ).
  3. Tek tip arayüz - basit ve standart arayüz (HTTP) kullanın.
  4. Temsil - tüm iletişim temsil yoluyla yapılır (ör. XML / JSON )
  5. Vatansız (her istek tamamen yalıtılır, önbelleklenmesi ve yük dengesi daha kolaydı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.


17

REST'teki orijinal tezi sadece 3 kısa cümleye indirmem gerekirse, aşağıdakilerin özünü yakaladığını düşünüyorum:

  1. Kaynaklar URL'ler aracılığıyla talep edilir.
  2. Protokoller, URL'leri kullanarak iletişim kurabileceğiniz şeylerle sınırlıdır.
  3. Meta veriler ad-değer çiftleri (post data ve sorgu dizesi parametreleri) olarak geçirilir.

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.


17

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.


17

İş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.


15

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:


1
Bir MVC bakış açısı: Rest Rest En Kötü Uygulamalar blogu, modelleri ve kaynakları karıştırmamanızı önerdi . Django'nun İki Scoops kitabı , Rest API'nin görünüm olduğunu ve iş mantığını görünüme karıştırmamanızı önermektedir. Uygulamanın kodu uygulamada kalmalıdır.
minghua


14

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:

  • vatansız iletişim
  • HTTP spesifikasyonlarına uyma (HTTP kullanılıyorsa)
  • iletilen içerik biçimlerini açıkça iletir
  • uygulama durumunun motoru olarak hiper medya kullanmak

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.


14

Eski soru, cevaplamanın yeni yolu. Bu kavram hakkında çok fazla yanlış anlaşılma var. Her zaman hatırlamaya çalışıyorum:

  1. Yapısal URL'ler ve Http Yöntemleri / Fiilleri, dinlendirici programlamanın tanımı değildir.
  2. JSON dinlendirici bir programlama değil
  3. RESTful programlama API'lar için değildir

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

açıklamalı richardson olgunluk modeli



11

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.]


soruyu diğerleri kadar iyi cevaplamıyor, ancak alakalı bilgi için +1!
CybeX

Bunun da soruyu cevapladığını düşünüyorum, ancak örneğin vatansızlık ondan eksik. Her kısıtlama önemlidir ... Standart ortam türü parça her zaman doğru değildir. Demek istediğim, anlayış katmanları var. Örneğin, RDF kullanıyorsanız, ortam türü anlaşılabilir ancak içeriğin anlamı anlaşılamaz. Yani müşterinin kelime bilgisini de bilmesi gerekir. Bazı insanlar REST API bu tür ve köprüler tanımlamak için genel bir DİNLENME vocab vb denemelere devam etmektedir hydra-cg.com
inf3rno

11

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.

  • GET, yan etkiler olmadan kaynağın okuma erişimini tanımlar. Kaynak hiçbir zaman bir GET isteği ile değiştirilmez, örneğin isteğin hiçbir yan etkisi yoktur (idempotent).
  • PUT yeni bir kaynak oluşturur. Ayrıca idempotent olmalı.
  • DELETE kaynakları kaldırır. Operasyonlar idempotent. Farklı sonuçlara yol açmadan tekrarlanabilirler.
  • POST mevcut bir kaynağı günceller veya yeni bir kaynak oluşturur.

Birkaç alıntı, ancak belirtilen tek bir kaynak değil. Bunu nereden aldın?
djvg

10

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.

Dinlenme Hakkında Giriş


10

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 .


10

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.

Wikipedia'dan :

Hesaplamada, temsili durum aktarımı (REST) ​​web geliştirme için kullanılan mimari bir stildir.


9

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.


5
"Rest'in sadece sözdizimsel bir değişiklik olduğunu söylemek ... hiçbir faydası yok ve tamamen kozmetik gibi görünmesini sağlıyor" --- tam da bu yüzden burada SO'daki cevapları okuyorum. REST'in neden tamamen kozmetik olmadığını açıklamadığınızı unutmayın.
osa

5

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.

  • Testçilerin isteklerini yerine getirdikleri ve yanıtlar aldığı işlevlerin bir düzenlemesidir. REST API'sinde etkileşimler HTTP protokolü üzerinden yapılır.
  • REST ayrıca bilgisayarlar arasında ağ üzerinden iletişim kurulmasına da izin verir.
  • İleti göndermek ve almak için HTTP yöntemlerini kullanmayı içerir ve Web hizmetlerinden farklı olarak katı bir ileti tanımı gerektirmez.
  • REST iletileri genellikle XML veya JavaScript Nesne Gösterimi (JSON) biçiminde kabul eder.

4 Yaygın Olarak Kullanılan API Yöntemleri: -

  1. GET: - Bir kaynağa salt okunur erişim sağlar.
  2. POST: - Yeni bir kaynak oluşturmak veya güncellemek için kullanılır.
  3. PUT: - Varolan bir kaynağı güncelleştirmek veya değiştirmek veya yeni bir kaynak oluşturmak için kullanılır.
  4. SİL: - Bir kaynağı kaldırmak için kullanılır.

API'yi Manuel Olarak Test Etme Adımları: -

API'yı manuel olarak kullanmak için tarayıcı tabanlı REST API eklentilerini kullanabiliriz.

  1. POSTMAN (Chrome) / REST (Firefox) eklentisini yükle
  2. API URL'sini girin
  3. REST yöntemini seçin
  4. İçerik Başlığı Seçin
  5. İstek JSON'u girin (POST)
  6. Gönder'i tıklayın
  7. Çıktı yanıtını döndürür

REST API'sini Otomatikleştirme Adımları


5
bu bile doğru bir cevap değil
therealprashant

5

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ı:

Richardson Olgunluk Modeli


Fielding'in REST'e getirdiği kısıtlamalara bakarsanız, bir API'nin RESTful olarak görüntülenmesi için RMM'nin 3. Katmanına ulaşması gerektiğini açıkça göreceksiniz, ancak bu başarısızlık için yeterli olasılık olduğu için aslında yeterli değildir. REST fikri - istemcilerin sunucu API'larından ayrılması. Tabii ki, Katman 3 HATEOAS kısıtlamasını yerine getiriyor, ancak gereksinimleri kırmak ve istemcileri bir sunucuya sıkıca bağlamak (yani yazılı kaynakları kullanarak) hala kolaydır
Roman Vottner

2

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.