Bu dokümanda, uygulamanızın performansını artırmak için kullanabileceğiniz bazı teknikler anlatılmaktadır. Bazı durumlarda, sunulan fikirleri göstermek için diğer API'lerden veya genel API'lerden örnekler kullanılır. Ancak aynı kavramlar Directory API için de geçerlidir.
gzip ile sıkıştırma
Her bir istek için gereken bant genişliğini azaltmanın kolay ve rahat bir yolu gzip sıkıştırmasını etkinleştirmektir. Sıkıştırılmış sonuçların açılması için ek CPU zamanı gerekse de, ağ maliyetlerinin dengelenmesi genellikle çok değerlidir.
gzip kodlamalı bir yanıt almak için iki şey yapmanız gerekir: Bir Accept-Encoding
üstbilgisi ayarlayın ve kullanıcı aracınızı gzip
dizesini içerecek şekilde değiştirin. Burada, gzip sıkıştırmasını etkinleştirmek için düzgün şekilde oluşturulmuş bir HTTP üst bilgisi örneği verilmiştir:
Accept-Encoding: gzip User-Agent: my program (gzip)
Kısmi kaynaklarla çalışma
API çağrılarınızın performansını iyileştirmenin bir başka yolu da verilerin yalnızca ilgilendiğiniz bölümünü gönderip almaktır. Böylece uygulamanız, gerekli olmayan alanları aktarmaktan, ayrıştırmaktan ve depolamaktan kaçınabilir, böylece ağ, CPU ve bellek gibi kaynakları daha verimli kullanabilir.
İki tür kısmi istek vardır:
- Kısmi yanıt: Yanıta dahil edilecek alanları belirttiğiniz bir istek (
fields
istek parametresini kullanın). - Düzeltme: Yalnızca değiştirmek istediğiniz alanları gönderdiğiniz bir güncelleme isteği (
PATCH
HTTP fiilini kullanın).
Kısmi isteklerde bulunmayla ilgili daha fazla bilgiyi aşağıdaki bölümlerde bulabilirsiniz.
Kısmi yanıt
Varsayılan olarak sunucu, istekleri işledikten sonra kaynağın tam temsilini geri gönderir. Daha iyi performans için sunucudan, yalnızca gerçekten ihtiyacınız olan alanları göndermesini isteyip bunun yerine kısmi yanıt almasını isteyebilirsiniz.
Kısmi yanıt isteğinde bulunmak için, döndürülmesini istediğiniz alanları belirtmek üzere fields
istek parametresini kullanın. Bu parametreyi, yanıt verileri döndüren tüm isteklerle kullanabilirsiniz.
fields
parametresinin yalnızca yanıt verilerini etkilediğini, varsa göndermeniz gereken verileri etkilemediğini unutmayın. Kaynakları değiştirirken gönderdiğiniz veri miktarını azaltmak için yama isteği kullanın.
Örnek
Aşağıdaki örnekte fields
parametresinin genel (kurgusal) bir "Demo" API ile kullanımı gösterilmektedir.
Basit istek: Bu HTTP GET
isteği fields
parametresini atlar ve tam kaynağı döndürür.
https://www.googleapis.com/demo/v1
Tam kaynak yanıtı: Tam kaynak verileri, aşağıdaki alanları ve kısa olması nedeniyle çıkarılan diğer birçok alanı içerir.
{ "kind": "demo", ... "items": [ { "title": "First title", "comment": "First comment.", "characteristics": { "length": "short", "accuracy": "high", "followers": ["Jo", "Will"], }, "status": "active", ... }, { "title": "Second title", "comment": "Second comment.", "characteristics": { "length": "long", "accuracy": "medium" "followers": [ ], }, "status": "pending", ... }, ... ] }
Kısmi yanıt isteği: Bu kaynak için aşağıdaki istekte, döndürülen veri miktarını önemli ölçüde azaltmak için fields
parametresi kullanılır.
https://www.googleapis.com/demo/v1?fields=kind,items(title,characteristics/length)
Kısmi yanıt: Yukarıdaki isteğe yanıt olarak, sunucu sadece tür bilgilerini içeren bir yanıt ve her bir öğede sadece HTML başlığı ve uzunluk karakteristik bilgilerini içeren ayrıştırılmış bir items dizisi gönderir.
200 OK
{ "kind": "demo", "items": [{ "title": "First title", "characteristics": { "length": "short" } }, { "title": "Second title", "characteristics": { "length": "long" } }, ... ] }
Yanıtın, yalnızca seçilen alanları ve bunları çevreleyen üst nesneleri içeren bir JSON nesnesi olduğunu unutmayın.
Bir sonraki bölümde fields
parametresinin nasıl biçimlendirileceğiyle ilgili ayrıntılar, ardından yanıtta tam olarak nelerin döndürüldüğüne dair ayrıntılar ele alınmıştır.
Alan parametresi söz dizimi özeti
fields
istek parametresi değerinin biçimi, genel olarak XPath söz dizimine bağlıdır. Desteklenen söz dizimi aşağıda özetlenmiş ve ek örnekler aşağıdaki bölümde verilmiştir.
- Birden çok alan seçmek için virgülle ayrılmış bir liste kullanın.
a
alanının içine yerleştirilmiş birb
alanını seçmek içina/b
tuşunu kullanın.b
alanının içine yerleştirilmiş birc
alanını seçmek içina/b/c
değerini kullanın.
İstisna: Yanıtın
data: { ... }
gibi görünen birdata
nesnesinin içine yerleştirildiği "data" sarmalayıcıları kullanan API yanıtları içinfields
spesifikasyonuna "data
" ifadesini eklemeyin. Veri nesnesinidata/a/b
gibi bir alan spesifikasyonuyla eklemek hataya neden olur. Bunun yerine,a/b
gibi birfields
spesifikasyonu kullanın.- "
( )
" parantezine ifadeler yerleştirerek dizi veya nesnelerin belirli bir alt alan kümesini istemek için bir alt seçici kullanın.Örneğin:
fields=items(id,author/email)
, items dizisindeki her öğe için yalnızca öğe kimliğini ve yazarın e-postasını döndürür. Ayrıca, tek bir alt alan da belirtebilirsiniz; buradafields=items(id)
,fields=items/id
ile eşdeğerdir. - Gerekirse alan seçimlerinde joker karakterler kullanın.
Örneğin:
fields=items/pagemap/*
, sayfa haritasındaki tüm nesneleri seçer.
Alanlar parametresinin kullanımıyla ilgili daha fazla örnek
Aşağıdaki örneklerde, fields
parametre değerinin yanıtı nasıl etkilediğiyle ilgili açıklamalar bulunmaktadır.
Not: Tüm sorgu parametresi değerlerinde olduğu gibi fields
parametre değeri URL kodlamalı olmalıdır. Daha iyi okunabilirlik için bu belgedeki örneklerde kodlama kullanılmamaktadır.
- Döndürülmesini istediğiniz alanları belirleyin veya alan seçimleri yapın.
fields
istek parametresi değeri, virgülle ayrılmış bir alan listesidir ve her alan yanıtın köküne göre belirtilir. Bu nedenle, bir liste işlemi gerçekleştiriyorsanız yanıt bir koleksiyondur ve genellikle bir dizi kaynak içerir. Tek bir kaynak döndüren bir işlem gerçekleştiriyorsanız alanlar söz konusu kaynağa göre belirtilir. Seçtiğiniz alan bir diziyse (veya bir dizinin parçasıysa) sunucu, dizideki tüm öğelerin seçilen kısmını döndürür.
Aşağıda, koleksiyon düzeyinde bazı örnekler verilmiştir:
Örnekler Etki items
Öğeler dizisindeki her bir öğedeki tüm alanlar dahil olmak üzere tüm öğeleri döndürür ancak başka hiçbir alan döndürmez. etag,items
Hem etag
alanını hem de items dizisindeki tüm öğeleri döndürür.items/title
items dizisindeki tüm öğeler için yalnızca title
alanını döndürür.
İç içe geçmiş bir alan döndürüldüğünde, yanıt, ilişkili üst nesneleri içerir. Üst alanlar, açıkça seçilmediği sürece başka hiçbir alt alan içermez.context/facets/label
context
nesnesinin altında iç içe yerleştirilmiş olanfacets
dizisinin tüm üyeleri için yalnızcalabel
alanını döndürür.items/pagemap/*/title
items dizisindeki her bir öğe için pagemap
alt öğesi olan tüm nesnelerin yalnızcatitle
alanını (varsa) döndürür.
Kaynak düzeyinde bazı örnekler:
Örnekler Etki title
İstenen kaynağın title
alanını döndürür.author/uri
İstenen kaynaktaki author
nesnesininuri
alt alanını döndürür.links/*/href
links
alt öğesi olan tüm nesnelerinhref
alanını döndürür.- Alt seçimler kullanarak belirli alanların yalnızca bazı bölümlerini isteyin.
- Varsayılan olarak, isteğiniz belirli alanları belirtiyorsa sunucu, nesneleri veya dizi öğelerinin tamamını döndürür. Yalnızca belirli alt alanları içeren bir yanıt belirtebilirsiniz. Bu işlemi, aşağıdaki örnekte olduğu gibi, "
( )
" alt seçim söz dizimini kullanarak yaparsınız.Örnek Etki items(title,author/uri)
items dizisindeki her öğe için yalnızca title
değerlerini ve yazarınuri
değerini döndürür.
Kısmi yanıtları işleme
Sunucu, fields
sorgu parametresini içeren geçerli bir isteği işledikten sonra, istenen verilerle birlikte bir HTTP 200 OK
durum kodu gönderir. fields
sorgu parametresinde hata varsa veya geçersizse sunucu, kullanıcıya alan seçimiyle ilgili sorunu bildiren bir hata mesajıyla (örneğin, "Invalid field selection a/b"
) birlikte bir HTTP 400 Bad Request
durum kodu döndürür.
Yukarıdaki giriş bölümünde gösterilen kısmi yanıt örneğini burada bulabilirsiniz. İstek, hangi alanların döndürüleceğini belirtmek için fields
parametresini kullanır.
https://www.googleapis.com/demo/v1?fields=kind,items(title,characteristics/length)
Kısmi yanıt aşağıdaki gibi görünür:
200 OK
{ "kind": "demo", "items": [{ "title": "First title", "characteristics": { "length": "short" } }, { "title": "Second title", "characteristics": { "length": "long" } }, ... ] }
Not: Verileri sayfalara ayırmaya yönelik sorgu parametrelerini (örneğin, maxResults
ve nextPageToken
) destekleyen API'lerde bu parametreleri kullanarak her sorgunun sonuçlarını yönetilebilir bir boyuta indirin. Aksi takdirde kısmi yanıt ile olası performans kazanımları fark edilmeyebilir.
Yama (kısmi güncelleme)
Ayrıca, kaynakları değiştirirken gereksiz verilerin gönderilmesini de önleyebilirsiniz. Yalnızca değiştirdiğiniz belirli alanlar için güncellenmiş verileri göndermek istiyorsanız HTTP PATCH
fiilini kullanın. Bu dokümanda açıklanan yama semantiği, kısmi güncellemenin eski GData uygulamasında olduğundan farklı (ve daha basit).
Aşağıdaki kısa örnek, yama kullanmanın küçük bir güncelleme yapmak için göndermeniz gereken verileri nasıl en aza indirdiğini göstermektedir.
Örnek
Bu örnekte, yalnızca genel (kurgusal) bir "Demo" API kaynağının başlığını güncellemek için yapılan basit bir yama isteği gösterilmektedir. Kaynağın bir yorum, özellik grubu, durum ve daha birçok alanı da vardır ancak değiştirilen tek alan olduğu için bu istek yalnızca title
alanını gönderir:
PATCH https://www.googleapis.com/demo/v1/324 Authorization: Bearer your_auth_token Content-Type: application/json { "title": "New title" }
Yanıt:
200 OK
{ "title": "New title", "comment": "First comment.", "characteristics": { "length": "short", "accuracy": "high", "followers": ["Jo", "Will"], }, "status": "active", ... }
Sunucu, güncellenen kaynağın tam temsiliyle birlikte bir 200 OK
durum kodu döndürür. Yama isteğine yalnızca title
alanı eklendiğinden öncekinden farklı olan tek değer budur.
Not: Yama ile birlikte kısmi yanıt fields
parametresini kullanırsanız güncelleme isteklerinizin verimliliğini daha da artırabilirsiniz. Yama isteği yalnızca isteğin boyutunu küçültür. Kısmi yanıt, yanıtın boyutunu küçültür. Bu nedenle, her iki yönde gönderilen veri miktarını azaltmak için fields
parametresiyle bir yama isteği kullanın.
Yama isteğinin anlamı
Yama isteğinin gövdesinde yalnızca değiştirmek istediğiniz kaynak alanları bulunur. Bir alan belirttiğinizde, çevreleyen üst nesnelerin kısmi yanıt ile döndürüldüğü gibi çevreleyen tüm üst nesneleri de eklemeniz gerekir. Gönderdiğiniz değiştirilmiş veriler, varsa üst nesnenin verileriyle birleştirilir.
- Ekle: Mevcut olmayan bir alanı eklemek için yeni alanı ve değerini belirtin.
- Değiştir: Mevcut bir alanın değerini değiştirmek için alanı belirtin ve yeni değere ayarlayın.
- Sil: Bir alanı silmek için alanı belirtin ve
null
olarak ayarlayın. Örneğin,"comment": null
. Ayrıca, bir nesneyinull
olarak ayarlayarak tamamen silebilirsiniz (değişebilirse). Java API İstemci Kitaplığı kullanıyorsanız bunun yerineData.NULL_STRING
kullanın. Ayrıntılı bilgi için JSON null başlıklı makaleyi inceleyin.
Diziler hakkında not: Dizi içeren yama istekleri, mevcut diziyi sizin sağladığınız diziyle değiştirir. Bir dizideki öğeleri parça parça şeklinde değiştiremez, ekleyemez veya silemezsiniz.
Yamayı okuma-değiştirme-yazma döngüsünde kullanma
Değiştirmek istediğiniz verileri içeren kısmi bir yanıt alarak başlamak faydalı bir uygulama olabilir. Kaynağı başarılı bir şekilde güncellemek için If-Match
HTTP başlığında geçerli ETag değerini sağlamanız gerektiğinden bu durum, özellikle ETag kullanan kaynaklar açısından önemlidir. Verileri aldıktan sonra, değiştirmek istediğiniz değerleri değiştirebilir ve değiştirilen kısmi gösterimi bir yama isteğiyle geri gönderebilirsiniz. Aşağıda, demo kaynağının ETag kullandığını varsayan bir örneği görebilirsiniz:
GET https://www.googleapis.com/demo/v1/324?fields=etag,title,comment,characteristics Authorization: Bearer your_auth_token
Bu kısmi yanıttır:
200 OK
{ "etag": "ETagString" "title": "New title" "comment": "First comment.", "characteristics": { "length": "short", "level": "5", "followers": ["Jo", "Will"], } }
Aşağıdaki yama isteği bu yanıta dayalıdır. Aşağıda gösterildiği gibi yama yanıtında döndürülen verileri sınırlandırmak için fields
parametresi de kullanılır:
PATCH https://www.googleapis.com/demo/v1/324?fields=etag,title,comment,characteristics Authorization: Bearer your_auth_token Content-Type: application/json If-Match: "ETagString"
{ "etag": "ETagString" "title": "", /* Clear the value of the title by setting it to the empty string. */ "comment": null, /* Delete the comment by replacing its value with null. */ "characteristics": { "length": "short", "level": "10", /* Modify the level value. */ "followers": ["Jo", "Liz"], /* Replace the followers array to delete Will and add Liz. */ "accuracy": "high" /* Add a new characteristic. */ }, }
Sunucu, 200 OK HTTP durum kodu ve güncellenen kaynağın kısmi gösterimiyle yanıt verir:
200 OK
{ "etag": "newETagString" "title": "", /* Title is cleared; deleted comment field is missing. */ "characteristics": { "length": "short", "level": "10", /* Value is updated.*/ "followers": ["Jo" "Liz"], /* New follower Liz is present; deleted Will is missing. */ "accuracy": "high" /* New characteristic is present. */ } }
Doğrudan yama isteği oluşturma
Bazı yama istekleri için, daha önce aldığınız verileri temel almanız gerekir. Örneğin, bir diziye öğe eklemek ve mevcut dizi öğelerinin hiçbirini kaybetmek istemiyorsanız önce mevcut verileri almanız gerekir. Benzer şekilde, bir API'de ETag kullanılıyorsa kaynağı başarıyla güncellemek için önceki ETag değerini isteğinizle birlikte göndermeniz gerekir.
Not: ETag'ler kullanımdayken bir yamayı zorunlu kılmak için "If-Match: *"
HTTP üst bilgisi kullanabilirsiniz. Bunu yaparsanız yazma işleminden önce okuma işlemini yapmanız gerekmez.
Ancak diğer durumlarda, yama isteğini önce mevcut verileri almadan doğrudan oluşturabilirsiniz. Örneğin, bir alanı yeni bir değerle güncelleyen veya yeni bir alan ekleyen bir yama isteğini kolayca oluşturabilirsiniz. Örnek:
PATCH https://www.googleapis.com/demo/v1/324?fields=comment,characteristics Authorization: Bearer your_auth_token Content-Type: application/json { "comment": "A new comment", "characteristics": { "volume": "loud", "accuracy": null } }
Bu istekle birlikte, yorum alanında mevcut bir değer varsa yeni değer bunun üzerine yazılır; aksi takdirde yeni değere ayarlanır. Benzer şekilde, bir hacim özelliği varsa değerinin üzerine yazılır; değilse oluşturulur. Doğruluk alanı (ayarlanmışsa) kaldırılır.
Yamaya verilen yanıtı işleme
Geçerli bir yama isteğini işledikten sonra, API değiştirilen kaynağın tam gösterimiyle birlikte bir 200 OK
HTTP yanıt kodu döndürür. API tarafından ETag'ler kullanılıyorsa sunucu, yama isteğini başarıyla işlediğinde (PUT
'da olduğu gibi) ETag değerlerini günceller.
Yama isteği, döndürdüğü veri miktarını azaltmak için fields
parametresini kullanmadığınız sürece tüm kaynak gösterimini döndürür.
Bir yama isteği söz dizimsel veya semantik olarak geçersiz yeni bir kaynak durumuyla sonuçlanırsa, sunucu bir 400 Bad Request
veya 422 Unprocessable Entity
HTTP durum kodu döndürür ve kaynak durumu değişmeden kalır. Örneğin, zorunlu bir alanın değerini silmeye çalışırsanız sunucu bir hata döndürür.
YAMA HTTP fiili desteklenmediğinde alternatif gösterim
Güvenlik duvarınız HTTP PATCH
isteklerine izin vermiyorsa aşağıda gösterildiği gibi bir HTTP POST
isteği yapın ve geçersiz kılma başlığını PATCH
olarak ayarlayın:
POST https://www.googleapis.com/... X-HTTP-Method-Override: PATCH ...
Yama ve güncelleme arasındaki fark
Pratikte, HTTP PUT
fiilini kullanan bir güncelleme isteği için veri gönderdiğinizde, yalnızca zorunlu veya isteğe bağlı olan alanları göndermeniz gerekir. Sunucu tarafından ayarlanan alanlar için değer gönderirseniz bu alanlar yoksayılır. Bu, kısmi güncelleme yapmanın başka bir yolu gibi görünse de bu yaklaşımda bazı sınırlamalar mevcuttur. HTTP PUT
fiilini kullanan güncellemelerde, gerekli parametreleri sağlamazsanız istek başarısız olur ve isteğe bağlı parametreler sağlamazsanız önceden ayarlanmış verileri temizler.
Bu nedenle, yama kullanmak çok daha güvenlidir. Yalnızca değiştirmek istediğiniz alanlar için veri sağlarsınız; atladığınız alanlar temizlenmez. Bu kuralın tek istisnası tekrarlanan öğeler veya dizilerdir: Tümünü çıkarırsanız oldukları gibi kalırlar; herhangi birini sağlarsanız, tüm grup sağladığınız kümeyle değiştirilir.