Ders 25: Harici bir API'den veri dönüştürme
Bu eğitim dersi, harici bir API'nin yanıtını ihtiyacımız olan herhangi bir formata uyarlamaya ilişkin örnekleri göstermektedir.
Her girişe varsayılan değerler ve ek özellikler ekleme
newapi.getpop.org/wp-json/wp/v2/users/?_fields=id,name,url REST API uç noktası kullanıcı verilerini üretir; bazı kullanıcıların url özelliği boştur:
[
{
"id": 1,
"name": "leo",
"url": "https://leoloso.com"
},
{
"id": 7,
"name": "Test",
"url": ""
},
{
"id": 2,
"name": "Theme Demos",
"url": ""
}
]Aşağıdaki GraphQL query bu yanıtı dönüştürür:
urlözelliği boş olan kullanıcılara varsayılan bir URL ekler- Her kullanıcı girişine (kullanıcının adı ve URL değerleri kullanılarak oluşturulan) bir
linközelliği ekler
query {
# Retrieve data from the external API
usersWithLinkAndDefaultURL: _sendJSONObjectCollectionHTTPRequest(
input: {
url: "https://newapi.getpop.org/wp-json/wp/v2/users/?_fields=id,name,url"
}
)
# Set a default URL for users without any
@underEachArrayItem
@underJSONObjectProperty(
by: {
key: "url"
}
)
@default(
value: "https://mysite.com"
condition: IS_EMPTY
)
# Add a new "link" entry on the JSON object
@underEachArrayItem(
affectDirectivesUnderPos: [1, 2, 3, 4],
passValueOnwardsAs: "userListItem"
)
@applyField(
name: "_objectProperty",
arguments: {
object: $userListItem,
by: {
key: "name"
}
},
passOnwardsAs: "userName"
)
@applyField(
name: "_objectProperty",
arguments: {
object: $userListItem,
by: {
key: "url"
}
},
passOnwardsAs: "userURL"
)
@applyField(
name: "_sprintf",
arguments: {
string: "<a href=\"%s\">%s</a>",
values: [$userURL, $userName]
},
passOnwardsAs: "userLink"
)
@applyField(
name: "_objectAddEntry",
arguments: {
object: $userListItem,
key: "link",
value: $userLink
},
setResultInResponse: true
)
}Yanıt şöyledir:
{
"data": {
"usersWithLinkAndDefaultURL": [
{
"id": 1,
"name": "leo",
"url": "https://leoloso.com",
"link": "<a href=\"https://leoloso.com\">leo</a>"
},
{
"id": 7,
"name": "Test",
"url": "https://mysite.com",
"link": "<a href=\"https://mysite.com\">Test</a>"
},
{
"id": 2,
"name": "Theme Demos",
"url": "https://mysite.com",
"link": "<a href=\"https://mysite.com\">Theme Demos</a>"
}
]
}
}Birleştirilebilir direktifler içlerinde bir veya daha fazla direktif iç içe yerleştirebilir. Birden fazla direktif iç içe yerleştirildiğinde, bunu affectDirectivesUnderPos argümanı aracılığıyla belirtiriz; bu argüman, söz konusu direktiften iç içe direktiflerine göreli konumları içerir.
Yukarıdaki GraphQL query'de, @underEachArrayItem direktifi (Alan Değeri Yineleme ve Manipülasyon uzantısı tarafından sağlanan) birleştirilebilir bir direktiftir. İlk kullanımında yalnızca bir direktifi iç içe yerleştirmektedir ve affectDirectivesUnderPos argümanı atlanabilir:
@underEachArrayItem
@underJSONObjectProperty(
# ...
)(Bu arada, @underJSONObjectProperty'nin de @default direktifini iç içe yerleştiren birleştirilebilir bir direktif olduğuna dikkat edin.)
İkinci kullanımında ise affectDirectivesUnderPos argümanının [1, 2, 3, 4] değeriyle gösterildiği üzere sağındaki 4 direktifi iç içe yerleştirmektedir:
@underEachArrayItem(
affectDirectivesUnderPos: [1, 2, 3, 4],
# ...
)
@applyField(
name: "_objectProperty",
# ...
)
@applyField(
name: "_objectProperty",
# ...
)
@applyField(
name: "_sprintf",
# ...
)
@applyField(
name: "_objectAddEntry",
# ...
)🔥 İpuçları:
@applyField direktifi (Alan Üzerinde Alan uzantısı tarafından sağlanan) çıktısı için iki olası hedef sunar:
passOnwardsAs: "someVariableName"argümanı sağlandığında yeni değer$someVariableNamedinamik değişkenine atanır; bu değişken sonraki iç içe direktifler tarafından okunabilir:
@applyField(
name: "_objectProperty",
arguments: {
object: $userListItem,
by: {
key: "name"
}
},
passOnwardsAs: "userName"
)setResultInResponse: trueargümanı sağlandığında yeni değer yeniden alana atanır (dolayısıyla yanıtı değiştirir):
@applyField(
name: "_objectAddEntry",
arguments: {
object: $userListItem,
key: "link",
value: $userLink
},
setResultInResponse: true
)JSON nesnelerinden belirli bir özelliği çıkarma
newapi.getpop.org/wp-json/newsletter/v1/subscriptions REST API uç noktası, abonelerin e-posta adresi ve dili dahil olmak üzere e-posta abonelik verilerinin bir koleksiyonunu üretir:
[
{
"email": "abracadabra@ganga.com",
"lang": "de"
},
{
"email": "longon@caramanon.com",
"lang": "es"
},
{
"email": "rancotanto@parabara.com",
"lang": "en"
},
{
"email": "quezarapadon@quebrulacha.net",
"lang": "fr"
},
{
"email": "test@test.com",
"lang": "de"
},
{
"email": "emilanga@pedrola.com",
"lang": "fr"
}
]Bu GraphQL query, her girişten email özelliğini çıkararak alan değerini onunla değiştirip API yanıtından yalnızca e-postaları yazdırır:
query {
emails: _sendJSONObjectCollectionHTTPRequest(
input: {
url: "https://newapi.getpop.org/wp-json/newsletter/v1/subscriptions"
}
)
@underEachArrayItem(
passValueOnwardsAs: "userEntry"
)
@applyField(
name: "_objectProperty"
arguments: {
object: $userEntry,
by: {
key: "email"
}
}
setResultInResponse: true
)
}Yanıt şöyledir:
{
"data": {
"emails": [
"abracadabra@ganga.com",
"longon@caramanon.com",
"rancotanto@parabara.com",
"quezarapadon@quebrulacha.net",
"test@test.com",
"emilanga@pedrola.com"
]
}
}Alan değerlerini koşullu olarak değiştirme
Bu örnek bir öncekinin devamı niteliğinde olup yanıttaki e-postaların biçimini dönüştürmeyi de kapsamaktadır.
Aşağıdaki GraphQL query, API yanıtından e-postaları çıkarır ve dili İngilizce veya Almanca olan kullanıcıların e-postalarını Koşullu Alan Manipülasyonu uzantısı tarafından sağlanan @if birleştirilebilir direktifi aracılığıyla büyük harfe dönüştürür:
query {
# Retrieve data from a REST API endpoint
userEntries: _sendJSONObjectCollectionHTTPRequest(
input: {
url: "https://newapi.getpop.org/wp-json/newsletter/v1/subscriptions"
}
)
@remove
emails: _echo(value: $__userEntries)
# Iterate all the entries, passing every entry
# (under the dynamic variable $userEntry)
# to each of the next 4 directives
@underEachArrayItem(
passValueOnwardsAs: "userEntry"
affectDirectivesUnderPos: [1, 2, 3, 4]
)
# Extract property "lang" from the entry
# via the functionality field `_objectProperty`,
# and pass it onwards as dynamic variable $userLang
@applyField(
name: "_objectProperty"
arguments: {
object: $userEntry,
by: {
key: "lang"
}
}
passOnwardsAs: "userLang"
)
# Execute functionality field `_inArray` to find out
# if $userLang is either "en" or "de", and place the
# result under dynamic variable $isSpecialLang
@applyField(
name: "_inArray"
arguments: {
value: $userLang,
array: ["en", "de"]
}
passOnwardsAs: "isSpecialLang"
)
# Extract property "email" from the entry
# and set it back as the value for that entry
@applyField(
name: "_objectProperty"
arguments: {
object: $userEntry,
by: {
key: "email"
}
}
setResultInResponse: true
)
# If $isSpecialLang is `true` then execute
# directive `@strUpperCase`
@if(condition: $isSpecialLang)
@strUpperCase
}Yanıt şöyledir:
{
"data": {
"emails": [
"ABRACADABRA@GANGA.COM",
"longon@caramanon.com",
"RANCOTANTO@PARABARA.COM",
"quezarapadon@quebrulacha.net",
"TEST@TEST.COM",
"emilanga@pedrola.com"
]
}
}Gato GraphQL'de koşullu mantık yürütme dinamik hale getirilebilir: Sorgulanan nesne üzerinde değerlendirilen dinamik bir değişken @if(condition:)'a (ve ayrıca @unless(condition:)'a) geçirildiğinde, mantık o varlığın koşullarına bağlı olarak yürütülür ya da yürütülmez.
Bu sayede bazı varlıklar için (diğerleri için değil) yanıtı dinamik olarak değiştirebiliriz; aşağıdaki gibi koşullara bağlı olarak:
- Gönderinin yorumları var mı?
- Yorumun yanıtları var mı?
- Kullanıcı bir yönetici mi?
- Etiket/kategori herhangi bir gönderiye uygulanmış mı?
- vb.