# Külső szolgáltatások hívása az API()-val és a NEWAPI() driverekkel

> Regisztráljon drivert egy szolgáltatáshoz a NEWAPI()-val, és hívja meg a műveletekből az API(name, schema, data)-val, a query builderrel azonos callback-, hiba- és promise-stílusban.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: hu
Content-SHA256: 9f41f1fd86acda57faf58d16cf68ed0d116c15821b654412e7ebf5b52ac38cfa
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

Az `API(name, schema, data, [$])` egy külső szolgáltatás egy műveletét hívja meg, a `NEWAPI()` pedig azt a **drivert** regisztrálja, amely a hívást végrehajtja, így a műveletei kódja nem függ attól, hogyan érik el a szolgáltatást (HTTP, egy könyvtár, egy sor...).

- A `NEWAPI('name', driver)` a `name` szolgáltatás driverét regisztrálja (az `'a,b'` egy drivert regisztrál két névhez, a `NEWAPI(driver)` pedig az alapértelmezettet, a `default`-ot). A `NEWAPI('name', config, driver)` egy `config` objektumot is eltárol, amelyet minden hívás `options.config` néven kap meg.
- A driver egy `function(options, next)`. Az `options.name` a szolgáltatás, az `options.schema` a művelet, az `options.data` az adat, az `options.config` pedig a konfiguráció. Válaszoljon a `next(error, response)` hívással.
- Az `API('name', 'operation', data)` egy buildert ad vissza: fejezze be a `.callback($)` (a válasz a `$` műveletnek megy), a `.callback(function(err, response) {})` vagy az `await ....promise($)` hívással. A `.configure({ key: value })` az adott híváshoz hozzáad az `options.config`-hoz, a `.error('text')` pedig azt éri el, hogy egy üres válasz ezzel az üzenettel hibásodjon meg.
- Ha a névhez nincs driver regisztrálva, a hívás `API is not initialized` hibával végződik.

```js definitions/api.js
// The driver of a fake weather service: in a real one this would be an HTTP request
NEWAPI('weather', { unit: 'C' }, function(options, next) {
	if (options.schema === 'forecast')
		next(null, { city: options.data.city, temperature: 21, unit: options.config.unit, service: options.name });
	else
		next('Unknown operation ' + options.schema);
});
```

```js controllers/weather.js
exports.install = function() {
	ROUTE('GET /forecast/', forecast);
	ROUTE('GET /forecast-fahrenheit/', fahrenheit);
	ROUTE('GET /unknown/', unknown);
	ROUTE('GET /missing/', missing);
	ROUTE('GET /promise/', promise);
};

function forecast($) {
	API('weather', 'forecast', { city: $.query.city }).callback($);
}

function fahrenheit($) {
	API('weather', 'forecast', { city: $.query.city }).configure({ unit: 'F' }).callback($);
}

function unknown($) {
	API('weather', 'rain', {}).callback($);
}

function missing($) {
	API('nobody', 'forecast', {}).callback($);
}

async function promise($) {
	const data = await API('weather', 'forecast', { city: 'Oslo' }).promise($);
	$.json({ city: data.city, same: true });
}

```
