Ruby SDK
pushizo (RubyGems) — Ruby 3.0+, Net::HTTP; üretilen modeller ve kaynak metotları, yeniden deneme, idempotency, Enumerator sayfalama, webhook imza doğrulaması.
Kaynak: sdk/ruby. Modeller ve kaynak metotları api/openapi.yaml'dan üretilir (lib/pushizo/generated/); kimlik doğrulama, yeniden deneme, idempotency, sayfalama ve webhook imza doğrulaması el yazımıdır. Çalışma zamanı bağımlılığı yoktur.
Kurulum
# Gemfile
gem "pushizo"Kullanım
require "pushizo"
hs = Pushizo::Client.new(api_key: ENV.fetch("HS_API_KEY"), app_id: "app_…") # yerelde base_url: "http://localhost:4000"
# Bildirim gönder: Idempotency-Key verilmezse otomatik UUID
res = hs.notifications.create(
{
target: { include_aliases: { external_id: ["user-42"] } },
contents: { en: "Your order shipped", tr: "Siparişiniz kargoya verildi" }
},
idempotency_key: "order-1001"
)
puts res.id, res.status
# Kullanıcı oluştur/güncelle (Hash veya model nesnesi kabul edilir)
hs.users.upsert(Pushizo::Models::UpsertUserDto.new(external_id: "user-42", tags: { plan: "pro" }))
# Cursor sayfalama: Enumerator, sayfalar tembel yüklenir
hs.segments.list_all(limit: 100).each { |segment| puts segment.name }
# Başka bir app için tek çağrı
hs.apps.get(app_id: "app_diger")
# SDK identity verification
identity_hash = Pushizo.identity_hash(ENV.fetch("HS_SDK_SECRET"), "user-42")Yanıtlar Pushizo::Models::* nesneleridir: alanlara snake_case metotla (msg.status) ya da msg["status"] ile erişilir, to_h JSON adlarıyla ham hash döner. Kaynaklar hs.notifications, hs.users, hs.aliases, hs.subscriptions, hs.events, hs.channels, hs.segments, hs.templates, hs.campaigns, hs.journeys, hs.in_app_messages, hs.inbox, hs.categories, hs.preferences, hs.suppressions, hs.webhooks, hs.analytics, hs.exports, hs.imports, hs.api_keys, hs.apps, hs.organization. Object#send ile çakışmaması için events.send → send_events, campaigns.send → send_campaign olarak adlandırılmıştır. A/B kazananı: campaigns.select_winner, in_app_messages.select_winner (in_app_messages.winner eski addır, kullanımdan kaldırılmıştır). SDK'da metodu olmayan uçlar ya da JSON dışı yanıtlar için hs.request(:get, "/v1/apps/{appId}/analytics/messages", query: { format: "csv" }).
Ayarlar
| Parametre | Varsayılan | Açıklama |
|---|---|---|
api_key: | — | hs_live_… API anahtarı (Bearer) |
app_id: | nil | Çağrıda app_id: verilmezse kullanılan app |
base_url: | https://api.pushizo.com | API adresi |
timeout: | 30 | Deneme başına zaman aşımı (sn) |
max_retries: | 3 | En fazla yeniden deneme (politika) |
auto_idempotency_key: | true | Idempotency-Key destekleyen çağrılarda otomatik UUID |
transport: | NetHttpTransport | Özel taşıma (#call(method, url, headers, body, timeout)) |
Her çağrı request_options: { timeout: 5, max_retries: 0, headers: { … } } ile ayrıca ayarlanabilir.
Hatalar
Kalıcı hatalar Pushizo::Error alt sınıflarıdır: status, code, request_id, details.
begin
hs.notifications.get("msg_yok")
rescue Pushizo::NotFoundError
# 404
rescue Pushizo::InvalidRequestError => e
# 400/422 — e.code == Pushizo::ErrorCode::NO_RECIPIENTS
rescue Pushizo::Error => e
# AuthenticationError, PermissionDeniedError, ConflictError, RateLimitError, ServerError, NetworkError
warn "#{e.status} #{e.code} #{e.message}"
endYeniden deneme politikası
Yeniden denemeler üstel geri çekilmeyle (0,3 / 1 / 3 sn; Retry-After başlığı varsa ona uyulur) en fazla max_retries: kez yapılır. Sunucuda tekrarlanması güvenli olmayan isteklerin çift işlenmemesi için kural HTTP metoduna göre değişir:
| Durum | GET, HEAD, OPTIONS, PUT, DELETE | POST, PATCH |
|---|---|---|
429 | Yeniden denenir | Yeniden denenir (istek işlenmeden reddedilmiştir) |
5xx, zaman aşımı, gönderim sonrası bağlantı kopması | Yeniden denenir | Yalnızca Idempotency-Key varsa |
İstek hiç gönderilemedi (SocketError (DNS), Errno::ECONNREFUSED, Errno::EHOSTUNREACH/ENETUNREACH, Net::OpenTimeout) | Yeniden denenir | Yeniden denenir |
Diğer 4xx | Denenmez | Denenmez |
5xx ya da gönderim sonrası ağ hatasında sunucu isteği işlemiş olabilir; anahtarsız bir POST/PATCH tekrarı çift bildirim veya kayıt üretebilir. notifications.create ve users.upsert anahtar verilmezse otomatik UUID üretir (otomatik anahtar kapatılmadıysa), bu yüzden bu iki çağrı güvenle yeniden denenir. Başka bir POST/PATCH çağrısının da yeniden denenmesini istiyorsanız anahtarı kendiniz verin: hs.events.send_events(body, request_options: { idempotency_key: "evt-#{id}" }). Yeniden denemelerde aynı anahtar gönderilir; API aynı anahtarla 24 saat içinde gelen tekrarı ilk yanıtla karşılar.
Webhook imza doğrulaması
# Rails
class PushizoWebhooksController < ActionController::API
def create
events = Pushizo::Webhook.construct_events(
request.raw_post, # ham gövde
request.headers["Pushizo-Signature"],
ENV.fetch("HS_WEBHOOK_SECRET") # rotasyonda [eski, yeni] verilebilir
)
events.each { |event| } # tekil veya batch; event["id"] ile tekrarları ayıklayın
head :no_content
rescue Pushizo::WebhookSignatureError => e
render plain: e.reason, status: :bad_request
end
endZaman damgası 5 dakikadan eskiyse (tolerance:) istek replay sayılır. Yalnızca doğrulama için Pushizo::Webhook.verify_signature(...) ok?, timestamp, reason döner. Olay türleri: Webhook'lar.
Geliştirme
rake test # sdk/ruby içinde
node sdk/scripts/generate-server-sdks.mjs --lang ruby # depo kökünde; generated/ yenilenir.NET SDK
Pushizo (NuGet) — .NET 8, HttpClient ve System.Text.Json; üretilen modeller ve kaynaklar, yeniden deneme, idempotency, IAsyncEnumerable sayfalama, webhook imza doğrulaması.
API'ye genel bakış
Kimlik doğrulama, kapsamlar, hata zarfı, idempotency, hız sınırı, sayfalama; OpenAPI sözleşmesi ve Postman koleksiyonu.