Example API call code
Here we list example implementations using
- Javascript
- PHP
- Bash Script
Example using Javascript with node
Example script, call it callapi.js
#!/usr/bin/env node
const crypto = require('crypto');
const https = require('https');
const url = require('url');
function getRequestUriPart(urlString) {
const parsedUrl = new URL(urlString);
return parsedUrl.pathname + parsedUrl.search;
}
function getHostPart(urlString) {
const parsedUrl = new URL(urlString);
return `${parsedUrl.protocol}//${parsedUrl.host}`;
}
if (process.argv.length < 4) {
console.log(`Usage: ${process.argv[1]} <request method> <URL> <user> <secret>`);
console.log();
console.log("Note: if you use any other request method than GET you have to provide a request body to stdin");
process.exit(2);
}
const [, , method, urlString, user, secret] = process.argv;
const host = getHostPart(urlString);
const uri = getRequestUriPart(urlString);
const provider = 'gotom_app_api';
const date = new Date().toISOString().replace(/\.\d{3}/, '');
function processRequest(content) {
const contentHash = crypto.createHash('md5').update(content).digest('hex');
const contentType = 'application/json';
const customHeaders = '';
const digestParts = `${method.toUpperCase()}\n${contentHash}\n${contentType.toLowerCase()}\n${date}\n${customHeaders}\n${uri}`;
const digest = crypto.createHmac('sha1', secret).update(digestParts).digest('base64');
const signature = digest;
const options = {
method: method,
headers: {
'Authorization': `${provider} ${user}:${signature}`,
'Content-Type': contentType,
'Date': date
}
};
const req = https.request(urlString, options, (res) => {
console.log(`HTTP/${res.httpVersion} ${res.statusCode} ${res.statusMessage}`);
Object.entries(res.headers).forEach(([key, value]) => {
console.log(`${key}: ${value}`);
});
console.log();
res.setEncoding('utf8');
res.on('data', (chunk) => {
process.stdout.write(chunk);
});
});
req.on('error', (e) => {
console.error(`problem with request: ${e.message}`);
});
if (content) {
req.write(content);
}
req.end();
}
if (method.toUpperCase() === 'GET') {
processRequest('');
} else {
let content = '';
process.stdin.setEncoding('utf8');
process.stdin.on('readable', () => {
let chunk;
while ((chunk = process.stdin.read()) !== null) {
content += chunk;
}
});
process.stdin.on('end', () => {
processRequest(content);
});
// Set a timeout to end stdin if no input is provided
setTimeout(() => {
process.stdin.push(null);
}, 100);
process.stdin.resume();
}
From command Line call it for example for a campaign update POST
echo '{"name": "new campaign name", "status": "booking", "bookingDate": "2021-06-23", "note": "new note", "noteInternal": "new note-internal", "noteReservation": "new note-reservation", "campaignTypeId": 3, "campaignTypeReference": "Campaign-Type-Reference 3"}' | node callapi.js POST "https://demo.gotom.io/app-api/campaign/12345" 'theusernameyoureceived' 'thepasswordyoureceived'
Example response
HTTP/1.1 204 No Content
server: nginx/1.26.2
cache-control: no-cache, private
date: Thu, 07 Nov 2024 10:21:15 GMT
connection: close
Example using PHP
Example using Linux Bash
Store this as callapiendpoint.sh
#!/usr/bin/env bash
function get_request_uri_part() {
local url="$1"
echo "/${url#*://*/}"
}
function get_host_part() {
local url="$1"
local uri_part
uri_part="$(get_request_uri_part "$url")"
echo "${url%"$uri_part"}"
}
if [ -z "$1" ] || [ -z "$2" ]; then
echo "Usage: $0 <request method> <URL> <user> <secret>"
echo
echo "Note: if you use any other request method than GET you have to provide a request body to stdin"
exit 2
fi
url="$2"
host="$(get_host_part "$url")"
uri="$(get_request_uri_part "$url")"
provider='gotom_app_api'
user=${3}
secret=${4}
date=$(date +"%FT%T%:z")
method="$1"
if ! [ -t 0 ]; then content="$(cat)"; else content=""; fi
contentHash=$(echo -n "$content" | md5sum | cut -f1 -d' ')
contentType='application/json'
customHeaders=''
digestParts="${method^^}\n${contentHash}\n${contentType,,}\n${date}\n${customHeaders}\n${uri}"
digest=$(echo -en "$digestParts" | \
openssl dgst -sha1 -hmac "$secret" -binary | base64)
signature=$digest
curl -i -s "$host$uri" \
-X "$method" \
--header "Authorization: $provider $user:$signature" \
--header "Content-Type: $contentType" \
--header "Date: $date" \
-d "$content"
GET example call via Bash script
bash callapiendpoint.sh GET "https://demo.gotom.io/app-api/campaign/26106" 'theuseryoureceived' 'thepasswordyoureceived'
Example response
The response indicates in this case, that it cannot find campaign with externalId
26106
so most likely a wrong externalId
was passed to the script
HTTP/1.1 404 Not Found
server: nginx/1.26.2
content-type: application/json
vary: Accept
cache-control: no-cache, private
date: Thu, 07 Nov 2024 09:04:09 GMT
transfer-encoding: chunked
Response body
{
"type": "https://tools.ietf.org/html/rfc2616#section-10",
"title": "An error occurred",
"status": 404,
"detail": "Not Found"
}
POST JSON example call via Bash script
cat theexamplefileyoucreated.json | bash api-wrapper.sh POST "https://demo.gotom.io/app-api/campaign/26106" 'theuseryoureceived' 'thepasswordyoureceived'
Updated 8 days ago
What’s Next