{"id":89325,"date":"2019-03-12T13:28:16","date_gmt":"2019-03-12T11:28:16","guid":{"rendered":"https:\/\/www.javacodegeeks.com\/?p=89325"},"modified":"2019-03-12T13:28:18","modified_gmt":"2019-03-12T11:28:18","slug":"serverless-api-azure-functions","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2019\/03\/serverless-api-azure-functions.html","title":{"rendered":"Serverless API with Azure Functions"},"content":{"rendered":"<p>In this post I am going to work on a pretty simple use case. While executing a deployment pipeline <a href=\"http:\/\/flexagon.com\/flexdeploy\/\">FlexDeploy<\/a> may produce some human tasks that should be either approved or rejected. For example, someone has to approve a deployment to the production environment. It can be done either in <b>FlexDeploy UI<\/b> or with some external communication channels. Today I am going to focus on the scenario when a <b>FlexDeploy<\/b> human task is approved\/rejected with <b><a href=\"http:\/\/slack.com\/\">Slack<\/a><\/b>:<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-08-at-1.40.00-PM-1024x193.png\" alt=\"Serverless API\" class=\"wp-image-89338\" width=\"768\" height=\"145\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-08-at-1.40.00-PM-1024x193.png 1024w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-08-at-1.40.00-PM-300x57.png 300w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-08-at-1.40.00-PM-768x145.png 768w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-08-at-1.40.00-PM.png 1536w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/><\/figure>\n<\/div>\n<p>There are a few requirements and considerations that I would like to take into account:<\/p>\n<ul class=\"wp-block-list\">\n<li>I don&#8217;t want to teach <b>FlexDeploy<\/b>&nbsp;to communicate with <b>Slack<\/b><\/li>\n<li>I don&#8217;t want to provide <b>Slack<\/b> with the details of <b>FlexDeploy API<\/b><\/li>\n<li>I don&#8217;t want to expose&nbsp;<b>FlexDeploy API<\/b> to public&nbsp;<\/li>\n<li>I do want to be able to easily change <b>Slack<\/b>&nbsp;to something different or add other communication tools without touching <b>FlexDeploy<\/b><\/li>\n<\/ul>\n<p>Basically, I want to decouple <b>FlexDeploy<\/b> from the details of the external communication mechanism. For that reason I am going to introduce an extra layer, an <b>API<\/b> between <b>FlexDeploy<\/b> and <b>Slack<\/b>. It looks like <b>serverless paradigm<\/b> is a very attractive approach to implement this<b>API<\/b>. Today I am going to build it with <b><a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/azure-functions\/\">Azure Functions<\/a>,<\/b>\u00a0because &#8230; why not?\u00a0<\/p>\n<p>So, technically, a poc version of the solution looks like this:<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-08-at-1.48.15-PM-1024x746.png\" alt=\"Serverless API\" class=\"wp-image-89339\" width=\"768\" height=\"560\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-08-at-1.48.15-PM-1024x746.png 1024w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-08-at-1.48.15-PM-300x218.png 300w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-08-at-1.48.15-PM-768x559.png 768w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-08-at-1.48.15-PM.png 1600w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/><\/figure>\n<\/div>\n<p>Once a new human task comes up, FlexDeploy notifies the serverless API about that providing an internal task id and task description. There is a function <b>SaveTask<\/b> that saves the provided task details along with a generated token (just some uid) to <b><a href=\"https:\/\/azure.microsoft.com\/en-us\/services\/storage\/tables\/?&amp;OCID=AID719825_SEM_Lyij5NkP&amp;lnkd=Google_Azure_Brand&amp;gclid=EAIaIQobChMI2df_wK7z4AIVkbrACh2PVg0kEAAYASAAEgL1SPD_BwE\">Azure Table storage<\/a><\/b>. This token has an expiration time meaning that it should be used before that time toapprove\/reject the task.<\/p>\n<div>\n<div id=\"highlighter_179110\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java keyword\">const<\/code> <code class=\"java plain\">azure = require(<\/code><code class=\"java string\">'azure-storage'<\/code><code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java keyword\">const<\/code> <code class=\"java plain\">uuidv1 = require(<\/code><code class=\"java string\">'uuid\/v1'<\/code><code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number3 index2 alt2\">&nbsp;<\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java plain\">module.exports = async function (context, taskid) { &nbsp; <\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; <\/code><code class=\"java plain\">var tableSvc = azure.createTableService(<\/code><code class=\"java string\">'my_account'<\/code><code class=\"java plain\">, <\/code><code class=\"java string\">'my_key'<\/code><code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; <\/code><code class=\"java plain\">var entGen = azure.TableUtilities.entityGenerator;<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; <\/code><code class=\"java plain\">var token = uuidv1();<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; <\/code><code class=\"java plain\">var tokenEntity = {<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; <\/code><code class=\"java plain\">PartitionKey: entGen.String(<\/code><code class=\"java string\">'tokens'<\/code><code class=\"java plain\">),<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; <\/code><code class=\"java plain\">RowKey: entGen.String(token),<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; <\/code><code class=\"java plain\">TaskId: entGen.String(taskid),<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; <\/code><code class=\"java plain\">dueDate: entGen.DateTime(<\/code><code class=\"java keyword\">new<\/code> <code class=\"java plain\">Date(Date.now() + <\/code><code class=\"java value\">24<\/code> <code class=\"java plain\">* <\/code><code class=\"java value\">60<\/code> <code class=\"java plain\">* <\/code><code class=\"java value\">60<\/code> <code class=\"java plain\">* <\/code><code class=\"java value\">1000<\/code><code class=\"java plain\">))<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; &nbsp; <\/code><code class=\"java plain\">};<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; &nbsp;<\/code>&nbsp;<\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; &nbsp; <\/code><code class=\"java plain\">tableSvc.insertEntity(<\/code><code class=\"java string\">'tokens'<\/code><code class=\"java plain\">,tokenEntity, function (error, result, response) { });<\/code><\/div>\n<div class=\"line number16 index15 alt1\">&nbsp;<\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; <\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">token; <\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"java plain\">};<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Having the token saved, the <b>PostToSlack <\/b>function is invoked posting a message to a <b>Slack<\/b> channel. <b>SaveTask <\/b>and  <b>PostTo Slack <\/b>functions are orchestrated into a <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/azure-functions\/durable\/durable-functions-overview\">durable function <\/a><b>NotifyOnTask <\/b>which is actually being invoked by<b>FlexDeploy:<\/b><\/p>\n<div>\n<div id=\"highlighter_992667\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java keyword\">const<\/code> <code class=\"java plain\">df = require(<\/code><code class=\"java string\">\"durable-functions\"<\/code><code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java plain\">module.exports = df.orchestrator(function*(context){ &nbsp; <\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; <\/code><code class=\"java plain\">var task = context.df.getInput()<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; <\/code><code class=\"java plain\">var token = yield context.df.callActivity(<\/code><code class=\"java string\">\"SaveTask\"<\/code><code class=\"java plain\">, &nbsp;task.taskid)<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; <\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">yield context.df.callActivity(<\/code><code class=\"java string\">\"PostToSlack\"<\/code><code class=\"java plain\">, &nbsp;{<\/code><code class=\"java string\">\"token\"<\/code><code class=\"java plain\">: token, <\/code><code class=\"java string\">\"description\"<\/code><code class=\"java plain\">: task.description})<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java plain\">});<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The message in<b>Slack <\/b>contains two buttons to approve and reject the task.<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-09-at-4.38.04-PM.png\" alt=\"Serverless API\" class=\"wp-image-89340\" width=\"648\" height=\"138\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-09-at-4.38.04-PM.png 864w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-09-at-4.38.04-PM-300x64.png 300w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-09-at-4.38.04-PM-768x164.png 768w\" sizes=\"(max-width: 648px) 100vw, 648px\" \/><\/figure>\n<\/div>\n<p>The buttons refer to webhooks pointing to the  <b>ActionOnToken <\/b>durable function:<\/p>\n<div>\n<div id=\"highlighter_301047\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java keyword\">const<\/code> <code class=\"java plain\">df = require(<\/code><code class=\"java string\">\"durable-functions\"<\/code><code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java plain\">module.exports = df.orchestrator(function*(context){ &nbsp; <\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; <\/code><code class=\"java plain\">var input = context.df.getInput()<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; <\/code><code class=\"java plain\">var taskId = yield context.df.callActivity(<\/code><code class=\"java string\">\"GetTaskId\"<\/code><code class=\"java plain\">, &nbsp;input.token)<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; <\/code><code class=\"java keyword\">if<\/code> <code class=\"java plain\">(input.action == <\/code><code class=\"java string\">'approve'<\/code><code class=\"java plain\">) {<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; <\/code><code class=\"java plain\">yield context.df.callActivity(<\/code><code class=\"java string\">\"ApproveTask\"<\/code><code class=\"java plain\">, &nbsp;taskId)<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; <\/code><code class=\"java plain\">} <\/code><code class=\"java keyword\">else<\/code> <code class=\"java keyword\">if<\/code> <code class=\"java plain\">(input.action == <\/code><code class=\"java string\">'reject'<\/code><code class=\"java plain\">) {<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; <\/code><code class=\"java plain\">yield context.df.callActivity(<\/code><code class=\"java string\">\"RejectTask\"<\/code><code class=\"java plain\">, &nbsp;taskId)<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; <\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java plain\">});<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><b>ActionOnToken <\/b>invokes <b>GetTaskId <\/b>function retrieving\u00a0task id from the storage by the given token:<\/p>\n<div>\n<div id=\"highlighter_397456\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<div class=\"line number19 index18 alt2\">19<\/div>\n<div class=\"line number20 index19 alt1\">20<\/div>\n<div class=\"line number21 index20 alt2\">21<\/div>\n<div class=\"line number22 index21 alt1\">22<\/div>\n<div class=\"line number23 index22 alt2\">23<\/div>\n<div class=\"line number24 index23 alt1\">24<\/div>\n<div class=\"line number25 index24 alt2\">25<\/div>\n<div class=\"line number26 index25 alt1\">26<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java keyword\">const<\/code> <code class=\"java plain\">azure = require(<\/code><code class=\"java string\">'azure-storage'<\/code><code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java plain\">module.exports = async function (context, token) {<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; <\/code><code class=\"java plain\">var tableSvc = azure.createTableService(<\/code><code class=\"java string\">'my_account'<\/code><code class=\"java plain\">, <\/code><code class=\"java string\">'my_key'<\/code><code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number5 index4 alt2\">&nbsp;<\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; <\/code><code class=\"java plain\">function queryTaskID(token) {<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; <\/code><code class=\"java keyword\">return<\/code> <code class=\"java keyword\">new<\/code> <code class=\"java plain\">Promise(function (resolve, reject) {<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <\/code><code class=\"java plain\">tableSvc.retrieveEntity(<\/code><code class=\"java string\">'tokens'<\/code><code class=\"java plain\">, <\/code><code class=\"java string\">'tokens'<\/code><code class=\"java plain\">, token,&nbsp;<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">function (error, result, response) {<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <\/code><code class=\"java keyword\">if<\/code> <code class=\"java plain\">(error) {<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <\/code><code class=\"java plain\">reject(error)<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <\/code><code class=\"java plain\">} <\/code><code class=\"java keyword\">else<\/code> <code class=\"java plain\">{<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <\/code><code class=\"java plain\">resolve(result)<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <\/code><code class=\"java plain\">});<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; <\/code><code class=\"java plain\">});<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; <\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number18 index17 alt1\">&nbsp;<\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; <\/code><code class=\"java plain\">var tokenEntity = await queryTaskID(token);<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; <\/code><code class=\"java keyword\">if<\/code> <code class=\"java plain\">(tokenEntity) {<\/code><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; <\/code><code class=\"java plain\">var dueDate = tokenEntity.dueDate._<\/code><\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; <\/code><code class=\"java keyword\">if<\/code> <code class=\"java plain\">(dueDate &gt; Date.now()) {<\/code><\/div>\n<div class=\"line number23 index22 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">tokenEntity.TaskId._<\/code><\/div>\n<div class=\"line number24 index23 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; <\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number25 index24 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; <\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number26 index25 alt1\"><code class=\"java plain\">};<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Having done that it either approves or rejects the task by invoking either<br \/><b>ApproveTask<\/b> or<b>RejectTask<\/b> functions. \u00a0These functions in their turn make corresponding calls to FlexDeploy REST API.<\/p>\n<div>\n<div id=\"highlighter_634981\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java keyword\">const<\/code> <code class=\"java plain\">request = require(<\/code><code class=\"java string\">'sync-request'<\/code><code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java keyword\">const<\/code> <code class=\"java plain\">fd_url = <\/code><code class=\"java string\">'<a href=\"http:\/\/dkrlp01.flexagon:8000\">http:\/\/dkrlp01.flexagon:8000<\/a>'<\/code><code class=\"java plain\">;<\/code><\/div>\n<div class=\"line number3 index2 alt2\">&nbsp;<\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java plain\">module.exports = async function (context, taskid) { &nbsp; <\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; <\/code><code class=\"java plain\">var taskid = taskid;<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; <\/code><code class=\"java plain\">var res = request(<\/code><code class=\"java string\">'PUT'<\/code><code class=\"java plain\">,<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <\/code><code class=\"java plain\">fd_url+<\/code><code class=\"java string\">'\/flexdeploy\/rest\/v1\/tasks\/approval\/approve\/'<\/code><code class=\"java plain\">+taskid,{ &nbsp; &nbsp;&nbsp; &nbsp; <\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">});<\/code><\/div>\n<div class=\"line number9 index8 alt2\">&nbsp;<\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java plain\">};<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>I could start developing my serverless application directly in the cloud on<br \/><b>Azure Portal<\/b>, but I decided to implement everything and play with it locally and move to the cloud later. The fact that I can do that, develop and test my functions locally is actually very cool, not every serverless platform gives you that feature. The only thing I have configured in the cloud is<br \/><b>Azure Table storage <\/b>account with a table to store my tokens and task details.\u00a0<\/p>\n<p>A convenient way to start working with <b>Azure Functions<\/b>\u00a0locally is to use<br \/><b><a href=\"https:\/\/code.visualstudio.com\/\">Visual Studio Code<\/a><\/b> as a development tool. I am working on Mac, so I have downloaded and installed a version for Mac OS X. \u00a0 VS Code is all about extensions, for every technology you are working with you are installing one or a few extensions. Same is about <b>Azure Functions. <\/b>There is an extension for that:<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-08-at-11.50.06-AM-1024x376.png\" alt=\"Serverless API\" class=\"wp-image-89341\" width=\"768\" height=\"282\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-08-at-11.50.06-AM-1024x376.png 1024w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-08-at-11.50.06-AM-300x110.png 300w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-08-at-11.50.06-AM-768x282.png 768w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-08-at-11.50.06-AM.png 1600w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/><\/figure>\n<\/div>\n<p>Having done that, you are getting a new tab where you can create a new function application and start implementing your functions:<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-08-at-11.53.25-AM-1024x559.png\" alt=\"Serverless API\" class=\"wp-image-89342\" width=\"768\" height=\"419\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-08-at-11.53.25-AM-1024x559.png 1024w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-08-at-11.53.25-AM-300x164.png 300w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-08-at-11.53.25-AM-768x419.png 768w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-08-at-11.53.25-AM.png 1374w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/><\/figure>\n<\/div>\n<p>While configuring a new project the wizard is asking you to select a language you prefer to implement the functions with:<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-08-at-11.58.24-AM-1024x293.png\" alt=\"Serverless API\" class=\"wp-image-89343\" width=\"768\" height=\"220\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-08-at-11.58.24-AM-1024x293.png 1024w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-08-at-11.58.24-AM-300x86.png 300w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-08-at-11.58.24-AM-768x220.png 768w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-08-at-11.58.24-AM.png 1508w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/><\/figure>\n<\/div>\n<p>Even though I love Java, I have selected JavaScript because on top of regular functions I wanted to implement  <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/azure-functions\/durable\/durable-functions-overview\">durable functions<\/a> and they support <b>C#<\/b>,<br \/><b>F#<\/b> and <b>JavaScript<\/b> only. At the moment of writing this post<b>JavaScript<\/b> was the closest to me.<\/p>\n<p>Th rest is as usual. You create functions, write the code, debug, test, fix, and all over again. You just click F5 and VS Code starts the entire application in debug mode for you:<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-08-at-2.27.55-PM-1024x689.png\" alt=\"Serverless API\" class=\"wp-image-89344\" width=\"768\" height=\"517\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-08-at-2.27.55-PM-1024x689.png 1024w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-08-at-2.27.55-PM-300x202.png 300w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-08-at-2.27.55-PM-768x517.png 768w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2019\/03\/Screen-Shot-2019-03-08-at-2.27.55-PM.png 1600w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/><\/figure>\n<\/div>\n<p>When you start the application for the first time, VS Code will propose you to install the functions runtime on your computer if it is not there. So basically, assuming that you have on your laptop runtime of your preferred language (Node.js), you just need to have VS Code with the functions extension to start working with<b>Azure Functions<\/b>. It will do the rest of installations for you.\u00a0<\/p>\n<p>So, once the application is started I can test it by invoking<b>NotifyOnTask<\/b> function which initiates the entire cycle:<\/p>\n<div>\n<div id=\"highlighter_171782\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">curl -X POST --data <\/code><code class=\"java string\">'{\"taskid\":\"8900\",\"description\":\"DiPocket v.1.0.0.1 is about to be deployed to PROD\"}'<\/code>&nbsp; <code class=\"java plain\">-H <\/code><code class=\"java string\">\"Content-type: application\/json\"<\/code> <code class=\"java plain\">http:<\/code><code class=\"java comments\">\/\/localhost:7071\/api\/orchestrators\/NotifyOnTask<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The source code of the application is available on <a href=\"https:\/\/github.com\/eedorenko\/azure-fd-slack-api\">GitHub<\/a>.<\/p>\n<p>Well, the general opinion of <b>Azure Functions<\/b> so far is &#8230; it is good. It just works. I didn&#8217;t run into any annoying issue (so far) while implementing this solution (except some stupid mistakes that I made because I didn&#8217;t read the manual carefully). I will definitely keep playing and posting on <b>Azure Functions <\/b>enriching and moving this solution to the cloud and, probably, implementing something different.<\/p>\n<p>That&#8217;s it!<\/p>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td>\n<p>Published on Java Code Geeks with permission by Eugene Fedorenko , partner at our <a href=\"\/\/www.javacodegeeks.com\/join-us\/jcg\/\" target=\"_blank\" rel=\"noopener noreferrer\">JCG program<\/a>. See the original article here: <a href=\"http:\/\/adfpractice-fedor.blogspot.com\/2019\/03\/serverless-api-with-azure-functions.html\" target=\"_blank\" rel=\"noopener noreferrer\">Serverless API with Azure Functions<\/a><\/p>\n<p>Opinions expressed by Java Code Geeks contributors are their own.<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>In this post I am going to work on a pretty simple use case. While executing a deployment pipeline FlexDeploy may produce some human tasks that should be either approved or rejected. For example, someone has to approve a deployment to the production environment. It can be done either in FlexDeploy UI or with some &hellip;<\/p>\n","protected":false},"author":191,"featured_media":112,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[1352,1684],"class_list":["post-89325","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-azure","tag-serverless"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Serverless API with Azure Functions - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"Interested to learn about Serverless API? Check our article explaining how a FlexDeploy human task is approved\/rejected with Slack.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2019\/03\/serverless-api-azure-functions.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Serverless API with Azure Functions - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"Interested to learn about Serverless API? Check our article explaining how a FlexDeploy human task is approved\/rejected with Slack.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2019\/03\/serverless-api-azure-functions.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2019-03-12T11:28:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-03-12T11:28:18+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Eugene Fedorenko\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Eugene Fedorenko\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/03\\\/serverless-api-azure-functions.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/03\\\/serverless-api-azure-functions.html\"},\"author\":{\"name\":\"Eugene Fedorenko\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/9e61ee3d0b8fda5d1239f82f0f5e4e93\"},\"headline\":\"Serverless API with Azure Functions\",\"datePublished\":\"2019-03-12T11:28:16+00:00\",\"dateModified\":\"2019-03-12T11:28:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/03\\\/serverless-api-azure-functions.html\"},\"wordCount\":867,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/03\\\/serverless-api-azure-functions.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"keywords\":[\"azure\",\"Serverless\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/03\\\/serverless-api-azure-functions.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/03\\\/serverless-api-azure-functions.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/03\\\/serverless-api-azure-functions.html\",\"name\":\"Serverless API with Azure Functions - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/03\\\/serverless-api-azure-functions.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/03\\\/serverless-api-azure-functions.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"datePublished\":\"2019-03-12T11:28:16+00:00\",\"dateModified\":\"2019-03-12T11:28:18+00:00\",\"description\":\"Interested to learn about Serverless API? Check our article explaining how a FlexDeploy human task is approved\\\/rejected with Slack.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/03\\\/serverless-api-azure-functions.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/03\\\/serverless-api-azure-functions.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/03\\\/serverless-api-azure-functions.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"width\":150,\"height\":150,\"caption\":\"java-interview-questions-answers\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2019\\\/03\\\/serverless-api-azure-functions.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/enterprise-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Serverless API with Azure Functions\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/9e61ee3d0b8fda5d1239f82f0f5e4e93\",\"name\":\"Eugene Fedorenko\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/603abf38118b4dc4a30d186fd170b45a3f06c8cb83e2598e6de2b3519fff4e3f?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/603abf38118b4dc4a30d186fd170b45a3f06c8cb83e2598e6de2b3519fff4e3f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/603abf38118b4dc4a30d186fd170b45a3f06c8cb83e2598e6de2b3519fff4e3f?s=96&d=mm&r=g\",\"caption\":\"Eugene Fedorenko\"},\"description\":\"I am a Senior Architect at Flexagon focusing on ADF and many other things.\",\"sameAs\":[\"http:\\\/\\\/adfpractice-fedor.blogspot.com\\\/\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/eugene-fedorenko\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Serverless API with Azure Functions - Java Code Geeks","description":"Interested to learn about Serverless API? Check our article explaining how a FlexDeploy human task is approved\/rejected with Slack.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2019\/03\/serverless-api-azure-functions.html","og_locale":"en_US","og_type":"article","og_title":"Serverless API with Azure Functions - Java Code Geeks","og_description":"Interested to learn about Serverless API? Check our article explaining how a FlexDeploy human task is approved\/rejected with Slack.","og_url":"https:\/\/www.javacodegeeks.com\/2019\/03\/serverless-api-azure-functions.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2019-03-12T11:28:16+00:00","article_modified_time":"2019-03-12T11:28:18+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","type":"image\/jpeg"}],"author":"Eugene Fedorenko","twitter_card":"summary_large_image","twitter_creator":"@javacodegeeks","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Eugene Fedorenko","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2019\/03\/serverless-api-azure-functions.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/03\/serverless-api-azure-functions.html"},"author":{"name":"Eugene Fedorenko","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/9e61ee3d0b8fda5d1239f82f0f5e4e93"},"headline":"Serverless API with Azure Functions","datePublished":"2019-03-12T11:28:16+00:00","dateModified":"2019-03-12T11:28:18+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/03\/serverless-api-azure-functions.html"},"wordCount":867,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/03\/serverless-api-azure-functions.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","keywords":["azure","Serverless"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2019\/03\/serverless-api-azure-functions.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2019\/03\/serverless-api-azure-functions.html","url":"https:\/\/www.javacodegeeks.com\/2019\/03\/serverless-api-azure-functions.html","name":"Serverless API with Azure Functions - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/03\/serverless-api-azure-functions.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/03\/serverless-api-azure-functions.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","datePublished":"2019-03-12T11:28:16+00:00","dateModified":"2019-03-12T11:28:18+00:00","description":"Interested to learn about Serverless API? Check our article explaining how a FlexDeploy human task is approved\/rejected with Slack.","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2019\/03\/serverless-api-azure-functions.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2019\/03\/serverless-api-azure-functions.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2019\/03\/serverless-api-azure-functions.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","width":150,"height":150,"caption":"java-interview-questions-answers"},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2019\/03\/serverless-api-azure-functions.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/enterprise-java"},{"@type":"ListItem","position":4,"name":"Serverless API with Azure Functions"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/9e61ee3d0b8fda5d1239f82f0f5e4e93","name":"Eugene Fedorenko","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/603abf38118b4dc4a30d186fd170b45a3f06c8cb83e2598e6de2b3519fff4e3f?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/603abf38118b4dc4a30d186fd170b45a3f06c8cb83e2598e6de2b3519fff4e3f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/603abf38118b4dc4a30d186fd170b45a3f06c8cb83e2598e6de2b3519fff4e3f?s=96&d=mm&r=g","caption":"Eugene Fedorenko"},"description":"I am a Senior Architect at Flexagon focusing on ADF and many other things.","sameAs":["http:\/\/adfpractice-fedor.blogspot.com\/"],"url":"https:\/\/www.javacodegeeks.com\/author\/eugene-fedorenko"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/89325","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/191"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=89325"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/89325\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/112"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=89325"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=89325"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=89325"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}