# Recherche

> Recherche plein texte dans toute la base, par pertinence, tous types et toutes versions.

Documentation de l’API de WoWDB des Défias : https://docs.wowdb.assemblee-defias.fr/search

## Recherche

Une seule requête pour chercher dans toute la base : noms et infobulles, tous types et toutes versions, ou ceux que vous choisissez. Pour filtrer finement un seul type, préférez sa liste et son paramètre `q`.

**Routes**

- `GET /v1/search` : Rechercher

## Pertinence

1. Le nom exact (avec ou sans article : « aldor » trouve « L’Aldor »).
2. Les noms qui commencent par le texte cherché.
3. Le score du texte, où le nom pèse dix fois plus que l’infobulle.
4. Le nom, par ordre alphabétique.

Chaque mot doit commencer un mot de la fiche ; les mots vides (« de », « la ») sont ignorés quand d’autres mots suffisent. Une recherche d’une ou deux lettres ne porte que sur les noms. Un numéro (`q=5191`) trouve la fiche de ce numéro dans chaque type et chaque version.

## Rechercher

`GET /v1/search`

Recherche plein texte dans toute la base : noms et infobulles, toutes versions et tous types confondus (sauf filtres). Résultats par pertinence : nom exact d’abord, puis début du nom, puis score du texte. Un numéro du jeu trouve la fiche de ce numéro dans chaque type et chaque version. Chaque résultat est l’objet résumé de son type (champ object).

**Paramètres**

- `q` (chaîne, obligatoire) : Texte à chercher : nom, mot de l’infobulle, ou numéro du jeu. Obligatoire, 120 caractères au plus.
- `version` (codes séparés par des virgules, facultatif) : Versions où chercher, séparées par des virgules (toutes par défaut). Valeurs : `classic`, `tbc`, `wotlk`.
- `type` (codes séparés par des virgules, facultatif) : Types de fiches, séparés par des virgules : item, spell, quest, npc, game_object, item_set, faction (tous par défaut). Valeurs : `item`, `spell`, `quest`, `npc`, `game_object`, `item_set`, `faction`.
- `rogue` (booléen, facultatif) : true : seulement les objets, quêtes et objets du monde utiles au voleur ; false : seulement les autres. Absent : tout (par défaut).
- `limit` (entier, facultatif) : Nombre d’éléments par page, de 1 à 100 (20 par défaut).
- `cursor` (chaîne, facultatif) : Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres.
- `include_total` (booléen, facultatif) : true : ajoute total_count, le nombre total d’éléments avec ces filtres.

**Renvoie** : Une liste (`object: "list"`) de résumés de fiches de tous types (champ `object` : `item`, `npc`…), par pertinence, paginée par curseur.

**Requête (GET /v1/search)**

#### cURL

```bash
curl -G https://api.wowdb.assemblee-defias.fr/v1/search \
  --data-urlencode "q=cape de la confrérie" \
  -d type=item \
  -d version=classic \
  -d limit=1
```

#### JavaScript

```js
const params = new URLSearchParams({
  q: "cape de la confrérie",
  type: "item",
  version: "classic",
  limit: "1",
});
const res = await fetch(`https://api.wowdb.assemblee-defias.fr/v1/search?${params}`);
if (!res.ok) throw new Error((await res.json()).error.message);
const page = await res.json();
for (const result of page.data) {
  console.log(result.name);
}
```

#### Python

```python
import json
import urllib.parse
import urllib.request

params = urllib.parse.urlencode({
    "q": "cape de la confrérie",
    "type": "item",
    "version": "classic",
    "limit": "1",
})
req = urllib.request.Request(
    f"https://api.wowdb.assemblee-defias.fr/v1/search?{params}",
    headers={"User-Agent": "mon-application/1.0 (contact@example.com)"},
)
with urllib.request.urlopen(req) as res:
    page = json.load(res)
for result in page["data"]:
    print(result["name"])
```

#### PHP

```php
<?php
$params = http_build_query([
    'q' => 'cape de la confrérie',
    'type' => 'item',
    'version' => 'classic',
    'limit' => '1',
]);
$context = stream_context_create([
    'http' => ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"],
]);
$json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/search?' . $params, false, $context);
$page = json_decode($json, true);
foreach ($page['data'] as $result) {
    echo $result['name'], PHP_EOL;
}
```

#### Ruby

```ruby
require "json"
require "net/http"

uri = URI("https://api.wowdb.assemblee-defias.fr/v1/search")
uri.query = URI.encode_www_form(
  q: "cape de la confrérie",
  type: "item",
  version: "classic",
  limit: "1",
)
res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" })
page = JSON.parse(res.body)
page["data"].each do |result|
  puts result["name"]
end
```

#### Go

```go
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"net/url"
)

func main() {
	params := url.Values{}
	params.Set("q", "cape de la confrérie")
	params.Set("type", "item")
	params.Set("version", "classic")
	params.Set("limit", "1")
	req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/search?"+params.Encode(), nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)")
	res, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	var page struct {
		Data    []map[string]any `json:"data"`
		HasMore bool             `json:"has_more"`
	}
	if err := json.NewDecoder(res.Body).Decode(&page); err != nil {
		panic(err)
	}
	for _, result := range page.Data {
		fmt.Println(result["name"])
	}
}
```

#### Java

```java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Exemple {
    public static void main(String[] args) throws Exception {
        HttpRequest request = HttpRequest.newBuilder(URI.create(
                "https://api.wowdb.assemblee-defias.fr/v1/search?q=cape%20de%20la%20confr%C3%A9rie&type=item&version=classic&limit=1"))
            .header("User-Agent", "mon-application/1.0 (contact@example.com)")
            .build();
        HttpResponse<String> response = HttpClient.newHttpClient()
            .send(request, HttpResponse.BodyHandlers.ofString());
        // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance)
        System.out.println(response.body());
    }
}
```

#### .NET

```csharp
using System.Net.Http;
using System.Text.Json;

using var http = new HttpClient();
http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)");
var json = await http.GetStringAsync(
    "https://api.wowdb.assemblee-defias.fr/v1/search?q=cape%20de%20la%20confr%C3%A9rie&type=item&version=classic&limit=1");
using var doc = JsonDocument.Parse(json);
foreach (var result in doc.RootElement.GetProperty("data").EnumerateArray())
    Console.WriteLine(result.GetProperty("name").GetString());
```

#### Rust

```rust
// Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1"
fn main() -> Result<(), Box<dyn std::error::Error>> {
    let page: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/search")
        .set("User-Agent", "mon-application/1.0 (contact@example.com)")
        .query("q", "cape de la confrérie")
        .query("type", "item")
        .query("version", "classic")
        .query("limit", "1")
        .call()?
        .into_json()?;
    for result in page["data"].as_array().into_iter().flatten() {
        println!("{}", result["name"].as_str().unwrap_or_default());
    }
    Ok(())
}
```

**Réponse** (statut 200)

```json
{
  "object": "list",
  "data": [
    {
      "object": "item",
      "id": 5193,
      "key": "classic:item:5193",
      "version": "classic",
      "name": "Cape de la confrérie",
      "quality": "rare",
      "quality_name": "Rare",
      "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_cape_08.jpg",
      "item_level": 25,
      "required_level": 20,
      "slot": "back",
      "slot_name": "Dos",
      "type": "cloth",
      "type_name": "Tissu",
      "weapon": null,
      "sell_price": 940,
      "rogue": true,
      "internal": false,
      "tooltip": [
        "Cape de la confrérie",
        "Niveau d'objet 25",
        "Lié quand ramassé",
        "Dos",
        "Tissu",
        "Armure : 21",
        "+6 Agilité",
        "+3 Endurance",
        "Niveau 20 requis"
      ],
      "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:5193",
      "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/5193"
    }
  ],
  "has_more": false,
  "next_cursor": null,
  "url": "https://api.wowdb.assemblee-defias.fr/v1/search?q=cape%20de%20la%20confr%C3%A9rie&type=item&version=classic"
}
```

---

API de WoWDB des Défias, v1 (2026-10-01). Adresse de base : https://api.wowdb.assemblee-defias.fr/v1. Index : https://docs.wowdb.assemblee-defias.fr/llms.txt.
