WikiRest Docs

Go Examples

Code examples for integrating WikiRest with Go applications.

Installation

No additional packages required - using the standard library:

// Uses only standard library packages
import (
    "encoding/json"
    "fmt"
    "io"
    "net/http"
    "net/url"
)

API Client

Basic client structure

package wikirest

import (
    "context"
    "encoding/json"
    "fmt"
    "io"
    "net/http"
    "net/url"
    "time"
)

type Client struct {
    APIKey     string
    BaseURL    string
    HTTPClient *http.Client
}

func NewClient(apiKey string) *Client {
    return &Client{
        APIKey:  apiKey,
        BaseURL: "https://api.wikirest.com/v1",
        HTTPClient: &http.Client{
            Timeout: 30 * time.Second,
        },
    }
}

func (c *Client) doRequest(ctx context.Context, method, path string, query url.Values) ([]byte, error) {
    reqURL := c.BaseURL + path
    if query != nil {
        reqURL += "?" + query.Encode()
    }

    req, err := http.NewRequestWithContext(ctx, method, reqURL, nil)
    if err != nil {
        return nil, err
    }

    req.Header.Set("X-API-Key", c.APIKey)
    req.Header.Set("Accept", "application/json")

    resp, err := c.HTTPClient.Do(req)
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()

    body, err := io.ReadAll(resp.Body)
    if err != nil {
        return nil, err
    }

    if resp.StatusCode >= 400 {
        return nil, fmt.Errorf("API error: %s", string(body))
    }

    return body, nil
}

Search Wikipedia

type SearchResult struct {
    ID         string `json:"id"`
    PageID     int    `json:"page_id"`
    Title      string `json:"title"`
    Section    string `json:"section,omitempty"`
    Text       string `json:"text"`
    ChunkIndex int    `json:"chunk_index"`
    URL        string `json:"url"`
}

type SearchResponse struct {
    Hits               []SearchResult `json:"hits"`
    Query              string         `json:"query"`
    ProcessingTimeMs   int            `json:"processingTimeMs"`
    EstimatedTotalHits int            `json:"estimatedTotalHits"`
}

func (c *Client) Search(ctx context.Context, query string, limit int) (*SearchResponse, error) {
    params := url.Values{}
    params.Set("q", query)
    params.Set("limit", fmt.Sprintf("%d", limit))

    body, err := c.doRequest(ctx, "GET", "/search", params)
    if err != nil {
        return nil, err
    }

    var result SearchResponse
    if err := json.Unmarshal(body, &result); err != nil {
        return nil, err
    }

    return &result, nil
}

// Usage
func main() {
    client := NewClient("your_api_key")
    ctx := context.Background()

    results, err := client.Search(ctx, "quantum computing", 5)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("Found %d results\n", results.EstimatedTotalHits)
    for _, hit := range results.Hits {
        fmt.Printf("- %s: %s\n", hit.Title, hit.Text[:100])
    }
}

Get Chunk

Retrieve a single chunk

type Chunk struct {
    ID         string `json:"id"`
    PageID     int    `json:"page_id"`
    Title      string `json:"title"`
    Section    string `json:"section,omitempty"`
    Text       string `json:"text"`
    ChunkIndex int    `json:"chunk_index"`
    URL        string `json:"url"`
    WordCount  int    `json:"word_count,omitempty"`
    Modified   string `json:"modified,omitempty"`
}

func (c *Client) GetChunk(ctx context.Context, id string) (*Chunk, error) {
    body, err := c.doRequest(ctx, "GET", "/chunk/"+id, nil)
    if err != nil {
        return nil, err
    }

    var chunk Chunk
    if err := json.Unmarshal(body, &chunk); err != nil {
        return nil, err
    }

    return &chunk, nil
}

// Usage
chunk, err := client.GetChunk(ctx, "12345_3")
if err != nil {
    log.Fatal(err)
}
fmt.Printf("Chunk from %s: %s\n", chunk.Title, chunk.Text)

Get Page

Retrieve full page content

type PageChunk struct {
    ID         string `json:"id"`
    Section    string `json:"section,omitempty"`
    Text       string `json:"text"`
    ChunkIndex int    `json:"chunk_index"`
}

type Page struct {
    PageID      int         `json:"page_id"`
    Title       string      `json:"title"`
    URL         string      `json:"url"`
    Extract     string      `json:"extract,omitempty"`
    Modified    string      `json:"modified"`
    Chunks      []PageChunk `json:"chunks"`
    TotalChunks int         `json:"total_chunks"`
}

func (c *Client) GetPage(ctx context.Context, pageID int) (*Page, error) {
    body, err := c.doRequest(ctx, "GET", fmt.Sprintf("/page/%d", pageID), nil)
    if err != nil {
        return nil, err
    }

    var page Page
    if err := json.Unmarshal(body, &page); err != nil {
        return nil, err
    }

    return &page, nil
}

// Usage
page, err := client.GetPage(ctx, 12345)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("Page: %s (%d chunks)\n", page.Title, page.TotalChunks)
for _, chunk := range page.Chunks {
    fmt.Printf("  [%s] %s...\n", chunk.Section, chunk.Text[:50])
}

Concurrent Requests

Batch search with goroutines

func (c *Client) BatchSearch(ctx context.Context, queries []string, limit int) ([]*SearchResponse, error) {
    results := make([]*SearchResponse, len(queries))
    errors := make([]error, len(queries))
    var wg sync.WaitGroup

    // Use semaphore to limit concurrency
    sem := make(chan struct{}, 5) // Max 5 concurrent requests

    for i, query := range queries {
        wg.Add(1)
        go func(i int, q string) {
            defer wg.Done()
            sem <- struct{}{}        // Acquire
            defer func() { <-sem }() // Release

            result, err := c.Search(ctx, q, limit)
            results[i] = result
            errors[i] = err
        }(i, query)
    }

    wg.Wait()

    // Check for errors
    for _, err := range errors {
        if err != nil {
            return nil, err
        }
    }

    return results, nil
}

// Usage
queries := []string{"quantum computing", "machine learning", "blockchain"}
results, err := client.BatchSearch(ctx, queries, 3)
if err != nil {
    log.Fatal(err)
}

for i, result := range results {
    fmt.Printf("Query '%s': %d results\n", queries[i], result.EstimatedTotalHits)
}

HTTP Server Integration

Using WikiRest in an HTTP handler

package main

import (
    "encoding/json"
    "log"
    "net/http"
    "os"
)

var wikiClient *Client

func init() {
    wikiClient = NewClient(os.Getenv("WIKIREST_API_KEY"))
}

func searchHandler(w http.ResponseWriter, r *http.Request) {
    query := r.URL.Query().Get("q")
    if query == "" {
        http.Error(w, "query parameter 'q' is required", http.StatusBadRequest)
        return
    }

    results, err := wikiClient.Search(r.Context(), query, 10)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(results)
}

func main() {
    http.HandleFunc("/search", searchHandler)
    log.Println("Server starting on :8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

Next steps

Was this page helpful?

Help us improve our documentation