This post explains how to make the callout in Lightning Web Components(lwc)
We can make the callout from Lightning Web Component in two ways
1. Client-side controller(JS controller)
2. Using the server-side controller(Apex Class)
In this demo, I am using https://www.alphavantage.co/
alpha vantage provides the following services for free
- Realtime and historical stock data
- FX(Foreign exchange) and cryptocurrency feeds
- 50+ technical indicators
- Global coverage
Endpoint URL : https://www.alphavantage.co
In this demo, I am making the callout to check the foreign currency exchange rates.
Example endpoint URL:
https://www.alphavantage.co/query?function=CURRENCY_EXCHANGE_RATE&from_currency=USD&to_currency=INR&apikey=<API_KEY>
{
\"Realtime Currency Exchange Rate\": {
\"1. From_Currency Code\": \"USD\",
\"2. From_Currency Name\": \"United States Dollar\",
\"3. To_Currency Code\": \"INR\",
\"4. To_Currency Name\": \"Indian Rupee\",
\"5. Exchange Rate\": \"70.87700000\",
\"6. Last Refreshed\": \"2019-08-09 14:01:57\",
\"7. Time Zone\": \"UTC\",
\"8. Bid Price\": \"70.86700000\",
\"9. Ask Price\": \"70.88700000\"
}
}
Once you white-listed the endpoint URL now we are ready to create the component.
Approach 1: Client-Side Controller
<template>
<lightning-card title=\"Realtime Currency Exchange Rate\" icon-name=\"standard:currency\">
<lightning-layout multiple-rows=\"true\" vertical-align=\"end\">
<lightning-layout-item size=\"12\" small-device-size=\"4\" medium-device-size=\"2\" large-device-size=\"2\" padding=\"around-small\">
<div class=\"slds-form-element\">
<div class=\"slds-form-element__control\">
<lightning-combobox title=\"Select Currency\"
label=\"From Base Currency\"
value={fromCurrencyValue}
placeholder=\"-Select-\"
options={options}
onchange={handleFromCurrencyChange}></lightning-combobox>
</div>
</div>
</lightning-layout-item>
<lightning-layout-item size=\"12\" small-device-size=\"4\" medium-device-size=\"2\" large-device-size=\"2\" padding=\"around-small\">
<div class=\"slds-form-element\">
<div class=\"slds-form-element__control\">
<lightning-combobox title=\"Select Currency\"
label=\"To Currency\"
value={toCurrencyValue}
placeholder=\"-Select-\"
options={toCurrencyOptions}
onchange={handleToCurrencyChange}></lightning-combobox>
</div>
</div>
</lightning-layout-item>
<lightning-layout-item size=\"12\" small-device-size=\"2\" medium-device-size=\"2\" large-device-size=\"2\" padding=\"around-small\">
<lightning-button title=\"Currency Conversion\"
label=\"Conversion Rate\"
variant=\"brand\"
onclick={handleCurrencyConversion}></lightning-button>
</lightning-layout-item>
</lightning-layout><br/>
<template if:true={conversionData}>
<div class=\"slds-p-around_medium\" id=\"modal-content-id-1\">
<div style=\"font-size: 20px\"><h1>Exchange rate from Currency <b>{fromCurrencyValue}</b> to <b>{toCurrencyValue}</b> </h1></div><br/>
<dl class=\"slds-list_horizontal slds-wrap\">
<dt class=\"slds-item_label slds-truncate\" title=\"From Currency Name\">From Currency Name</dt>
<dd class=\"slds-item_detail slds-truncate\"><b>: {conversionData.From_Currency_Name}</b></dd>
<dt class=\"slds-item_label slds-truncate\" title=\"From Currency Code\">From Currency Code</dt>
<dd class=\"slds-item_detail slds-truncate\"><b>: {conversionData.From_Currency_Code}</b></dd>
<dt class=\"slds-item_label slds-truncate\" title=\"To Currency Name\">To Currency Name</dt>
<dd class=\"slds-item_detail slds-truncate\"><b>: {conversionData.To_Currency_Name}</b></dd>
<dt class=\"slds-item_label slds-truncate\" title=\"To Currency Code\">To Currency Code</dt>
<dd class=\"slds-item_detail slds-truncate\"><b>: {conversionData.To_Currency_Code}</b></dd>
<dt class=\"slds-item_label slds-truncate\" title=\"Exchange Rate\">Exchange Rate</dt>
<dd class=\"slds-item_detail slds-truncate\">: <b style=\"color:red;\">{conversionData.Exchange_Rate}</b></dd>
<dt class=\"slds-item_label slds-truncate\" title=\"Last Refershed\">Last Refereshed</dt>
<dd class=\"slds-item_detail slds-truncate\"><b>: {conversionData.Last_Refershed}</b></dd>
</dl>
</div>
</template>
</lightning-card>
</template> import { LightningElement, track} from \'lwc\';
// Currency options
const options = [
{ label: \'USD\', value: \'USD\' },
{ label: \'EUR\', value: \'EUR\' },
{ label: \'CAD\', value: \'CAD\' },
{ label: \'GBP\', value: \'GBP\' },
{ label: \'INR\', value: \'INR\' }];
export default class HTTPCalloutInLWC extends LightningElement {
@track fromCurrencyValue;
@track toCurrencyValue;
@track options = options;
@track toCurrencyOptions = options;
@track conversionData;
// Getting Base currency value
handleFromCurrencyChange(event) {
this.fromCurrencyValue = event.detail.value;
}
// getting exchange currency value
handleToCurrencyChange(event) {
this.toCurrencyValue = event.detail.value;
}
// Making Callout using Fetch
handleCurrencyConversion() {
fetch(\'https://www.alphavantage.co/query?function=CURRENCY_EXCHANGE_RATE&from_currency=\'
+ this.fromCurrencyValue + \'&to_currency=\' + this.toCurrencyValue + \'&apikey=4W7NZUQNJ061YHHF\', // End point URL
{
// Request type
method:\"GET\",
headers:{
// content type
\"Content-Type\": \"application/json\",
// adding your access token
\"Authorization\": \"OAuth 00DB0000000EfVQ!AQwAQEiiynMU2EsBcS2PhXSQ6KQTTG.Zr0hlDHTFcGcAPqKQOBNDB0rwyASZK44fqIAVe6GrVNZPsAWJ6iqXLNBfSQ.dqvW1\",
}
})
.then((response) => {
return response.json(); // returning the response in the form of JSON
})
.then((jsonResponse) => {
let objData = {
From_Currency_Name : \'\',
From_Currency_Code : \'\',
To_Currency_Name : \'\',
To_Currency_Code : \'\',
Exchange_Rate : \'\',
Last_Refersed : \'\',
};
window.console.log(\'jsonResponse ===> \'+JSON.stringify(jsonResponse));
// retriving the response data
let exchangeData = jsonResponse[\'Realtime Currency Exchange Rate\'];
// adding data object
objData.From_Currency_Code = exchangeData[\'1. From_Currency Code\'];
objData.From_Currency_Name = exchangeData[\'2. From_Currency Name\'];
objData.To_Currency_Code = exchangeData[\'3. To_Currency Code\'];
objData.To_Currency_Name = exchangeData[\'4. To_Currency Name\'];
objData.Exchange_Rate = exchangeData[\'5. Exchange Rate\'];
objData.Last_Refershed = exchangeData[\'6. Last Refreshed\'];
// adding data object to show in UI
this.conversionData = objData;
})
.catch(error => {
window.console.log(\'callout error ===> \'+JSON.stringify(error));
})
}
} HTTPCalloutInLWC.js-meta.xml
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<LightningComponentBundle xmlns=\"http://soap.sforce.com/2006/04/metadata\" fqn=\"HTTPCalloutInLWC\">
<apiVersion>46.0</apiVersion>
<isExposed>true</isExposed>
<targets>
<target>lightning__AppPage</target>
<target>lightning__RecordPage</target>
<target>lightning__HomePage</target>
</targets>
</LightningComponentBundle> Approach 2: Server-Side Controller
public inherited sharing class CurrencyConversionController {
@AuraEnabled
public static map<String, Object> retriveCurrencyConversionRates(String strEndPointURL){
map<String, Object> mapJsonData = new map<String, Object>();
String strResponse = null;
if(String.isNotBlank(strEndPointURL)) {
HttpRequest httpRequest = new HttpRequest();
httpRequest.setEndpoint(strEndPointURL);
httpRequest.setMethod(\'GET\');
httpRequest.setHeader(\'Authorization\', \'OAuth \' + UserInfo.getSessionId());
httpRequest.setHeader(\'Authorization\', \'Bearer \' + UserInfo.getSessionId());
try {
Http http = new Http();
HttpResponse httpResponse = http.send(httpRequest);
while(httpResponse.getStatusCode() == 302) {
httpRequest.setEndpoint(httpResponse.getHeader(\'Location\'));
httpResponse = new Http().send(httpRequest);
}
if (httpResponse.getStatusCode() == 200 ) {
strResponse = httpResponse.getBody();
}
else {
throw new CalloutException(httpResponse.getBody());
}
}
catch(Exception ex) {
throw ex;
}
}
if(!String.isBlank(strResponse)) {
mapJsonData = (map<String, Object>)JSON.deserializeUntyped(strResponse);
System.debug(\'mapJsonData ===> \'+mapJsonData);
}
if(!mapJsonData.isEmpty()) {
return mapJsonData;
}
else {
return null;
}
}
}
import getCurrencyData from \'@salesforce/apex/CurrencyConversionController.retriveCurrencyConversionRates\';
update JS Controller with below code
HTTPCalloutInLWC.js
import { LightningElement, track} from \'lwc\';
// importing apex class to make callout
import getCurrencyData from \'@salesforce/apex/CurrencyConversionController.retriveCurrencyConversionRates\';
// Currency options
const options = [
{ label: \'USD\', value: \'USD\' },
{ label: \'EUR\', value: \'EUR\' },
{ label: \'CAD\', value: \'CAD\' },
{ label: \'GBP\', value: \'GBP\' },
{ label: \'INR\', value: \'INR\' }];
export default class HTTPCalloutInLWC extends LightningElement {
@track fromCurrencyValue;
@track toCurrencyValue;
@track options = options;
@track toCurrencyOptions = options;
@track conversionData;
// Getting Base currency value
handleFromCurrencyChange(event) {
this.fromCurrencyValue = event.detail.value;
}
// getting exchange currency value
handleToCurrencyChange(event) {
this.toCurrencyValue = event.detail.value;
}
// Making Callout using apex class
handleCurrencyConversion() {
// endpoint URL
let endpointURL = \'https://www.alphavantage.co/query?function=CURRENCY_EXCHANGE_RATE&from_currency=\'
+ this.fromCurrencyValue + \'&to_currency=\' + this.toCurrencyValue + \'&apikey=4W7NZUQNJ061YHHF\';
// calling apex class method to make callout
getCurrencyData({strEndPointURL : endpointURL})
.then(data => {
let objData = {
From_Currency_Name : \'\',
From_Currency_Code : \'\',
To_Currency_Name : \'\',
To_Currency_Code : \'\',
Exchange_Rate : \'\',
Last_Refersed : \'\',
};
window.console.log(\'jsonResponse ===> \'+JSON.stringify(data));
// retriving the response data
let exchangeData = data[\'Realtime Currency Exchange Rate\'];
// adding data object
objData.From_Currency_Code = exchangeData[\'1. From_Currency Code\'];
objData.From_Currency_Name = exchangeData[\'2. From_Currency Name\'];
objData.To_Currency_Code = exchangeData[\'3. To_Currency Code\'];
objData.To_Currency_Name = exchangeData[\'4. To_Currency Name\'];
objData.Exchange_Rate = exchangeData[\'5. Exchange Rate\'];
objData.Last_Refershed = exchangeData[\'6. Last Refreshed\'];
// adding data object to show in UI
this.conversionData = objData;
})
.catch(error => {
window.console.log(\'error ====> \'+JSON.stringify(error));
})
}
} Output
Thanks for sharing Bro
Thanks for sharing Bro