Bu belgede, uygulamanızın performansını artırmak için kullanabileceğiniz bazı teknikler ele alınmaktadır. Bazı durumlarda, sunulan fikirleri açıklamak için diğer API'lerden veya genel API'lerden örnekler kullanılır. Ancak aynı kavramlar Gmail API'si için de geçerlidir.
gzip ile sıkıştırma
Her istek için gereken bant genişliğini azaltmanın kolay ve rahat bir yolu, gzip sıkıştırmayı etkinleştirmektir. Bu işlem, sonuçların sıkıştırılmasını açmak için ek CPU süresi gerektirse de ağ maliyetleriyle ilgili avantajları sayesinde genellikle çok faydalıdır.
Gzip kodlu bir yanıt almak için iki işlem yapmanız gerekir: Accept-Encoding
üst bilgisini ayarlayın ve kullanıcı aracınızı gzip
dizesini içerecek şekilde değiştirin. Gzip sıkıştırmayı etkinleştirmek için uygun şekilde oluşturulmuş HTTP üstbilgilerine dair bir örneği aşağıda bulabilirsiniz:
Accept-Encoding: gzip User-Agent: my program (gzip)
Kısmi kaynaklarla çalışma
API çağrılarınızın performansını artırmanın bir diğer yolu da yalnızca ilgilendiğiniz veri bölümünü göndermek ve almak olabilir. Bu sayede uygulamanız, gereksiz alanları aktarmaktan, ayrıştırmaktan ve depolamaktan kaçınarak ağ, CPU ve bellek gibi kaynakları daha verimli kullanabilir.
İki tür kısmi istek vardır:
- Kısmi yanıt: Yanıta hangi alanların dahil edileceğini belirttiğiniz bir istek (
fields
istek parametresini kullanın). - Yama: Yalnızca değiştirmek istediğiniz alanları gönderdiğiniz bir güncelleme isteğidir (
PATCH
HTTP fiilini kullanın).
Kısmi istekte bulunma hakkında daha fazla bilgiyi aşağıdaki bölümlerde bulabilirsiniz.
Kısmi yanıt
Varsayılan olarak, sunucu istekleri işledikten sonra bir kaynağın tam gösterimini geri gönderir. Daha iyi performans için sunucudan yalnızca gerçekten ihtiyacınız olan alanları göndermesini isteyebilir ve bunun yerine kısmi yanıt alabilirsiniz.
Kısmi yanıt istemek için fields
istek parametresini kullanarak döndürülmesini istediğiniz alanları belirtin. Bu parametreyi, yanıt verisi döndüren tüm isteklerle kullanabilirsiniz.
fields
parametresinin yalnızca yanıt verilerini etkilediğini, göndermeniz gereken verileri (varsa) 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ğinde fields
parametresi atlanır ve kaynağın tamamı döndürülür.
https://www.googleapis.com/demo/v1
Tam kaynak yanıtı: Tam kaynak verileri, kısa olması için çıkarılan diğer birçok alanın yanı sıra aşağıdaki alanları 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: Aynı kaynak için yapılan aşağıdaki istekte, döndürülen veri miktarını önemli ölçüde azaltmak üzere fields
parametresi kullanılıyor.
https://www.googleapis.com/demo/v1?fields=kind,items(title,characteristics/length)
Kısmi yanıt: Yukarıdaki isteğe yanıt olarak sunucu, yalnızca tür bilgilerini içeren bir yanıt ve her öğede yalnızca HTML başlığı ve uzunluk özelliği bilgilerini içeren, öğeler dizisinin kısaltılmış bir sürümünü geri 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ı içeren üst nesneleri içeren bir JSON nesnesi olduğunu unutmayın.
fields
parametresinin nasıl biçimlendirileceğiyle ilgili ayrıntılar bir sonraki bölümde, yanıtta tam olarak neyin döndürüldüğüyle ilgili daha fazla ayrıntı ise ondan sonraki bölümde ele alınmaktadır.
Alanlar parametresi söz dizimi özeti
fields
istek parametresi değerinin biçimi, XPath söz dizimine kabaca dayanır. Desteklenen söz dizimi aşağıda özetlenmiştir. Ek örnekler ise sonraki bölümde verilmiştir.
- Birden fazla alan seçmek için virgülle ayrılmış bir liste kullanın.
a/b
simgesini kullanaraka
alanı içine yerleştirilmiş birb
alanı seçin;a/b/c
simgesini kullanarakb
alanı içine yerleştirilmiş birc
alanı seçin.
İstisna: Yanıtın
data: { ... }
gibi görünen birdata
nesnesinin içine yerleştirildiği, "data" sarmalayıcılarını kullanan API yanıtları içinfields
spesifikasyonuna "data
" ifadesini eklemeyin.data/a/b
gibi bir alan belirtimiyle veri nesnesinin eklenmesi hataya neden olur. Bunun yerine,a/b
gibi birfields
spesifikasyonu kullanın.- Dizilerin veya nesnelerin belirli bir alt alan kümesini istemek için alt seçiciyi kullanın. İfadeleri parantez içine "
( )
" yerleştirin.Örneğin:
fields=items(id,author/email)
, öğeler dizisindeki her öğe için yalnızca öğe kimliğini ve yazarın e-posta adresini döndürür. Ayrıca,fields=items(id)
ilefields=items/id
aynı anlama gelecek şekilde tek bir alt alan da belirtebilirsiniz. - Gerekirse alan seçimlerinde joker karakterler kullanın.
Örneğin:
fields=items/pagemap/*
, bir sayfa haritasındaki tüm nesneleri seçer.
Alanlar parametresini kullanmayla ilgili daha fazla örnek
Aşağıdaki örneklerde, fields
parametre değerinin yanıtı nasıl etkilediği açıklanmaktadır.
Not: Tüm sorgu parametresi değerlerinde olduğu gibi, fields
parametre değeri de URL olarak kodlanmalıdır. Daha iyi okunabilirlik için bu belgedeki örneklerde kodlama atlanmıştır.
- Döndürülmesini istediğiniz alanları belirleyin veya alan seçimi yapın.
-
fields
istek parametresinin değeri, virgülle ayrılmış bir alan listesidir ve her alan, yanıtın köküne göre belirtilir. Bu nedenle, list işlemi gerçekleştiriyorsanız yanıt bir koleksiyondur ve genellikle bir kaynak dizisi içerir. Tek bir kaynak döndüren bir işlem gerçekleştiriyorsanız alanlar bu kaynağa göre belirtilir. Seçtiğiniz alan bir dizi ise (veya dizinin bir parçasıysa) sunucu, dizideki tüm öğelerin seçilen kısmını döndürür.
Aşağıda bazı koleksiyon düzeyinde örnekler verilmiştir:
Örnekler Etki items
Öğeler dizisindeki tüm öğeleri (her öğedeki tüm alanlar dahil) döndürür ancak başka alan döndürmez. etag,items
Hem etag
alanını hem de öğeler 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 yerleştirilmiş bir alan döndürüldüğünde yanıt, kapsayan üst nesneleri içerir. Üst alanlar, açıkça seçilmedikleri sürece başka alt alan içermez.context/facets/label
label
alanını yalnızcafacets
dizisinin tüm üyeleri için döndürür. Bu dizi,context
nesnesinin altında yer alır.items/pagemap/*/title
Öğeler dizisindeki her öğe için, pagemap
öğesinin alt öğeleri olan tüm nesnelerin yalnızcatitle
alanı (varsa) döndürülür.
Kaynak düzeyinde bazı örnekler:
Örnekler Etki title
İstenen kaynağın title
alanını döndürür.author/uri
İstenen kaynakta author
nesnesininuri
alt alanını döndürür.links/*/href
links
öğesinin alt öğeleri olan tüm nesnelerinhref
alanını döndürür. - Alt seçimleri kullanarak belirli alanların yalnızca bir kısmını isteyin.
- Varsayılan olarak, isteğinizde belirli alanlar belirtiliyorsa sunucu, nesneleri veya dizi öğelerini tamamen döndürür. Yalnızca belirli alt alanları içeren bir yanıt belirtebilirsiniz. Bunu, aşağıdaki örnekte gösterildiği gibi "
( )
" alt seçim söz dizimini kullanarak yaparsınız.Örnek Etki items(title,author/uri)
Öğeler dizisindeki her öğe için yalnızca title
ve yazarınuri
değerlerini döndürür.
Kısmi yanıtları işleme
Bir 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 bir hata varsa veya parametre başka bir şekilde geçersizse sunucu, HTTP 400 Bad Request
durum koduyla birlikte kullanıcının alan seçimiyle ilgili sorunu (örneğin, "Invalid field selection a/b"
) bildiren bir hata mesajı döndürür.
Yukarıdaki giriş bölümünde gösterilen kısmi yanıt örneğini aşağıda 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 şu şekilde görünür:
200 OK
{ "kind": "demo", "items": [{ "title": "First title", "characteristics": { "length": "short" } }, { "title": "Second title", "characteristics": { "length": "long" } }, ... ] }
Not: Veri sayfalandırması için sorgu parametrelerini (ör. maxResults
ve nextPageToken
) destekleyen API'lerde, her sorgunun sonuçlarını yönetilebilir bir boyuta indirmek için bu parametreleri kullanın. Aksi takdirde, kısmi yanıtla elde edilebilecek performans artışları gerçekleşmeyebilir.
Yama (kısmi güncelleme)
Ayrıca kaynakları değiştirirken gereksiz veriler göndermekten de kaçınabilirsiniz. Yalnızca değiştirdiğiniz belirli alanlar için güncellenen verileri göndermek üzere HTTP PATCH
fiilini kullanın. Bu belgede açıklanan yama semantiği, kısmi güncellemenin eski GData uygulamasında kullanılan semantikten farklıdır (ve daha basittir).
Aşağıdaki kısa örnekte, küçük bir güncelleme yapmak için göndermeniz gereken verileri yama kullanarak nasıl en aza indirebileceğiniz gösterilmektedir.
Örnek
Bu örnekte, yalnızca genel (kurgusal) bir "Demo" API kaynağının başlığını güncellemek için basit bir yama isteği gösterilmektedir. Kaynakta yorum, bir dizi özellik, durum ve başka birçok alan da var ancak bu istek yalnızca title
alanını gönderiyor. Bunun nedeni, yalnızca bu alanın değiştiriliyor olması:
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 200 OK
durum kodunu döndürür. Yama isteğine yalnızca title
alanı dahil edildiğinden, önceki değerden farklı olan tek değer budur.
Not: fields
yama ile birlikte kısmi yanıt 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 de gönderilen veri miktarını azaltmak için fields
parametresini içeren bir yama isteği kullanın.
Yama isteğinin anlamı
Yama isteğinin gövde bölümü yalnızca değiştirmek istediğiniz kaynak alanlarını içerir. Bir alan belirttiğinizde, kapsayan üst öğeler kısmi yanıt ile döndürüldüğü gibi, kapsayan üst öğeleri de eklemeniz gerekir. Gönderdiğiniz değiştirilmiş veriler, varsa üst nesnenin verileriyle birleştirilir.
- Ekle: Henüz 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ı belirtip yeni değere ayarlayın.
- Silme: Bir alanı silmek için alanı belirtin ve
null
olarak ayarlayın. Örneğin,"comment": null
. Ayrıca, değiştirilebilir bir nesneyinull
olarak ayarlayarak tamamen silebilirsiniz. Java API İstemci Kitaplığı'nı kullanıyorsanız bunun yerineData.NULL_STRING
kullanın. Ayrıntılar için JSON null başlıklı makaleyi inceleyin.
Dizilerle ilgili not: Dizi içeren yama istekleri, mevcut diziyi sizin sağladığınız diziyle değiştirir. Bir dizideki öğeleri parça parça değiştiremez, ekleyemez veya silemezsiniz.
Okuma-değiştirme-yazma döngüsünde yama kullanma
Değiştirmek istediğiniz verileri içeren kısmi bir yanıt alarak başlamak faydalı olabilir. Bu durum, özellikle kaynakları başarılı bir şekilde güncellemek için If-Match
HTTP üstbilgisinde geçerli ETag değerini sağlamanız gerektiğinden ETag'leri kullanan kaynaklar için önemlidir. Verileri aldıktan sonra, değiştirmek istediğiniz değerleri düzenleyebilir ve değiştirilen kısmi temsili bir yama isteğiyle geri gönderebilirsiniz. Aşağıdaki örnekte, Demo kaynağının ETag'leri kullandığı varsayılmaktadır:
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 dayanmaktadır. Aşağıda gösterildiği gibi, yama yanıtında döndürülen verileri sınırlamak için fields
parametresini de kullanı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 koduyla ve güncellenen kaynağın kısmi temsiliyle 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 isteklerini daha önce aldığınız verilere göre oluşturmanız gerekir. Örneğin, bir diziye öğe eklemek ve mevcut dizi öğelerini kaybetmek istemiyorsanız önce mevcut verileri almanız gerekir. Benzer şekilde, bir API ETag'leri kullanıyorsa kaynağı başarılı bir şekilde güncellemek için isteğinizle birlikte önceki ETag değerini göndermeniz gerekir.
Not: ETag'ler kullanıldığında bir yamanın uygulanmasını zorlamak için "If-Match: *"
HTTP üstbilgisini kullanabilirsiniz. Bunu yaparsanız yazmadan önce okuma işlemini gerçekleştirmeniz gerekmez.
Ancak diğer durumlarda, mevcut verileri önce almadan yama isteğini doğrudan oluşturabilirsiniz. Örneğin, bir alanı yeni bir değerle güncelleyen veya yeni bir alan ekleyen bir yama isteğini kolayca ayarlayabilirsiniz. Ö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 istekte, yorum alanında mevcut bir değer varsa yeni değer bu değeri geçersiz kılar. Aksi takdirde, yeni değer ayarlanır. Benzer şekilde, bir hacim özelliği varsa değeri üzerine yazılır, yoksa oluşturulur. Ayarlandıysa doğruluk alanı kaldırılır.
Yamanın yanıtını işleme
API, geçerli bir yama isteğini işledikten sonra değiştirilen kaynağın tam temsiliyle birlikte 200 OK
HTTP yanıt kodunu döndürür. API tarafından ETag'ler kullanılıyorsa sunucu, bir yama isteğini başarıyla işlediğinde ETag değerlerini PUT
ile yaptığı gibi günceller.
Yama isteği, döndürdüğü veri miktarını azaltmak için fields
parametresini kullanmadığınız sürece kaynağın tamamını döndürür.
Bir yama isteği, söz dizimi veya anlam açısından geçersiz olan yeni bir kaynak durumuyla sonuçlanırsa sunucu 400 Bad Request
veya 422 Unprocessable Entity
HTTP durum kodunu 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 hata döndürür.
PATCH HTTP fiili desteklenmediğinde alternatif gösterim
Güvenlik duvarınız HTTP PATCH
isteklerine izin vermiyorsa HTTP POST
isteği gönderin ve geçersiz kılma üstbilgisini aşağıdaki örnekte gösterildiği gibi PATCH
olarak ayarlayın:
POST https://www.googleapis.com/... X-HTTP-Method-Override: PATCH ...
Yama ile güncelleme arasındaki fark
Uygulamada, 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 değerler yoksayılır. Bu, kısmi güncelleme yapmanın başka bir yolu gibi görünse de bu yaklaşımın bazı sınırlamaları vardır. HTTP PUT
fiilini kullanan güncellemelerde, gerekli parametreleri sağlamazsanız istek başarısız olur ve isteğe bağlı parametreleri sağlamazsanız daha önce ayarlanan veriler temizlenir.
Bu nedenle yama kullanmak çok daha güvenlidir. Yalnızca değiştirmek istediğiniz alanlarla ilgili verileri sağlarsınız. Atladığınız alanlar temizlenmez. Bu kuralın tek istisnası, tekrarlayan öğeler veya diziler için geçerlidir: Bunların tümünü atlarsanız olduğu gibi kalırlar. Bunlardan herhangi birini sağlarsanız tüm küme, sağladığınız küme ile değiştirilir.