SDK API baru Luno

Dari kode hingga klien

api_id

Banyak pelanggan berinteraksi dengan Luno menggunakan API Luno, karena API kami memberikan akses ke data pasar untuk siapa saja. Para developer menggunakan API Luno kami untuk membangun aplikasi untuk membeli, menjual, mengirim, menerima, melakukan deposit dan penarikan secara otomatis pada mata uang lokal dan mata uang digital.

Jika hal ini masih dapat Anda pahami, lanjutkan membaca.

Dokumentasi API membuat daftar SDK sebagai bahasa pemrograman yang populer. Namun, hanya Go SDK sajalah yang didukung secara resmi.

Mempertahankan SDK dalam bahasa yang berbeda sangatlah sulit dan membutuhkan banyak biaya. Setiap bahasa yang didukung memerlukan pekerjaan duplikasi dalam bahasa yang lain, yang membawa pada bugs dan pemeliharaan terus menerus.

Untuk mengotomatisasi proses ini, kami menganotasi seluruh pemegang API kami di dalam kode Go internal kami dengan Swagger. swagger dapat membaca anotasi dan menghasilkan sebuah spec OpenAPI. Spec yang dihasilkan adalah sebuah file JSON yang mendeskripsikan setiap endpoint yang dianotasi, parameter input dan outputnya.

// swagger:parameters getOrderBook
type getOrderbookRequest struct {
    // in: query
    // required: true
    Pair string `json:"pair"`
}

// swagger:model
type getOrderBookResponse struct {
    Bids []Order `json:"bids"`
    Asks []Order `json:"asks"`
}

// swagger:route GET /api/1/orderbook orders getOrderBook
//
// Get order book
//
// Returns a list of bids and asks in the order book. Ask orders are sorted
// by price ascending. Bid orders are sorted by price descending. Note that
// multiple orders at the same price are not necessarily conflated.
//
// Responses:
// 200: body:getOrderBookResponse description:OK
func GetOrderBook(w http.ResponseWriter, r *http.Request) {
    // ...
}

Contoh endpoint API dengan anotasi swagger
Sebagai contoh, kode sampel di atas menunjukkan endpoint API dengan anotasi Swagger. Ini mengindikasikan bahwa API tersebut memiliki endpoint getOrderBook, yang memerlukan parameter query-string yang disebut pair. Ini juga mengatur agar respon endpoint, jika respon HTTP adalah 200, akan menjadi pesan JSON dengan daftar order ask dan bid.

Untuk menghasilkan spec OpenAPI JSON untuk kode di atas, Anda akan mengatur swagger (go get -u github.com/go-swagger/go-swagger) dan menjalankan swagger generate spec.

"/api/1/orderbook": {
    "get": {
        "description": "Returns a list of bids and asks in the order book. Ask orders are sorted by\nprice ascending. Bid orders are sorted by price descending. Note that\nmultiple orders at the same price are not necessarily conflated.",
        "tags": [
            "market"
        ],
        "summary": "Get order book",
        "operationId": "getOrderBook",
        "parameters": [
            {
                "type": "string",
                "format": "pair",
                "example": "XBTZAR",
                "description": "Currency pair",
                "name": "pair",
                "in": "query",
                "required": true
            }
        ],
        "responses": {
            "200": {
                "description": "OK",
                "schema": {
                    "$ref": "#/definitions/getOrderBookResponse"
                }
            }
        }
    }
}

Excerpt dari spec OpenAPI Luno
Spec JSON yang dihasilkan lalu menyediakan deskripsi language-agnostic API tersebut. Dengan menggunakan ini, kami dapat secara otomatis menghasilkan klien API dalam berbagai bahasa. Hasilnya adalah suatu set API terbaru yang terdokumentasi yang disebut wrappers, masing-masing dengan obyek permintaan dan tanggapan type-safe.

type GetOrderBookRequest struct {
    // Currency pair
    Pair string `json:"pair" url:"pair"`
}

type GetOrderBookResponse struct {
    Asks []OrderBookEntry `json:"asks"`
    Bids []OrderBookEntry `json:"bids"`
    Timestamp int64 `json:"timestamp"`
}

// GetOrderBook makes a call to GET /api/1/orderbook.
//
// Returns a list of bids and asks in the order book. Ask orders are sorted by
// price ascending. Bid orders are sorted by price descending. Note that
// multiple orders at the same price are not necessarily conflated.
func (cl *Client) GetOrderBook(ctx context.Context, req *GetOrderBookRequest) (*GetOrderBookResponse, error) {
    var res GetOrderBookResponse
    err := cl.do(ctx, "GET", "/api/1/orderbook", req, &res, false)
    if err != nil {
        return nil, err
    }
    return &res, nil
}

Kode yang dihasilkan otomatis untuk endpoint getOrderBook
Untuk menghasilkan klien, ada fungsi swagger generate client. Namun kami memutuskan untuk menulis set perlengkapan kami sendiri. Kami ingin agar kode tersebut bisa seringan mungkin, dan dapat menyesuaikan perlakuan struktur data. Kode yang menghasilkan klien inti pada dasarnya melintasi spec JSON dan meminta Go template untuk mengeluarkan fungsi individu.

// {{.Name}} makes a call to {{.Method}} {{.Path}}.
//
{{range .Description -}}
// {{.}}
{{end -}}
func (cl *Client) {{.Name}}(ctx context.Context, req *{{.Request.Name}}) (*{{(index .Responses 0).Name}}, error) {
    // …
}

Excerpt dari template untuk Go client
Kemampuan untuk menghasilkan client SDK secara otomatis berarti kami dapat mengeluarkan pembaruan setiap kali ada perubahan dilakukan. Hal ini mengizinkan kami mengeluarkan peningkatan terhadap API dengan lebih cepat sembari menjaga pembaruan SDK kami.

Sebagai permulaan, kami telah membuat Go SDK tersedia. Rilis alpha untuk PHP dan Python akan segera tersedia.

Apakah bacaan ini menarik untuk Anda? Bantu kami mengembangkannya, bergabunglah dengan tim engineering kami.

Did you find this useful?

0
0