# Hizmet Gereksinim Yanıtları

https://dev.wisecp.com/tr/hizmet-gereksinim-yanitlari

Bir hizmette müşterinin gereksinimlere verdiği yanıtları okuyan, ekleyen, düzenleyen ve silen dört uç.

## Genel Bakış

Gereksinim, ürünün sipariş anında sorduğu sorudur; burada o soruların **hizmetteki cevapları** yönetilir. Soruların kendisi ürün tarafında tanımlanır.

Bir yanıt iki kaynaktan gelir. **Tanıma bağlı** olanlar ürün gereksinimine bağlıdır ve o tanımın tipini, seçeneklerini ve modül eşlemesini taşır. **Serbest** olanlar yalnız bir etiket ve içeriktir; sonradan elle eklenir ve modüle geçmez.

## Referans

### Yanıtları Listeleme

get/api/v1/admin/services/{id}/requirements

`Services/GetServiceRequirements` admin

Hizmete verilmiş gereksinim yanıtlarının tamamını döndürür.

Dönen alanlar data[] — 8

idintYanıt kaydının kimliği. Güncelleme ve silme bunu kullanır.

requirement_idintBağlı ürün gereksinim tanımının kimliği. Serbest gereksinimde sıfır.

keystring`product` tanımdan gelir, `custom` serbest eklenmiştir.

namestringGereksinimin adı ya da etiketi.

typestringAlan tipi: `text`, `select`, `radio`, `checkbox` ya da `file`.

responsestring | array 4 alanVerilen yanıt. Dosya tipinde dosya nesnelerinden oluşan dizi, diğerlerinde düz metin.

namestringSunucuda saklanan ad.

file_namestringMüşterinin yüklediği özgün ad.

sizeintDosya boyutu, bayt olarak.

pathstringDosyanın saklandığı yol.

response_mkeystringSeçimin modüle geçirilecek karşılığı. Yalnız seçim tiplerinde dolar ve kendiliğinden çözülür.

field_optionsarrayTanımın sunduğu seçenekler.

Hatalar 2

not_found404Hizmet bulunamadı.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/services/506/requirements' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res  = await fetch('https://panel.ornek.com/api/v1/admin/services/506/requirements', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/services/506/requirements');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
$response = Api::Services()->GetServiceRequirements(['id' => 506]);

// 'response' tipe gore sekil degistirir: dosyada dizi, digerlerinde metin.
foreach ($response['data'] as $req) {
    $answer = $req['type'] === 'file'
        ? array_column($req['response'], 'file_name')
        : $req['response'];
}
```

Yanıt 200

```json
{
  "data": [
    {
      "id": 12,
      "requirement_id": 22,
      "key": "product",
      "name": "Game Name",
      "type": "text",
      "response": "Minecraft",
      "response_mkey": "",
      "field_options": []
    }
  ]
}
```

### Yanıt Ekleme

post/api/v1/admin/services/{id}/requirements

`Services/CreateServiceRequirement` admin iki gövde şekli

Hizmete gereksinim yanıtı ekler. Tanıma bağlı ya da serbest olabilir.

Gövde — ortak 1

sourcestringHangi gövde şeklinin geçerli olduğu: `defined` tanıma bağlar, `custom` serbest ekler. Varsayılan `defined`.

Gövde — tanıma bağlı 3

requirement_idintzorunluBağlanacak ürün gereksinim tanımının kimliği.

responsestring | arrayYanıt. Seçim tiplerinde tanımdaki seçeneğin **kimliği** gönderilir, metni değil; çoklu seçimde virgülle ayrılmış liste ya da dizi.

filestringDosya girişi. Tanım dosya tipindeyse bunun yerine bu alan gerekir: base64 veri adresi ya da indirilebilir bağlantı.

Gövde — serbest 4

labelstringzorunluGereksinimin etiketi.

typestring`text` ya da `file`. Varsayılan `text`; serbest gereksinimde seçim tipleri yoktur.

contentstringMetin yanıtı. Metin tipinde gerekir.

filestringDosya girişi. Dosya tipinde gerekir.

Dönen alanlar data

dataobjectOluşturulan yanıt, `201` ile döner. Liste şemasının bir satırıyla aynıdır.

Hatalar 8

not_found404Hizmet bulunamadı.

requirement_id_required422Tanıma bağlanırken kimlik verilmedi.

definition_not_found422Gereksinim tanımı bulunamadı.

response_required422Yanıt boş.

content_required422Metin boş.

label_required422Etiket boş.

file_invalid422Dosya çözümlenemedi ya da saklanamadı.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X POST 'https://panel.ornek.com/api/v1/admin/services/506/requirements' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"source":"custom","label":"Server Name","type":"text","content":"srv-01"}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/services/506/requirements', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    source: 'custom',
    label: 'Server Name',
    type: 'text',
    content: 'srv-01',
  }),
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/services/506/requirements');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'source'  => 'custom',
        'label'   => 'Server Name',
        'type'    => 'text',
        'content' => 'srv-01',
    ]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Secim tipinde SECENEGIN KIMLIGI gonderilir; metni gondermek yanlis kaydeder.
$definition = Api::Products()->GetRequirement(['id' => 22])['data'];
$option     = $definition['langs']['en']['options'][0];

Api::Services()->CreateServiceRequirement([
    'id'             => 506,
    'source'         => 'defined',
    'requirement_id' => 22,
    'response'       => $option['id'],
]);
```

### Yanıtı Güncelleme

patch/api/v1/admin/services/{id}/requirements/{req_id}

`Services/UpdateServiceRequirement` admin dosya düzenlenemez

Metin tabanlı bir yanıtı değiştirir. Dosya yanıtları düzenlenemez.

Gövde 1

responsestringYeni yanıt. Çoklu seçimde virgülle ayrılmış seçenek kimlikleri.

Dönen alanlar data

dataobjectYanıtın güncel hâli. Liste şemasının bir satırıyla aynıdır; seçim tiplerinde `response_mkey` yeniden çözülür.

Hatalar 3

not_found404Hizmet ya da gereksinim bulunamadı.

file_not_editable422Dosya gereksinimi düzenlenemez. Silip yeniden eklemeniz gerekir.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X PATCH 'https://panel.ornek.com/api/v1/admin/services/506/requirements/12' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"response":"Valheim"}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/services/506/requirements/12', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ response: 'Valheim' }),
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/services/506/requirements/12');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PATCH',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['response' => 'Valheim']),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Dosya yanitini degistirmenin yolu sil-ve-yeniden-ekle'dir.
Api::Services()->DeleteServiceRequirement(['id' => 506, 'req_id' => 12]);

Api::Services()->CreateServiceRequirement([
    'id'     => 506,
    'source' => 'custom',
    'label'  => 'Contract',
    'type'   => 'file',
    'file'   => 'data:application/pdf;base64,' . base64_encode($pdf),
]);
```

### Yanıtı Silme

delete/api/v1/admin/services/{id}/requirements/{req_id}

`Services/DeleteServiceRequirement` admin dosya da silinir

Gereksinim yanıtını siler. Dosya tipindeyse yüklenen dosya diskten de kaldırılır.

Dönen alanlar data — 2

deletedboolSilme başarılı mı.

idintSilinen kaydın kimliği.

Hatalar 2

not_found404Hizmet ya da gereksinim bulunamadı.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/services/506/requirements/12' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/services/506/requirements/12', {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${apiKey}` },
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/services/506/requirements/12');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'DELETE',
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
$response = Api::Services()->DeleteServiceRequirement([
    'id'     => 506,
    'req_id' => 12,
]);
```

## Tuzaklar

> **Seçim tipinde metin değil kimlik gönderilir**
> 
> Açılır liste, tek seçim ve çoklu seçim tiplerinde yanıt olarak tanımdaki seçeneğin **kimliği** gönderilir. Seçeneğin görünen metnini göndermek hata vermez ama yanlış değeri kaydeder ve modül eşlemesi çözülemez. Kimlikleri ürün gereksinim tanımından okuyun.

> **Dosya yanıtı düzenlenemez**
> 
> Güncelleme ucu dosya tipinde `file_not_editable` döndürür. Bir dosyayı değiştirmenin tek yolu kaydı silip yenisini eklemektir; silme işlemi yüklenen dosyayı diskten de kaldırır, yani eskisi geride kalmaz.

> **Yanıtın şekli tipe göre değişir**
> 
> Listede `response` alanı dosya tipinde **dizi**, diğer tiplerde **düz metin** gelir. Tek bir şekil bekleyen kod dosya gereksinimi olan ilk hizmette patlar; okumadan önce `type` alanına bakın.

> **Serbest gereksinim modüle geçmez**
> 
> Serbest eklenen bir gereksinim yalnız kayıtta durur: tanımı olmadığı için modül eşlemesi de yoktur. Cevabın sunucuda bir işe yaraması gerekiyorsa gereksinimi ürün tarafında tanımlayın ve buraya tanıma bağlı olarak ekleyin.

## İlgili Makaleler

- [Ürün Gereksinimleri](https://dev.wisecp.com/tr/urun-gereksinimleri)
- [Hizmet Uçları](https://dev.wisecp.com/tr/hizmet-uclari)
