$lang['tuto'] = "பயிற்சிகள்"; ?> ReactJS: Chrome CORS செருகுநிரலைச்

ReactJS: Chrome CORS செருகுநிரலைச் சேர்த்த பிறகு, கையாளப்படாத நிராகரிப்பு (வகைப் பிழை) பெறுவதில் தோல்வி

Temp mail SuperHeros
ReactJS: Chrome CORS செருகுநிரலைச் சேர்த்த பிறகு, கையாளப்படாத நிராகரிப்பு (வகைப் பிழை) பெறுவதில் தோல்வி
ReactJS: Chrome CORS செருகுநிரலைச் சேர்த்த பிறகு, கையாளப்படாத நிராகரிப்பு (வகைப் பிழை) பெறுவதில் தோல்வி

எதிர்வினையில் API பிழைகளைக் கையாளுதல்: CORS செருகுநிரல் சவால்கள்

உள்ள APIகளுடன் பணிபுரியும் போது ரியாக்ட்ஜேஎஸ், டெவலப்பர்கள் பெரும்பாலும் தரவு பெறுதல் தொடர்பான பல்வேறு சவால்களை எதிர்கொள்கின்றனர், குறிப்பாக மூன்றாம் தரப்பு APIகளை கையாளும் போது. எழும் ஒரு பொதுவான சிக்கல் "கண்டிக்கப்படாத நிராகரிப்பு (வகைப் பிழை): பெறுவதில் தோல்வி" பிழை. பல டெவலப்பர்கள் தங்கள் வலைப் பயன்பாடுகளை மேம்படுத்தப் பயன்படுத்தும் Swiggy's உணவகப் பட்டியல் API போன்ற பிரபலமான APIகளைப் பயன்படுத்தும் போதும் இந்தப் பிழை ஏற்படலாம்.

இந்த வழக்கில், CORS Chrome நீட்டிப்பைச் சேர்ப்பது, கட்டுப்படுத்தப்பட்ட உலாவிக் கொள்கைகளைத் தவிர்ப்பதற்கான சாத்தியமான தீர்வாகத் தோன்றலாம். இருப்பினும், இது சிக்கலைத் தீர்ப்பதற்குப் பதிலாக புதிய சிக்கல்களை அறிமுகப்படுத்தலாம். உங்கள் மேம்பாட்டு சூழலில் CORS செருகுநிரலைப் பயன்படுத்தினால், உங்கள் API கோரிக்கைகள் ஏற்றப்பட்ட சிறிது நேரத்திலேயே தோல்வியுற்றால், உலாவியின் கோரிக்கை-கையாளுதல் நடத்தையுடன் சொருகி முரண்படும் சிக்கலை நீங்கள் சந்திக்க நேரிடும்.

கிராஸ்-ஆரிஜின் கோரிக்கைகளை எவ்வாறு நிர்வகிப்பது மற்றும் சரிசெய்தல் ஆகியவற்றைப் புரிந்துகொள்வது CORS பிழைகள் ReactJS ஒரு மென்மையான வளர்ச்சி செயல்முறைக்கு அவசியம். Swiggy போன்ற APIகள், அங்கீகரிக்கப்படாத வாடிக்கையாளர்களிடமிருந்து அணுகலைக் கட்டுப்படுத்த, CORS போன்ற பாதுகாப்பு அடுக்குகளைக் கொண்டிருக்கும். இந்த கட்டுப்பாடுகள் சரியாக கவனிக்கப்பட வேண்டிய பிழைகளுக்கு வழிவகுக்கும்.

இந்த வழிகாட்டியில், இந்த பிழை ஏன் ஏற்படுகிறது என்பதை ஆராய்வோம், குறிப்பாக Chrome இல் CORS செருகுநிரலைச் சேர்த்த பிறகு. உங்களின் Swiggy API உடன் பணிபுரியும் போது அதைத் தீர்ப்பதற்கான உத்திகளையும் நாங்கள் விவாதிப்போம் எதிர்வினையாற்று பயன்பாடுகள்.

கட்டளை பயன்பாட்டின் உதாரணம்
fetch() Swiggy API க்கு HTTP கோரிக்கைகளைச் செய்ய இந்தக் கட்டளை பயன்படுத்தப்படுகிறது. இது ஆதாரங்களை ஒத்திசைவற்ற முறையில் பெறுகிறது மற்றும் ஒரு வாக்குறுதியைத் தருகிறது, இது ஒரு பதில் பொருளுக்குத் தீர்க்கப்படும். API இலிருந்து உணவகத் தரவை மீட்டெடுப்பதற்கு இது முக்கியமானது.
useEffect() ரியாக்டில் பயன்படுத்தப்பட்டது, இந்த ஹூக் கூறுகளை ரெண்டரிங் செய்த பிறகு API அழைப்புகள் போன்ற பக்க விளைவுகளை செயல்படுத்த அனுமதிக்கிறது. கூறு ஏற்றப்பட்டவுடன் Swiggy இன் APIக்கான பெறுதல் கோரிக்கை செய்யப்படுவதை இது உறுதி செய்கிறது.
res.setHeader() இந்த எக்ஸ்பிரஸ் கட்டளை தனிப்பயன் HTTP தலைப்புகளை அமைக்கிறது Access-Control-Allow-Origin, இது CORS கையாளுதலில் முக்கியமானது. CORS பிழைகளைத் தடுக்கும் எந்த மூலத்திலிருந்தும் கோரிக்கைகளை அனுமதிக்க இது பின்தளத்தை செயல்படுத்துகிறது.
res.json() கிளையண்டிற்கு JSON பதிலை அனுப்ப இந்த முறை பயன்படுத்தப்படுகிறது. ப்ராக்ஸி சர்வர் தீர்வில், Swiggy இலிருந்து பெறப்பட்ட API தரவு JSON வடிவமாகத் திரும்புவதை உறுதிசெய்கிறது, இது முன் முனையில் எளிதாகப் பயன்படுத்த முடியும்.
await இந்த திறவுச்சொல், ஒத்திசைவற்ற செயல்பாட்டின் செயல்பாட்டினைப் பெறுதல் செயல்பாடு தீர்க்கப்படும் வரை இடைநிறுத்துகிறது, தொடர்வதற்கு முன், API இன் தரவுக்காக குறியீடு காத்திருப்பதை உறுதிசெய்து, கையாளப்படாத நிராகரிப்புகளைத் தடுக்கிறது.
express() தி எக்ஸ்பிரஸ்() எக்ஸ்பிரஸ் சேவையகத்தின் நிகழ்வை உருவாக்க செயல்பாடு பயன்படுத்தப்படுகிறது. தரவுப் பெறுதலின் போது CORS சிக்கல்களைத் தடுக்க இந்தச் சேவையகம் முன்பக்கம் மற்றும் Swiggy API க்கு இடையே ப்ராக்ஸியாகச் செயல்படுகிறது.
app.listen() இந்த கட்டளை எக்ஸ்பிரஸ் சேவையகத்தை ஒரு குறிப்பிட்ட போர்ட்டில் உள்வரும் கோரிக்கைகளை கேட்க ஆரம்பிக்கிறது (எ.கா., இந்த விஷயத்தில் போர்ட் 5000). வளர்ச்சியின் போது ப்ராக்ஸி சேவையகத்தை உள்நாட்டில் ஹோஸ்ட் செய்வதற்கு இது முக்கியமானது.
try...catch நெட்வொர்க் தோல்விகள் அல்லது Swiggy API இல் உள்ள சிக்கல்கள் போன்ற பெறுதல் கோரிக்கையின் போது ஏற்படக்கூடிய பிழைகளை இந்தத் தொகுதி கையாளும். செயலிழப்பதற்குப் பதிலாக, செயலிழக்கப் பிழைகளைக் கையாளுவதை இது உறுதி செய்கிறது.

Swiggy API உடன் எதிர்வினையில் CORS சிக்கல்களுக்கான தீர்வுகளை விளக்குகிறது

முதல் தீர்வில், நாங்கள் உருவாக்கினோம் Node.js Swiggy இன் API இலிருந்து உணவகத் தரவைப் பெறும்போது CORS சிக்கலைத் தவிர்க்க எக்ஸ்பிரஸைப் பயன்படுத்தி பின்தளம். CORS கொள்கையானது, அந்த டொமைன் அனுமதிக்காத வரையில், உலாவிகள் வேறொரு டொமைனுக்கு கோரிக்கைகளை வைப்பதைத் தடுக்கிறது. ஒரு எளிய சேவையகத்தை உருவாக்குவதன் மூலம், கிளையன்ட் மற்றும் API க்கு இடையில் ஒரு நடுத்தர அடுக்காக செயல்படலாம், தரவு சேவையகத்தின் பக்கத்தைப் பெற்று, அதை ரியாக்ட் ஃப்ரண்ட்-எண்டிற்குத் திருப்பி விடலாம். இந்த முறை CORS பிழைகளைத் தவிர்க்கிறது, ஏனெனில் கோரிக்கையானது கிளையன்ட் பயன்பாட்டின் அதே தோற்றத்தில் இருந்து வருகிறது.

எக்ஸ்பிரஸ் பின்தளமானது தனிப்பயன் தலைப்புகளை அமைக்கிறது, குறிப்பாக Access-Control-Allow-Origin, இது எங்கள் வாடிக்கையாளரை CORS கட்டுப்பாடுகளை எதிர்கொள்ளாமல் ஆதாரங்களைக் கோர அனுமதிக்கிறது. Swiggy இன் APIக்கான அழைப்பு சேவையகத்தின் பக்கமாக மாற்றப்பட்டது, மேலும் தரவு JSON வடிவத்தில் வழங்கப்படும். ஏபிஐ விசைகள் அல்லது முக்கியமான தகவல்களை மறைப்பதால், இந்த அணுகுமுறை உற்பத்திச் சூழல்களில் மிகவும் பாதுகாப்பானதாகவும் செயல்திறன் மிக்கதாகவும் கருதப்படுகிறது. மேலும், டிரை-கேட்ச்சின் பயன்பாடு சரியான பிழை கையாளுதலை உறுதிசெய்கிறது, API பதிலளிக்கத் தவறினால், பயனர் நட்பு பிழைச் செய்திகளைக் காண்பிக்கும்.

இரண்டாவது தீர்வில், கிளையன்ட் பக்க ரியாக்ட் குறியீட்டில் பெறுதல் கோரிக்கையை மாற்றியமைப்போம். இந்த முறையானது, பெறுதல் அழைப்பில் தனிப்பயன் தலைப்புகளைச் சேர்ப்பதை உள்ளடக்குகிறது, API ஐ அடைவதற்கு முன் கோரிக்கை சரியாக வடிவமைக்கப்பட்டுள்ளதா என்பதை உறுதிப்படுத்துகிறது. நாங்கள் எதிர்வினைகளைப் பயன்படுத்துகிறோம் பயன்பாட்டு விளைவு கூறு ஏற்றும்போது API அழைப்பைத் தூண்டுவதற்கு ஹூக். ஒத்திசைவு செயல்பாடு API பதிலுக்காகக் காத்திருக்கிறது, அதை JSON ஆக மாற்றுகிறது மற்றும் கோரிக்கை தோல்வியுற்றால் பிழைகளைக் கையாளுகிறது. இருப்பினும், உலாவிகளில் இருந்து நேரடியாக கிராஸ்-ஆரிஜின் கோரிக்கைகளை API அனுமதிக்கவில்லை என்றால், இந்தத் தீர்வு இன்னும் CORS சிக்கல்களை எதிர்கொள்கிறது.

இறுதியாக, மூன்றாவது தீர்வில், CORS-Anywhere எனப்படும் மூன்றாம் தரப்பு சேவையைப் பயன்படுத்துகிறோம். இது ஒரு மிடில்வேர் சேவையாகும், இது அவர்களின் சேவையகத்தின் மூலம் API கோரிக்கையை மாற்றியமைப்பதன் மூலம் தற்காலிகமாக CORS கட்டுப்பாடுகளைத் தவிர்க்க உதவுகிறது. இந்த தீர்வு வளர்ச்சி சூழல்களில் வேலை செய்ய முடியும் என்றாலும், பாதுகாப்பு அபாயங்கள் மற்றும் வெளிப்புற சேவைகளை சார்ந்திருப்பதன் காரணமாக இது உற்பத்திக்கு பரிந்துரைக்கப்படவில்லை. தரவுப் பெறுதல் செயல்முறைக்கு கூடுதல் லேயரைச் சேர்ப்பதால் இது செயல்திறன் மேல்நிலையையும் அறிமுகப்படுத்துகிறது. சோதனைக் கட்டங்களில் இந்த முறையைப் பயன்படுத்துவது வசதியாக இருக்கும், ஆனால் பாதுகாப்பு காரணங்களுக்காக உற்பத்தியைத் தவிர்க்க வேண்டும்.

தீர்வு 1: ப்ராக்ஸி சேவையகத்துடன் CORS சிக்கல்களைக் கையாளுதல்

CORS பிழைகளைத் தவிர்க்கவும், Swiggy API இலிருந்து தரவைச் சரியாகப் பெறவும் இந்த தீர்வு Node.js பின்தள ப்ராக்ஸி சேவையகத்தைப் பயன்படுத்துகிறது.

const express = require('express');
const fetch = require('node-fetch');
const app = express();
const port = 5000;

app.use((req, res, next) => {
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Methods', 'GET');
  next();
});

app.get('/restaurants', async (req, res) => {
  try {
    const response = await fetch('https://www.swiggy.com/dapi/restaurants/list/v5?lat=23.1685786&lng=79.9338798');
    const data = await response.json();
    res.json(data);
  } catch (err) {
    res.status(500).json({ error: 'Failed to fetch restaurants' });
  }
});

app.listen(port, () => {
  console.log(`Server running on http://localhost:${port}`);
});

தீர்வு 2: தனிப்பயன் தலைப்புகள் மற்றும் பிழை கையாளுதலுடன் முன்-இறுதி பெறுதலைப் பயன்படுத்துதல்

இந்த அணுகுமுறை பெறுதல் கோரிக்கையை ரியாக்டில் நேரடியாக மாற்றியமைக்கிறது, தனிப்பயன் தலைப்புகளைச் சேர்த்து பிழைகளைத் திறம்படக் கையாளுகிறது.

import React, { useEffect } from 'react';

const Body = () => {
  async function getRestaurants() {
    try {
      const response = await fetch(
        'https://www.swiggy.com/dapi/restaurants/list/v5?lat=23.1685786&lng=79.9338798',
        { headers: { 'Content-Type': 'application/json' } }
      );

      if (!response.ok) {
        throw new Error('Network response was not ok');
      }

      const data = await response.json();
      console.log(data);
    } catch (error) {
      console.error('Fetch error:', error);
    }
  }

  useEffect(() => {
    getRestaurants();
  }, []);
};

export default Body;

தீர்வு 3: மேம்பாட்டிற்காக CORS-எனிவேர் மிடில்வேரைப் பயன்படுத்துதல்

இந்த முறையானது "CORS-Anywhere" சேவையைப் பயன்படுத்தி CORS கட்டுப்பாடுகளைத் தவிர்த்து, வளர்ச்சிப் பயன்முறையில் இருக்கும். இந்த தீர்வு உற்பத்தியில் பயன்படுத்தப்படக்கூடாது.

const Body = () => {
  async function getRestaurants() {
    try {
      const response = await fetch(
        'https://cors-anywhere.herokuapp.com/https://www.swiggy.com/dapi/restaurants/list/v5?lat=23.1685786&lng=79.9338798'
      );

      const data = await response.json();
      console.log(data);
    } catch (error) {
      console.error('Error fetching restaurants:', error);
    }
  }

  useEffect(() => {
    getRestaurants();
  }, []);
};

export default Body;

API கோரிக்கைகளில் உள்ள CORS சிக்கல்களைச் சரிசெய்தல்

ரியாக்ட் பயன்பாட்டில், குறிப்பாக ஸ்விக்கி போன்ற மூன்றாம் தரப்பு APIகளைப் பயன்படுத்தும் போது, ​​"பெறுவதில் தோல்வி" என்ற பிழைக்கான அடிப்படைக் காரணங்களில் ஒன்று CORS (கிராஸ்-ஆரிஜின் ரிசோர்ஸ் ஷேரிங்) கட்டுப்பாடுகள். CORS என்பது ஒரு பாதுகாப்பு அம்சமாகும், இது வலை பயன்பாடுகள் அவை வழங்கப்பட்ட டொமைனை விட வேறு டொமைனுக்கு கோரிக்கைகளை வைப்பதைக் கட்டுப்படுத்துகிறது. இந்த வழக்கில், Swiggy API கோரிக்கையை நிராகரிக்கிறது, ஏனெனில் இது வேறொரு டொமைனில் இருந்து (உங்கள் ரியாக்ட் ஆப்ஸ்) உருவானது. கிராஸ்-ஆரிஜின் கோரிக்கைகளை வெளிப்படையாக ஆதரிக்காத API களில் இருந்து தரவைப் பெறும்போது இது மிகவும் சிக்கலானது.

"அனுமதி CORS" Chrome நீட்டிப்பு போன்ற உலாவி நீட்டிப்புகளைப் பயன்படுத்துவது ஒரு பொதுவான தீர்வு. இருப்பினும், இத்தகைய நீட்டிப்புகள் சீரற்ற முடிவுகளுக்கு வழிவகுக்கும். ஏபிஐ கோரிக்கைகளுடன் எப்போதும் சரியாக ஒத்திசைக்காத உலாவி-நிலை அமைப்புகளை அவை கையாளுவதே இதற்குக் காரணம். இந்த செருகுநிரல்கள் மேம்பாட்டிற்காக மட்டுமே பயன்படுத்தப்பட வேண்டும், உற்பத்தி சூழல்களில் அல்ல. தயாரிப்பிற்கு, பாதுகாப்பான மற்றும் நம்பகமான அணுகுமுறையானது, முன்பு வழங்கப்பட்ட தீர்வுகளில் காணப்படுவது போல், உங்கள் ரியாக்ட் பயன்பாட்டின் சார்பாக தரவைக் கோரும் பின்தள ப்ராக்ஸி சேவையகத்தைப் பயன்படுத்துவதாகும்.

கருத்தில் கொள்ள வேண்டிய மற்றொரு அம்சம் பிழைகளை திறம்பட கையாள்வது. CORS சிக்கல்கள் "பெறுவதில் தோல்வி" பிழைகளுக்கு ஒரு பொதுவான காரணமாக இருந்தாலும், நெட்வொர்க் உறுதியற்ற தன்மை, தவறான API URLகள் அல்லது சேவையக செயலிழப்பு போன்ற பிற காரணிகளும் இந்த பிழையை ஏற்படுத்தலாம். எனவே, செயல்படுத்துவது முக்கியம் வலுவான பிழை கையாளுதல் உங்கள் குறியீட்டில், குறிப்பாக மூன்றாம் தரப்பு APIகளுடன் பணிபுரியும் போது. சரியான பிழை கையாளும் பொறிமுறையானது சிக்கலை மிகவும் திறம்பட பிழைத்திருத்த உதவும் மற்றும் ஏதேனும் தவறு நடந்தால் பயனர் நட்பு செய்திகளை வழங்கும்.

எதிர்வினையில் CORS மற்றும் API கோரிக்கைகள் பற்றிய பொதுவான கேள்விகள்

  1. CORS என்றால் என்ன, அது ஏன் முக்கியமானது?
  2. CORS (Cross-Origin Resource Sharing) என்பது நம்பத்தகாத டொமைன்களில் இருந்து வரும் தீங்கிழைக்கும் கோரிக்கைகளைத் தடுக்க உலாவிகளால் செயல்படுத்தப்படும் பாதுகாப்புக் கொள்கையாகும். சேவையகத்திலிருந்து ஆதாரங்களைப் பெற குறிப்பிட்ட டொமைன்கள் மட்டுமே அனுமதிக்கப்படுவதை இது உறுதி செய்கிறது.
  3. நான் ஏன் "கண்டிக்கப்படாத நிராகரிப்பு (வகைப் பிழை): பெறத் தவறியது"?
  4. CORS கட்டுப்பாடுகள் காரணமாக உங்கள் API கோரிக்கை தடுக்கப்படும் போது இந்தப் பிழை பொதுவாக ஏற்படும். இது தவறான API URLகள் அல்லது சர்வரில் உள்ள சிக்கல்களாலும் ஏற்படலாம்.
  5. என்ன செய்கிறது useEffect இந்த சூழலில் என்ன செய்வது?
  6. தி useEffect கூறு ஏற்றப்பட்ட பிறகு API கோரிக்கையைத் தூண்டுவதற்கு ஹூக் இன் ரியாக்ட் பயன்படுத்தப்படுகிறது. பல தேவையற்ற கோரிக்கைகளைத் தடுக்கும் வகையில், சரியான நேரத்தில் பெறுதல் செயல்பாடு நடைபெறுவதை இது உறுதி செய்கிறது.
  7. எதிர்வினை பயன்பாட்டில் உள்ள CORS பிழைகளை எவ்வாறு சரிசெய்வது?
  8. CORS பிழைகளை சரிசெய்ய, நீங்கள் ஒரு பின்தள ப்ராக்ஸியைப் பயன்படுத்தலாம், சரியான தலைப்புகளை அமைக்கலாம் res.setHeader சேவையகத்தில், அல்லது வளர்ச்சி நோக்கங்களுக்காக CORS-Anywhere போன்ற சேவைகளை நம்புங்கள்.
  9. தயாரிப்பில் CORS உலாவி நீட்டிப்புகளைப் பயன்படுத்தலாமா?
  10. இல்லை, CORS உலாவி நீட்டிப்புகள் மேம்பாட்டிற்கு மட்டுமே பயன்படுத்தப்பட வேண்டும். தயாரிப்பில், சேவையகத்தில் CORS ஐ உள்ளமைப்பது அல்லது ப்ராக்ஸி சேவையகத்தைப் பயன்படுத்துவது பாதுகாப்பானது.

எதிர்வினையில் CORS பிழைகளை நிர்வகிப்பதற்கான இறுதி எண்ணங்கள்

மூன்றாம் தரப்பு APIகளைப் பயன்படுத்தும் ரியாக்ட் பயன்பாடுகளை உருவாக்கும் போது CORS பிழைகள் ஒரு பொதுவான சவாலாகும். உலாவி நீட்டிப்புகள் வளர்ச்சிக்கு உதவக்கூடும் என்றாலும், பாதுகாப்பு மற்றும் தரவு ஒருமைப்பாட்டை பராமரிக்க உற்பத்தி சூழல்களில் ப்ராக்ஸி சர்வர் போன்ற நம்பகமான தீர்வுகளை செயல்படுத்துவது மிகவும் முக்கியமானது.

பிழை கையாளுதல் மற்றும் பின்தளத்தில் தீர்வுகள் போன்ற சரியான நுட்பங்களைப் பயன்படுத்துவதன் மூலம், டெவலப்பர்கள் "பெறுவதில் தோல்வி" போன்ற சிக்கல்களை திறமையாக கையாள முடியும். APIகளுடன் தொடர்புகொள்ளும் போது, ​​செயல்திறன் மற்றும் செயல்பாட்டை மேம்படுத்தும் போது, ​​அவர்களின் பயன்பாடு மென்மையான பயனர் அனுபவத்தை வழங்குவதை இது உறுதி செய்கிறது.

எதிர்வினையில் CORS சிக்கல்களைப் புரிந்துகொள்வதற்கான குறிப்புகள் மற்றும் மூலப் பொருட்கள்
  1. கிராஸ்-ஆரிஜின் ரிசோர்ஸ் ஷேரிங் (CORS) மற்றும் அதை ரியாக்டில் எப்படி நிர்வகிப்பது என்பது பற்றிய விரிவான தகவலுக்கு, பார்க்கவும் CORS இல் MDN வெப் டாக்ஸ் .
  2. "பெறுவதில் தோல்வி" போன்ற பொதுவான எதிர்வினை பிழைகள் மற்றும் சாத்தியமான தீர்வுகள் பற்றி மேலும் அறிய, சரிபார்க்கவும் பிழை எல்லைகள் மீதான எதிர்வினை ஆவணம் .
  3. CORS சிக்கல்களைத் தவிர்க்க, ப்ராக்ஸி சேவையகத்தை அமைப்பதற்கு, Express உடன் பணிபுரிந்தால், பார்வையிடவும் Express.js ரூட்டிங் மற்றும் மிடில்வேர் .
  4. JavaScript இல் Fetch API உடன் எவ்வாறு வேலை செய்வது என்பது பற்றிய உதவிக்கு, பார்க்கவும் Fetch API இல் MDN Web Docs .
  5. உத்தியோகபூர்வ API ஆவணத்தில் உணவகத் தரவுகளுக்கு Swiggy இன் API ஐ எவ்வாறு பயன்படுத்துவது என்பதை ஆராயவும்: Swiggy API .