<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>json source Archives | ZappySys Blog</title>
	<atom:link href="https://zappysys.com/blog/tag/json-source/feed/" rel="self" type="application/rss+xml" />
	<link>https://zappysys.com/blog/tag/json-source/</link>
	<description>SSIS / ODBC Drivers / API Connectors for JSON, XML, Azure, Amazon AWS, Salesforce, MongoDB and more</description>
	<lastBuildDate>Thu, 19 Mar 2026 23:09:47 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.4.4</generator>

<image>
	<url>https://zappysys.com/blog/wp-content/uploads/2023/01/cropped-zappysys-symbol-large-32x32.png</url>
	<title>json source Archives | ZappySys Blog</title>
	<link>https://zappysys.com/blog/tag/json-source/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>How to convert JSON to CSV File using SSIS</title>
		<link>https://zappysys.com/blog/convert-json-to-csv-file-using-ssis/</link>
		
		<dc:creator><![CDATA[ZappySys]]></dc:creator>
		<pubDate>Wed, 14 Feb 2018 16:52:37 +0000</pubDate>
				<category><![CDATA[SSIS Components]]></category>
		<category><![CDATA[SSIS JSON Source (File/REST)]]></category>
		<category><![CDATA[SSIS PowerPack]]></category>
		<category><![CDATA[convert]]></category>
		<category><![CDATA[CSV]]></category>
		<category><![CDATA[export]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[json source]]></category>
		<guid isPermaLink="false">https://zappysys.com/blog/?p=2626</guid>

					<description><![CDATA[<p>Introduction In this article, you will learn how to convert JSON to CSV File using SSIS. Sometimes you need to convert JSON file to a CSV, which resides in your local disk or somewhere on the Internet, be it a simple download link or a more sophisticated API call. Using ZappySys SSIS PowerPack together with [&#8230;]</p>
<p>The post <a href="https://zappysys.com/blog/convert-json-to-csv-file-using-ssis/">How to convert JSON to CSV File using SSIS</a> appeared first on <a href="https://zappysys.com/blog">ZappySys Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Introduction</h2>
<p>In this article, you will learn how to convert JSON to CSV File using <a href="https://docs.microsoft.com/en-us/sql/integration-services/sql-server-integration-services" target="_blank" rel="noopener">SSIS</a>. Sometimes you need to convert JSON file to a CSV, which resides in your local disk or somewhere on the Internet, be it a simple download link or a more sophisticated API call. Using <a href="https://zappysys.com/products/ssis-powerpack/" target="_blank" rel="noopener">ZappySys SSIS PowerPack</a> together with SSIS will make it easy to happen.</p>
<p>We will be using this <a href="https://zappysys.com/products/ssis-powerpack/" target="_blank" rel="noopener">ZappySys SSIS PowerPack</a> component to make things work:</p>
<div class="su-table su-table-alternate">
<table width="300">
<tbody>
<tr style="line-height: 0px">
<td width="50px"><a href="//zappysys.com/products/ssis-powerpack/ssis-json-file-source/" target="_blank" rel="noopener"><img decoding="async" class="alignnone size-full wp-image-3074" src="https://zappysys.com/blog/wp-content/uploads/2016/01/SSIS-Json-Source-Adapter.png" alt="" width="50" height="50" /></a></td>
<td style="vertical-align: middle"><a href="//zappysys.com/products/ssis-powerpack/ssis-json-file-source/" target="_blank" rel="noopener">JSON Source (REST API or File)</a></td>
</tr>
</tbody>
</table>
</div>
<h2>Prerequisites</h2>
<ol>
<li>SSIS designer installed. Sometimes it is referred as BIDS or SSDT (<a href="https://docs.microsoft.com/en-us/sql/ssdt/download-sql-server-data-tools-ssdt" target="_blank" rel="noopener">download it from Microsoft site</a>).</li>
<li>Basic knowledge of SSIS package development using <em>Microsoft SQL Server Integration Services</em>.</li>
<li><a href="https://zappysys.com/Links/?id=ssis_powerpack_getfile64&amp;src=email" target="_blank" rel="noopener"><em>ZappySys SSIS PowerPack</em> installed</a>.</li>
</ol>
<h2><span id="Step-by-Step_Bulk_loading_data_from_SQL_Serverto_Elasticsearch_with_SSIS">Step-by-Step – Export JSON to CSV File with SSIS</span></h2>
<ol>
<li>From SSIS Toolbox drag and drop <em>Data Flow</em> into the <em>Control Flow</em>.</li>
<li>Then drag and drop <em>JSON Source (REST API or File)</em> into the <em>Data Flow</em>.</li>
<li>Open <em>JSON Source</em> component for modifications.</li>
<li>Load JSON directly, from variable or URL:<br />
<a href="https://zappysys.com/blog/wp-content/uploads/2018/02/convert-json-to-csv-using-ssis.png"><img loading="lazy" decoding="async" class="alignnone wp-image-3069 size-full" src="https://zappysys.com/blog/wp-content/uploads/2018/02/convert-json-to-csv-using-ssis-e1521124289364.png" alt="Convert JSON to CSV File using SSIS" width="615" height="679" srcset="https://zappysys.com/blog/wp-content/uploads/2018/02/convert-json-to-csv-using-ssis-e1521124289364.png 615w, https://zappysys.com/blog/wp-content/uploads/2018/02/convert-json-to-csv-using-ssis-e1521124289364-272x300.png 272w" sizes="(max-width: 615px) 100vw, 615px" /></a></li>
<li>Use JSONPath Expression in <em>Filter</em> section to select the data you need. We will use <pre class="crayon-plain-tag">$.store.book[*]</pre> to extract all books from JSON array. Check <a href="https://zappysys.com/blog/jsonpath-examples-expression-cheetsheet/" target="_blank" rel="noopener">Understanding JSONPath Expression with Examples</a> article to see more examples how this filter works.</li>
<li>Close the window.</li>
<li>Drag and drop <em>Flat File Destination</em> into <em>Data Flow</em> and connect it to <em>JSON Source</em>:<br />
<a href="https://zappysys.com/blog/wp-content/uploads/2018/02/export-json-to-csv-with-json-source-powerpack-component.png"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-2792" src="https://zappysys.com/blog/wp-content/uploads/2018/02/export-json-to-csv-with-json-source-powerpack-component.png" alt="" width="368" height="180" srcset="https://zappysys.com/blog/wp-content/uploads/2018/02/export-json-to-csv-with-json-source-powerpack-component.png 368w, https://zappysys.com/blog/wp-content/uploads/2018/02/export-json-to-csv-with-json-source-powerpack-component-300x147.png 300w" sizes="(max-width: 368px) 100vw, 368px" /></a></li>
<li>Open <em>Flat File Destination</em> for configuration, configure it and map <em>JSON Source</em> columns with <em>Flat File Destination</em> columns.</li>
<li>You are done! JSON will be exported to a CSV (<a href="#Download_a_sample_package">download a sample package</a>).</li>
</ol>
<h2>Using API as JSON source</h2>
<p>If your JSON happens to reside in a response of an API call which uses OAuth authentication, read this article how to configure <em>JSON Source</em> OAuth connection:</p>
<blockquote class="wp-embedded-content" data-secret="ctlfkm5qd2"><p><a href="https://zappysys.com/blog/rest-api-authentication-with-oauth-2-0-using-ssis/">How to authenticate to an API with OAuth 2.0 using SSIS</a></p></blockquote>
<p><iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted" src="https://zappysys.com/blog/rest-api-authentication-with-oauth-2-0-using-ssis/embed/#?secret=ctlfkm5qd2" data-secret="ctlfkm5qd2" width="600" height="338" title="&#8220;How to authenticate to an API with OAuth 2.0 using SSIS&#8221; &#8212; ZappySys Blog" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe></p>
<h2>Exporting multiple JSON arrays to a CSV</h2>
<p>There may be a need to export two or more JSON arrays to several CSVs. In that case, you might be interested in this article:</p>
<div class="crayon-toolbar" data-settings=" mouseover overlay hide delay">
<div class="crayon-tools">
<div class="crayon-button crayon-plain-button" title="Toggle Plain Code">
<blockquote class="wp-embedded-content" data-secret="Gvu8PBCSK9"><p><a href="https://zappysys.com/blog/extract-read-multiple-arrays-from-json-data-file-rest-api-response/">Reading JSON Arrays from file / REST API</a></p></blockquote>
<p><iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted" src="https://zappysys.com/blog/extract-read-multiple-arrays-from-json-data-file-rest-api-response/embed/#?secret=Gvu8PBCSK9" data-secret="Gvu8PBCSK9" width="600" height="338" title="&#8220;Reading JSON Arrays from file / REST API&#8221; &#8212; ZappySys Blog" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe></p>
<h2 class="crayon-button-icon">Transforming JSON array</h2>
<p>Another use case you may encounter is when row values are placed in a JSON array. And then you desperately want to transform that array so that you could see those values in separate columns:</p>
<div id="attachment_3063" style="width: 745px" class="wp-caption alignnone"><a href="https://zappysys.com/blog/wp-content/uploads/2018/02/convert-json-to-csv-ssis-export-json-source.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-3063" class="wp-image-3063 size-full" src="https://zappysys.com/blog/wp-content/uploads/2018/02/convert-json-to-csv-ssis-export-json-source-e1521123257233.png" alt="Convert JSON to CSV File using SSIS: JSON array appears as one column" width="735" height="733" srcset="https://zappysys.com/blog/wp-content/uploads/2018/02/convert-json-to-csv-ssis-export-json-source-e1521123257233.png 735w, https://zappysys.com/blog/wp-content/uploads/2018/02/convert-json-to-csv-ssis-export-json-source-e1521123257233-150x150.png 150w, https://zappysys.com/blog/wp-content/uploads/2018/02/convert-json-to-csv-ssis-export-json-source-e1521123257233-300x300.png 300w" sizes="(max-width: 735px) 100vw, 735px" /></a><p id="caption-attachment-3063" class="wp-caption-text">Convert JSON to CSV File: JSON array appears as one column</p></div>
<p><span id="Pattern_1_8211_JSON_Array_using_Simple_Transformation_Column_names_found_in_JSON">This would require to make a <em>Simple Transformation</em> on source JSON:</span></p>
</div>
<div class="crayon-button crayon-wrap-button" title="Toggle Line Wrap">
<div class="crayon-button-icon">
<div id="crayon-5a9d54c5ce278640066629-1" class="crayon-line">
<div id="attachment_3068" style="width: 705px" class="wp-caption alignnone"><a href="https://zappysys.com/blog/wp-content/uploads/2018/02/export-json-to-csv-ssis-transform-json-array.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-3068" class="wp-image-3068 size-full" src="https://zappysys.com/blog/wp-content/uploads/2018/02/export-json-to-csv-ssis-transform-json-array-e1521123377163.png" alt="Convert JSON to CSV File using SSIS: Transforming JSON array values into columns" width="695" height="530" srcset="https://zappysys.com/blog/wp-content/uploads/2018/02/export-json-to-csv-ssis-transform-json-array-e1521123377163.png 695w, https://zappysys.com/blog/wp-content/uploads/2018/02/export-json-to-csv-ssis-transform-json-array-e1521123377163-300x229.png 300w" sizes="(max-width: 695px) 100vw, 695px" /></a><p id="caption-attachment-3068" class="wp-caption-text">Convert JSON to CSV File : Transforming JSON array values into columns</p></div>
<p>We also support transforming other formats of JSON arrays. Check how to transform them all in the article <a href="https://zappysys.com/blog/parse-multi-dimensional-json-array-ssis/" target="_blank" rel="noopener">Parse multi-dimensional JSON array in SSIS</a>.</p>
<h2>Common Errors</h2>
<div class="content_block" id="custom_post_widget-1887"><h3>Truncation related error</h3>
<p style="text-align: justify;">The most common error you may face when you run an SSIS package is truncation error. During the design time only 300 rows are scanned from a source (a file or a REST API call response) to detect datatypes but at runtime, it is likely you will retrieve far more records. So it is possible that you will get longer strings than initially expected. For detailed instructions on how to fix common metadata related errors read an article "<a href="//zappysys.com/blog/handling-ssis-component-metadata-issues/" target="_blank" rel="noopener">How to handle SSIS errors (truncation, metadata issues)</a>".</p>

<h3>Authentication related error</h3>
Another frequent error you may get is an authentication error, which happens when you deploy/copy a package to another machine and run it there. Check <a href="#Deployment_to_Production">the paragraph below</a> to see why it happens and how to solve this problem.</div>
<h2>Deployment to Production</h2>
<div class="content_block" id="custom_post_widget-1932"><p style="text-align: justify;">In SSIS package <a href="https://docs.microsoft.com/en-us/sql/integration-services/security/access-control-for-sensitive-data-in-packages" target="_blank" rel="noopener">sensitive data such as tokens and passwords are by default encrypted by SSIS</a> with your Windows account which you use to create a package. So SSIS will fail to decrypt tokens/passwords when you run it from another machine using another Windows account. To circumvent this when you are creating an SSIS package which uses authentication components (e.g. an <a href="https://zappysys.com/onlinehelp/ssis-powerpack/scr/ssis-oauth-connection-manager.htm" target="_blank" rel="noopener">OAuth Connection Manager</a> or an <a href="https://zappysys.com/onlinehelp/ssis-powerpack/scr/ssis-http-connection-manager.htm" target="_blank" rel="noopener">HTTP Connection Manager</a> with credentials, etc.), consider using parameters/variables to pass tokens/passwords. In this way, you won’t face authentication related errors when a package is deployed to a production server.</p>
<p style="text-align: justify;">Check our article on <a href="https://zappysys.com/blog/how-to-run-an-ssis-package-with-sensitive-data-on-sql-server/" target="_blank" rel="noopener">how to configure packages with sensitive data on your production or development server</a>.</p></div>
</div>
</div>
</div>
</div>
</div>
<h2 class="crayon-button-icon">Download a sample package</h2>
<p>Be sure to download a <a href="https://zappysys.com/blog/wp-content/uploads/2018/02/Convert-JSON-to-CSV-using-SSIS.zip">sample SQL Server 2012 SSIS package</a> in case you want to try it right away.</p>
<h2 class="crayon-button-icon">Conclusion</h2>
<p>In this article we learned how to convert JSON to a CSV using <a href="//zappysys.com/products/ssis-powerpack/ssis-json-file-source/" target="_blank" rel="noopener">SSIS PowerPack JSON Source</a> in a very simple way. We also touched topics that delve into more complicated scenarios such as grabbing JSON from an API, exporting multiple JSON arrays and transforming them into columns. Check our <a href="https://zappysys.com/blog/category/ssis/components/ssis-json-source/">Blog articles on JSON Source</a> to find out what <em>JSON Source</em> is capable of more.</p>
<p>The post <a href="https://zappysys.com/blog/convert-json-to-csv-file-using-ssis/">How to convert JSON to CSV File using SSIS</a> appeared first on <a href="https://zappysys.com/blog">ZappySys Blog</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to create BIML custom task or component</title>
		<link>https://zappysys.com/blog/how-to-use-biml-script-to-create-biml-custom-task-or-component/</link>
		
		<dc:creator><![CDATA[ZappySys]]></dc:creator>
		<pubDate>Thu, 21 Sep 2017 16:42:01 +0000</pubDate>
				<category><![CDATA[SSIS Components]]></category>
		<category><![CDATA[SSIS PowerPack]]></category>
		<category><![CDATA[SSIS Tips & How-Tos]]></category>
		<category><![CDATA[biml]]></category>
		<category><![CDATA[json source]]></category>
		<category><![CDATA[powerpack]]></category>
		<category><![CDATA[ssis http connection]]></category>
		<category><![CDATA[trash destination]]></category>
		<guid isPermaLink="false">http://zappysys.com/blog/?p=2025</guid>

					<description><![CDATA[<p>Introduction BIML, or Business Intelligence Markup Language, is a nice technology that lets you generate SSIS packages using a bit of scripting and parameters.  Check for more info if you are new to it: https://en.wikipedia.org/wiki/Business_Intelligence_Markup_Language http://bimlscript.com/ In this article, we will cover how to create a BIML custom task or component. For this purpose, we will use [&#8230;]</p>
<p>The post <a href="https://zappysys.com/blog/how-to-use-biml-script-to-create-biml-custom-task-or-component/">How to create BIML custom task or component</a> appeared first on <a href="https://zappysys.com/blog">ZappySys Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Introduction</h2>
<p><a href="//zappysys.com/blog/wp-content/uploads/2017/09/ssis-biml-powerpack-zappysys.png"><img loading="lazy" decoding="async" class="wp-image-2031 alignleft" src="//zappysys.com/blog/wp-content/uploads/2017/09/ssis-biml-powerpack-zappysys.png" alt="" width="90" height="90" srcset="https://zappysys.com/blog/wp-content/uploads/2017/09/ssis-biml-powerpack-zappysys.png 160w, https://zappysys.com/blog/wp-content/uploads/2017/09/ssis-biml-powerpack-zappysys-150x150.png 150w" sizes="(max-width: 90px) 100vw, 90px" /></a><span style="box-sizing: border-box; margin: 0px; padding: 0px;">BIML, or <em>Business Intelligence Markup Language,</em> is a nice technology that lets you generate SSIS packages using a bit of scripting and parameters.</span>  Check for more info if you are new to it:</p>
<ul style="list-style-position: inside;">
<li><a href="https://en.wikipedia.org/wiki/Business_Intelligence_Markup_Language" target="_blank" rel="noopener">https://en.wikipedia.org/wiki/Business_Intelligence_Markup_Language</a></li>
<li><a href="http://bimlscript.com/" target="_blank" rel="noopener">http://bimlscript.com/</a></li>
</ul>
<p>In this article, we will cover how to create a BIML custom task or component. For this purpose, we will use the <a href="//zappysys.com/products/ssis-powerpack/" target="_blank" rel="noopener">ZappySys PowerPack</a> Task or Data Flow component as an example. At the end of this article you will find <a href="//zappysys.com/blog/how-to-use-biml-to-generate-powerpack-ssis-connectors/#Download_sample_BIMLs">sample BIML files</a> you can download and fiddle around.</p>
<h2>Use BIML to create SSIS packages that use PowerPack tasks or components</h2>
<h3>BIML Elements</h3>
<p>BIML uses <pre class="crayon-plain-tag">CustomTask</pre>, <pre class="crayon-plain-tag">CustomComponent</pre>, and <pre class="crayon-plain-tag">CustomSsisConnection</pre> elements to create custom SSIS connectors. In each of them, you will need to specify <pre class="crayon-plain-tag">CreationName</pre> or a similar attribute/element, which defines what kind of component you want to create. E.g., for <em>LoggingTask</em> it would look like this:</p><pre class="crayon-plain-tag">ZappySys.PowerPack.Task.LoggingTask.LoggingTask, ZappySys.PowerPack120, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1903265a93eae502</pre><p>
You will find the connector name in DTSX. For Tasks, you have to specify the CreationName attribute; for components, it is UserComponentTypeName. For the <em>Rest API Task, </em>it looks similar to this:</p><pre class="crayon-plain-tag">&lt;DTS:Executable
 DTS:refId="Package\Sequence Container\ZS REST API Task 1.EventHandlers[OnError]\ZS REST API Task"
 DTS:CreationName="ZappySys.PowerPack.Task.RestApiTask.RestApiTask, ZappySys.PowerPack110, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1903265a93eae502"</pre><p>
<div class="su-note"  style="border-color:#e5dd9d;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;"><div class="su-note-inner su-u-clearfix su-u-trim" style="background-color:#FFF7B7;border-color:#ffffff;color:#333333;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;"><strong>NOTE</strong>: If your SSIS package is of a higher version than SQL Server 2012, convert it to SQL Server 2012 first.</div></div>
<p>For a different SQL Server SSIS package version, you will need to use a different DLL name, e.g.:</p>
<ul>
<li><strong>SQL Server 2008</strong>: ZappySys.PowerPack100</li>
<li><strong>SQL Server 2012</strong>: ZappySys.PowerPack110</li>
<li><strong>SQL Server 2014</strong>: ZappySys.PowerPack120</li>
<li><strong>SQL Server 2016</strong>: ZappySys.PowerPack130</li>
<li><strong>SQL Server 2017</strong>: ZappySys.PowerPack140</li>
</ul>
<p>So, to generate<strong> a SQL Server 2017</strong> SSIS package, the custom connector creation name becomes like this:</p><pre class="crayon-plain-tag">ZappySys.PowerPack.Task.LoggingTask.LoggingTask, ZappySys.PowerPack140, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1903265a93eae502</pre><p>
<h3>Create a BIML custom task with CustomTask</h3>
<p>You will need to use the <pre class="crayon-plain-tag">CustomTask</pre> element to create PowerPack Tasks in your Control Flow. So open your DTSX where you use a PowerPack Task, find out the <pre class="crayon-plain-tag">CreationName</pre> and then copy child element in <pre class="crayon-plain-tag">&lt;DTS:ObjectData&gt;</pre> element. (e.g., LoggingTask). You will need to escape it and use it in your BIML as well.</p>
<h4>DTSX snippet</h4>
<pre class="crayon-plain-tag">... 
&lt;DTS:Executable
    DTS:refId="Package\ZS Logging Task"
    DTS:CreationName="ZappySys.PowerPack.Task.LoggingTask.LoggingTask, ZappySys.PowerPack110, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1903265a93eae502"
    ...
    &lt;DTS:Variables /&gt;
    &lt;DTS:ObjectData&gt;
    &lt;LoggingTask
        Message="Hello from {{System::PackageName}}. I started on {{System::StartTime,yyy-MM-dd hh:mm:ss tt}}"
        LogVariableName=""
        MessageType="Information"
        LogMode="ExecutionLog"
        LogFilePath=""
        LogFileAppend="True"
        LogDateTime="True"
        DateTimeFormat="HH:mm:ss"
        LogLevel="Normal"
        PrefixTimestamp="False" /&gt;
    &lt;/DTS:ObjectData&gt;
&lt;/DTS:Executable&gt;
...</pre>
<h4>BIML snippet</h4>
<p>A Logging Task under the Tasks element will look like this:</p><pre class="crayon-plain-tag">...
&lt;CustomTask Name="Logging Task" CreationName="ZappySys.PowerPack.Task.LoggingTask.LoggingTask, ZappySys.PowerPack120, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1903265a93eae502" TaskContact="ZappySys"&gt;
    &lt;ObjectData&gt;
        &amp;lt;LoggingTask
        Message="Hello from {{System::PackageName}}. I started on {{System::StartTime,yyy-MM-dd hh:mm:ss tt}}"
        LogVariableName=""
        MessageType="Information"
        LogMode="ExecutionLog"
        LogFilePath=""
        LogFileAppend="True"
        LogDateTime="True"
        DateTimeFormat="HH:mm:ss"
        LogLevel="Normal"
        PrefixTimestamp="False" /&amp;gt;
 &lt;/ObjectData&gt;
&lt;/CustomTask&gt;
...</pre><p>
<div class="su-note"  style="border-color:#e5dd9d;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;"><div class="su-note-inner su-u-clearfix su-u-trim" style="background-color:#FFF7B7;border-color:#ffffff;color:#333333;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;"><strong>NOTE:</strong> Notice the escaped <pre class="crayon-plain-tag">&lt;LoggingTask&gt;</pre> XML element under <pre class="crayon-plain-tag">&lt;ObjectData&gt;</pre> element.</div></div>
<h3>Create BIML custom components using CustomComponent</h3>
<p>Use the <pre class="crayon-plain-tag">CustomComponent</pre> BIML element to generate these components in DataFlow:</p>
<ul>
<li>Sources</li>
<li>Transformations</li>
<li>Destinations</li>
</ul>
<p>If you need a connection, then use the CustomSsisConnection element.</p>
<p>Again, you will have to copy the <pre class="crayon-plain-tag">UserComponentTypeName</pre> property value and use it in BIML to initialize a component. For a custom connection, it is a bit different: just use the CreationName attribute value from DTSX in the BIML element. Also, don&#8217;t forget to copy property values from DTSX and mirror them in BIML.</p>
<p><span style="box-sizing: border-box; margin: 0px; padding: 0px;">Below are DTSX and BIML snippets showing a Data Flow that contains a JSON Source using an <a target="_blank" rel="noopener">HTTP Connection</a> and is connected to a <a target="_blank" rel="noopener">Trash Destination</a>.</span></p>
<h4>DTSX snippet</h4>
<pre class="crayon-plain-tag">...
&lt;DTS:ConnectionManagers&gt;
    &lt;DTS:ConnectionManager DTS:refId="Package.ConnectionManagers[ZS-HTTP Connection]" DTS:CreationName="ZS-HTTP" DTS:DTSID="{E57D23E9-E50A-4C4A-BB19-B91E776887CF}" DTS:ObjectName="ZS-HTTP Connection"&gt;
        &lt;DTS:ObjectData&gt;
            &lt;ConnectionManager ConnectionString="Url=https://httpbin.org/anything;CredentialType=Notset;UserName=;Timeout=100000;UseProxy=False;ProxyUrl=;UseProxyCreds=False;ProxyUserName=;DoNotUseDefaultProxy=False;UseClientCertificate=False;CertificatePath=;CertificateStorageType=CurrentUser;CertificateStoreName=My;CertificateThumbprint=;RetryMode=None;RetryCountMax=3;RetryWaitTimeMs=2000;RetryMultiplyWaitTime=False;RetryMessageList=;RetryStatusCodeList=" /&gt;
...
&lt;DTS:Executable DTS:refId="Package\Dataflow" DTS:CreationName="SSIS.Pipeline.3" DTS:DTSID="{C59866C4-9732-4B3A-8F80-7784E52C63F5}" DTS:ExecutableType="SSIS.Pipeline.3" DTS:LocaleID="-1" DTS:ObjectName="Dataflow" DTS:TaskContact="Performs high-performance data extraction, transformation and loading;Microsoft Corporation; Microsoft SQL Server v10; (C) 2007 Microsoft Corporation; All Rights Reserved;http://www.microsoft.com/sql/support/default.asp;1"&gt;
    &lt;DTS:ObjectData&gt;
    &lt;pipeline BLOBTempStoragePath="" bufferTempStoragePath="" version="1"&gt;
    &lt;components&gt;
    &lt;component refId="Package\Dataflow\JsonSource" componentClassID="DTS.ManagedComponentWrapper.3" name="JsonSource" usesDispositions="true" version="25"&gt;
        &lt;properties&gt;
            &lt;property dataType="System.Int32" name="AccessMode" typeConverter="ZappySys.Common.Ssis.FileValueAccessMode, ZappySys.Common, Version=1.0.2017.10830, Culture=neutral, PublicKeyToken=1903265a93eae502"&gt;2&lt;/property&gt;
            &lt;property dataType="System.Boolean" name="UseConnection"&gt;true&lt;/property&gt;
            &lt;property dataType="System.String" name="UserComponentTypeName"&gt;ZappySys.PowerPack.Adapter.JsonSource.JsonSource, ZappySys.PowerPack110, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1903265a93eae502&lt;/property&gt;
            ...
        &lt;/properties&gt;
        &lt;connections&gt;
            &lt;connection refId="Package\Dataflow\JsonSource.Connections[HTTP 1]" connectionManagerID="Package.ConnectionManagers[ZS-HTTP Connection]" connectionManagerRefId="Package.ConnectionManagers[ZS-HTTP Connection]" name="HTTP 1" /&gt;
        &lt;/connections&gt;
        &lt;outputs&gt;
            &lt;output refId="Package\Dataflow\JsonSource.Outputs[JsonSourceOutput]" errorRowDisposition="FailComponent" name="JsonSourceOutput" truncationRowDisposition="FailComponent"&gt;
                &lt;outputColumns&gt;
                    &lt;outputColumn refId="Package\Dataflow\JsonSource.Outputs[JsonSourceOutput].Columns[Url]" dataType="wstr" externalMetadataColumnId="Package\Dataflow\JsonSource.Outputs[JsonSourceOutput].ExternalColumns[url]" length="50" lineageId="Package\Dataflow\JsonSource.Outputs[JsonSourceOutput].Columns[Url]" name="Url" /&gt;
                &lt;/outputColumns&gt;
                &lt;externalMetadataColumns isUsed="True"&gt;
                    &lt;externalMetadataColumn refId="Package\Dataflow\JsonSource.Outputs[JsonSourceOutput].ExternalColumns[url]" dataType="wstr" length="50" name="url" /&gt;
                &lt;/externalMetadataColumns&gt;
            &lt;/output&gt;
            ...
        &lt;/outputs&gt;
    &lt;/component&gt;
    &lt;component refId="Package\Dataflow\TrashDestination" componentClassID="DTS.ManagedComponentWrapper.3" name="TrashDestination" version="2"&gt;
        &lt;properties&gt;
            &lt;property dataType="System.String" name="UserComponentTypeName"&gt;ZappySys.PowerPack.Adapter.TrashDestination.TrashDestination, ZappySys.PowerPack110, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1903265a93eae502&lt;/property&gt;
            ...
        &lt;/properties&gt;
        &lt;inputs&gt;
            &lt;input refId="Package\Dataflow\TrashDestination.Inputs[TrashInput]" name="TrashInput"&gt;
                &lt;externalMetadataColumns /&gt;
            &lt;/input&gt;
        &lt;/inputs&gt;
    &lt;/component&gt;
    &lt;/components&gt;
    &lt;paths&gt;
        &lt;path refId="Package\Dataflow.Paths[TrashInput]" endId="Package\Dataflow\TrashDestination.Inputs[TrashInput]" name="TrashInput" startId="Package\Dataflow\JsonSource.Outputs[JsonSourceOutput]" /&gt;
    &lt;/paths&gt;
...</pre>
<h4>BIML snippet</h4>
<pre class="crayon-plain-tag">...
&lt;Connections&gt;
    &lt;CustomSsisConnection Name="ZS-HTTP Connection" CreationName="ZS-HTTP" ObjectData="&amp;lt;ConnectionManager ConnectionString=&amp;quot;Url=https:&amp;#x2F;&amp;#x2F;httpbin.org&amp;#x2F;anything;CredentialType=Notset;UserName=;Timeout=100000;UseProxy=False;ProxyUrl=;UseProxyCreds=False;ProxyUserName=;DoNotUseDefaultProxy=False;UseClientCertificate=False;CertificatePath=;CertificateStorageType=CurrentUser;CertificateStoreName=My;CertificateThumbprint=;RetryMode=None;RetryCountMax=3;RetryWaitTimeMs=2000;RetryMultiplyWaitTime=False;RetryMessageList=;RetryStatusCodeList=&amp;quot; &amp;#x2F;&amp;gt;"/&gt;
&lt;/Connections&gt;
&lt;Packages&gt;
&lt;Package Name="DataFlow with Connection Sample" ConstraintMode="Linear"&gt;
&lt;Tasks&gt;
    &lt;Dataflow Name="Dataflow"&gt;
    &lt;Transformations&gt;
    &lt;CustomComponent Name="JsonSource" UsesDispositions="true" ComponentTypeName="ZappySys.PowerPack.Adapter.JsonSource.JsonSource, ZappySys.PowerPack130, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1903265a93eae502"&gt;
        &lt;CustomProperties&gt;
            &lt;CustomProperty Name="AccessMode" DataType="Int32"&gt;2&lt;/CustomProperty&gt;                              
            &lt;CustomProperty Name="UseConnection" DataType="Boolean"&gt;true&lt;/CustomProperty&gt;
        &lt;/CustomProperties&gt;
        &lt;OutputPaths&gt;
            &lt;OutputPath Name="JsonSourceOutput" ErrorRowDisposition="FailComponent" TruncationRowDisposition="FailComponent"&gt;
                &lt;ExternalColumns&gt;
                    &lt;ExternalColumn Name="url" DataType="String" Length="50" /&gt;
                &lt;/ExternalColumns&gt;                                  
                &lt;OutputColumns&gt;
                    &lt;OutputColumn Name="Url" ExternalMetadataColumnName="url" DataType="String" Length="50" /&gt;
                &lt;/OutputColumns&gt;
            &lt;/OutputPath&gt;
            &lt;OutputPath Name="Json Error Output" IsErrorOutput="true"&gt;
            &lt;OutputColumns&gt;
                &lt;OutputColumn Name="Url" /&gt;
            &lt;/OutputColumns&gt;
            &lt;/OutputPath&gt;                                  
        &lt;/OutputPaths&gt;
        &lt;Connections&gt;
        &lt;Connection Name="HTTP 1" ConnectionName="ZS-HTTP Connection" /&gt;
        &lt;/Connections&gt;                             
    &lt;/CustomComponent&gt;
    &lt;CustomComponent Name="TrashDestination" ComponentTypeName="ZappySys.PowerPack.Adapter.TrashDestination.TrashDestination, ZappySys.PowerPack130, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1903265a93eae502"&gt;
        &lt;InputPaths&gt;
            &lt;InputPath OutputPathName="JsonSource.JsonSourceOutput" Identifier="TrashInput" SsisName="TrashInput"/&gt;
        &lt;/InputPaths&gt;
    &lt;/CustomComponent&gt;
    &lt;/Transformations&gt;
...</pre>
<h2>Resources</h2>
<ul>
<li><a href="https://www.varigence.com/Documentation" target="_blank" rel="noopener">BIML documentation</a></li>
<li><a href="https://www.varigence.com/Documentation/Language/Element/AstCustomTaskNode" target="_blank" rel="noopener">CustomTask documentation</a></li>
<li><a href="https://schemas.varigence.com/Documentation/Language/Element/AstCustomComponentNode" target="_blank" rel="noopener">CustomComponent documentation</a></li>
<li><a href="https://www.varigence.com/Documentation/Language/Element/AstCustomSsisConnectionNode" target="_blank" rel="noopener">CustomSsisConnection documentation</a></li>
</ul>
<h2>Download sample BIMLs</h2>
<ul>
<li><a href="//zappysys.com/blog/wp-content/uploads/2017/09/Sample-BIML-with-PowerPack-components-inside-DataFlow.zip" target="_blank" rel="noopener">Sample BIML with PowerPack DataFlow Components</a></li>
<li><a href="//zappysys.com/blog/wp-content/uploads/2017/09/Sample-BIML-with-PowerPack-components-inside-DataFlow-with-connection.zip" target="_blank" rel="noopener">Sample BIML with PowerPack DataFlow Components with Connection</a></li>
<li><a href="//zappysys.com/blog/wp-content/uploads/2017/09/Sample-BIML-with-PowerPack-Task.zip" target="_blank" rel="noopener">Sample BIML with PowerPack Task</a></li>
</ul>
<p>The post <a href="https://zappysys.com/blog/how-to-use-biml-script-to-create-biml-custom-task-or-component/">How to create BIML custom task or component</a> appeared first on <a href="https://zappysys.com/blog">ZappySys Blog</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to make Path / URL dynamic in SSIS</title>
		<link>https://zappysys.com/blog/get-api-data-with-dynamic-url-and-load-into-sql-server/</link>
		
		<dc:creator><![CDATA[ZappySys]]></dc:creator>
		<pubDate>Wed, 13 Sep 2017 13:27:33 +0000</pubDate>
				<category><![CDATA[SSIS Tips & How-Tos]]></category>
		<category><![CDATA[address]]></category>
		<category><![CDATA[dynamic]]></category>
		<category><![CDATA[json source]]></category>
		<category><![CDATA[link]]></category>
		<category><![CDATA[url]]></category>
		<category><![CDATA[variable]]></category>
		<category><![CDATA[xml source]]></category>
		<guid isPermaLink="false">http://zappysys.com/blog/?p=1864</guid>

					<description><![CDATA[<p>Problem Most of SSIS PowerPack components support simple text placeholders engine to make things dynamic without using Complex Steps of SSIS Expression Engine. So let&#8217;s look at how to make Path / URL or other input values dynamic in SSIS. To show you how to do that we will use JSON Source component, but basically, [&#8230;]</p>
<p>The post <a href="https://zappysys.com/blog/get-api-data-with-dynamic-url-and-load-into-sql-server/">How to make Path / URL dynamic in SSIS</a> appeared first on <a href="https://zappysys.com/blog">ZappySys Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Problem</h3>
<p><a href="//zappysys.com/blog/wp-content/uploads/2017/09/load-data-from-api-to-sql-server-using-ssis-dynamic-variable-url-link-address.png"><img loading="lazy" decoding="async" class="alignleft wp-image-1871" src="//zappysys.com/blog/wp-content/uploads/2017/09/load-data-from-api-to-sql-server-using-ssis-dynamic-variable-url-link-address.png" alt="" width="120" height="120" srcset="https://zappysys.com/blog/wp-content/uploads/2017/09/load-data-from-api-to-sql-server-using-ssis-dynamic-variable-url-link-address.png 180w, https://zappysys.com/blog/wp-content/uploads/2017/09/load-data-from-api-to-sql-server-using-ssis-dynamic-variable-url-link-address-150x150.png 150w" sizes="(max-width: 120px) 100vw, 120px" /></a>Most of SSIS PowerPack components support simple <a href="https://zappysys.com/onlinehelp/ssis-powerpack/scr/ssis-format-specifiers.htm" target="_blank" rel="noopener">text placeholders engine</a> to make things dynamic without using Complex Steps of <a href="https://zappysys.com/blog/ssis-dataflow-expression-source-component-property/" target="_blank" rel="noopener">SSIS Expression Engine</a>. So let&#8217;s look at how to make Path / URL or other input values dynamic in SSIS. To show you how to do that we will use <a href="//zappysys.com/products/ssis-powerpack/ssis-json-file-source/" target="_blank" rel="noopener">JSON Source</a> component, but basically, you can use it in any <a href="//zappysys.com/products/ssis-powerpack/" target="_blank" rel="noopener">ZappySys PowerPack</a> component that has URL option, including <a href="//zappysys.com/products/ssis-powerpack/ssis-xml-source/" target="_blank" rel="noopener">XML Source</a>.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3>Create a variable</h3>
<p><a href="//zappysys.com/blog/wp-content/uploads/2017/09/load-data-from-api-to-sql-server-using-ssis-dynamic-variable-url-link-address-set-default-value.jpg"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-1869" src="//zappysys.com/blog/wp-content/uploads/2017/09/load-data-from-api-to-sql-server-using-ssis-dynamic-variable-url-link-address-set-default-value.jpg" alt="" width="471" height="140" srcset="https://zappysys.com/blog/wp-content/uploads/2017/09/load-data-from-api-to-sql-server-using-ssis-dynamic-variable-url-link-address-set-default-value.jpg 471w, https://zappysys.com/blog/wp-content/uploads/2017/09/load-data-from-api-to-sql-server-using-ssis-dynamic-variable-url-link-address-set-default-value-300x89.jpg 300w" sizes="(max-width: 471px) 100vw, 471px" /></a></p>
<p>Don&#8217;t forget to set the default value, because it will be used to construct an URL in design time. A call to that URL will be made to figure out the columns.</p>
<h3>Make an HTTP address dynamic</h3>
<p><a href="//zappysys.com/blog/wp-content/uploads/2017/09/load-data-from-api-to-sql-server-using-ssis-dynamic-variable-url-link-address.jpg"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-1868" src="//zappysys.com/blog/wp-content/uploads/2017/09/load-data-from-api-to-sql-server-using-ssis-dynamic-variable-url-link-address.jpg" alt="" width="826" height="733" srcset="https://zappysys.com/blog/wp-content/uploads/2017/09/load-data-from-api-to-sql-server-using-ssis-dynamic-variable-url-link-address.jpg 826w, https://zappysys.com/blog/wp-content/uploads/2017/09/load-data-from-api-to-sql-server-using-ssis-dynamic-variable-url-link-address-300x266.jpg 300w, https://zappysys.com/blog/wp-content/uploads/2017/09/load-data-from-api-to-sql-server-using-ssis-dynamic-variable-url-link-address-768x682.jpg 768w" sizes="(max-width: 826px) 100vw, 826px" /></a></p>
<h3>Creating a Dynamic Request Body</h3>
<div>
To make a <strong>dynamic body</strong> in <strong>ZappySys</strong> (e.g., in an HTTP request or API call using the <strong>REST API Task</strong> or <strong>JSON Source</strong> or <strong>XML Source</strong>), you typically use <strong>placeholders or expressions</strong> in the request body.</p>
<p>Here’s how to create a <strong>dynamic body</strong>:</p>
<hr/>
<p><strong>Example: Dynamic JSON Body using Variables</strong></p><pre class="crayon-plain-tag">{
  &quot;name&quot;: &quot;{{User::MyVariable}},
  &quot;status&quot;: &quot;active&quot;
}</pre><p>
<blockquote><p>
<strong>{{User::MyVariable}}</strong> is a variable placeholder.
</p></blockquote>
</div>
<div id="attachment_11366" style="width: 528px" class="wp-caption alignnone"><a href="https://zappysys.com/blog/wp-content/uploads/2017/09/dynamic-body-using-variable.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-11366" src="https://zappysys.com/blog/wp-content/uploads/2017/09/dynamic-body-using-variable.png" alt="Dynamic Body " width="518" height="381" class="size-full wp-image-11366" srcset="https://zappysys.com/blog/wp-content/uploads/2017/09/dynamic-body-using-variable.png 518w, https://zappysys.com/blog/wp-content/uploads/2017/09/dynamic-body-using-variable-300x221.png 300w" sizes="(max-width: 518px) 100vw, 518px" /></a><p id="caption-attachment-11366" class="wp-caption-text">Dynamic Body</p></div>
<h3>That&#8217;s How You Make It Dynamic</h3>
<p>By combining <strong>placeholders</strong> and <strong>expressions</strong> in the URL and body fields, ZappySys lets you build fully dynamic API requests. Whether you’re passing parameters, looping through records, or injecting runtime values—this approach keeps your integration flexible, scalable, and efficient.</p>
<p>The post <a href="https://zappysys.com/blog/get-api-data-with-dynamic-url-and-load-into-sql-server/">How to make Path / URL dynamic in SSIS</a> appeared first on <a href="https://zappysys.com/blog">ZappySys Blog</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to register Facebook OAuth App for Graph API Access</title>
		<link>https://zappysys.com/blog/register-facebook-oauth-app-graph-api/</link>
		
		<dc:creator><![CDATA[ZappySys]]></dc:creator>
		<pubDate>Thu, 16 Jun 2016 18:27:52 +0000</pubDate>
				<category><![CDATA[REST API]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[facebook graph api]]></category>
		<category><![CDATA[json source]]></category>
		<category><![CDATA[oauth]]></category>
		<category><![CDATA[oauth2]]></category>
		<category><![CDATA[OAuthApp]]></category>
		<category><![CDATA[ssis]]></category>
		<guid isPermaLink="false">http://zappysys.com/blog/?p=584</guid>

					<description><![CDATA[<p>Introduction In this article, you will learn how to register Facebook OAuth App (Graph API) for data access using SSIS PowerPack REST API Connectors. Using SSIS PowerPack you can consume/manage Facebook data by calling Graph API. These connectors have drag and drop UI so you can do data integration without any coding (e.g. C#, Java, [&#8230;]</p>
<p>The post <a href="https://zappysys.com/blog/register-facebook-oauth-app-graph-api/">How to register Facebook OAuth App for Graph API Access</a> appeared first on <a href="https://zappysys.com/blog">ZappySys Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Introduction</h2>
<p>In this article, you will learn how to <strong>register Facebook OAuth App</strong> (<strong>Graph API</strong>) for data access using <a href="//zappysys.com/products/ssis-powerpack/" target="_blank" rel="noopener">SSIS PowerPack</a> REST API Connectors. Using SSIS PowerPack you can consume/manage Facebook data by calling Graph API. These connectors have drag and drop UI so you can do data integration without any coding (e.g. C#, Java, Python, Ruby).</p>
<p><a href="//zappysys.com/products/ssis-powerpack/ssis-json-file-source/" target="_blank" rel="noopener">JSON /REST Source Connector</a> and <a href="//zappysys.com/products/ssis-powerpack/ssis-rest-api-web-service-task/" target="_blank" rel="noopener">REST API Task</a> they both support a wide range of options for any type of REST API integration scenarios including Facebook REST API integration into your ETL Workflow. It also supports the use of OAuth 1.0 and 2.0 Protocols used by Twitter, Facebook, Google, LinkedIn, and many other popular Apis.</p>
<p><strong>Facebook Graph API</strong> can be used to read or manage Facebook data via REST API Calls. To access Graph API you will have to create OAuth App inside Facebook Developer Portal. Let&#8217;s take a look step by step.</p>
<h2>Step-By-Step: Create Facebook OAuth App (i.e Register OAuth App)</h2>
<ol>
<li>Go to www.facebook.com and log in with an account which you want to use to access Facebook data. You can access your own data using API without issue but if you have to access someone else data via App then it will require additional steps listed in this article in &#8220;Create Public Facebook OAuth App&#8221; section</li>
<li>Once you login to Facebook type <a href="https://developers.facebook.com/apps" target="_blank" rel="noopener">https://developers.facebook.com/apps</a> in the Address bar</li>
<li>Click on <strong>Create New App</strong>. If you never access developer portal then you may be prompted to Register as a developer.
<div id="attachment_6506" style="width: 730px" class="wp-caption aligncenter"><a href="//zappysys.com/blog/wp-content/uploads/2016/06/create-facebook-oauth-app-developer-graph-api-1.png" target="_blank" rel="noopener"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-6506" class="wp-image-6506 size-large" src="https://zappysys.com/blog/wp-content/uploads/2016/06/create-facebook-oauth-app-developer-graph-api-1-1-1024x655.png" alt="create-facebook-oauth-app-developer-graph-api-1" width="720" height="461" srcset="https://zappysys.com/blog/wp-content/uploads/2016/06/create-facebook-oauth-app-developer-graph-api-1-1-1024x655.png 1024w, https://zappysys.com/blog/wp-content/uploads/2016/06/create-facebook-oauth-app-developer-graph-api-1-1-300x192.png 300w, https://zappysys.com/blog/wp-content/uploads/2016/06/create-facebook-oauth-app-developer-graph-api-1-1-768x491.png 768w, https://zappysys.com/blog/wp-content/uploads/2016/06/create-facebook-oauth-app-developer-graph-api-1-1.png 1047w" sizes="(max-width: 720px) 100vw, 720px" /></a><p id="caption-attachment-6506" class="wp-caption-text">Create Facebook OAuth App for Graph API access (For SSIS PowerPack REST Connectors)</p></div></li>
<li>It creates the app by given name and asked you to choose some options like ads and FB login. Click on skip to skip that step.</li>
<li>Now go to basic settings and there you can change app name, contact email and select category (e.g. Business). There you can also found OAuth App ID and App Secret store it somewhere for the next phase.
<div id="attachment_6508" style="width: 730px" class="wp-caption aligncenter"><a href="//zappysys.com/blog/wp-content/uploads/2016/06/create-facebook-oauth-app-developer-graph-api-2.png" target="_blank" rel="noopener"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-6508" class="wp-image-6508 size-large" src="https://zappysys.com/blog/wp-content/uploads/2016/06/create-facebook-oauth-app-developer-graph-api-2-1-1024x719.png" alt="Register Facebook OAuth App for Custom Desktop Application (Basic Setup)" width="720" height="506" srcset="https://zappysys.com/blog/wp-content/uploads/2016/06/create-facebook-oauth-app-developer-graph-api-2-1-1024x719.png 1024w, https://zappysys.com/blog/wp-content/uploads/2016/06/create-facebook-oauth-app-developer-graph-api-2-1-300x211.png 300w, https://zappysys.com/blog/wp-content/uploads/2016/06/create-facebook-oauth-app-developer-graph-api-2-1-768x539.png 768w, https://zappysys.com/blog/wp-content/uploads/2016/06/create-facebook-oauth-app-developer-graph-api-2-1.png 1055w" sizes="(max-width: 720px) 100vw, 720px" /></a><p id="caption-attachment-6508" class="wp-caption-text">Register Facebook OAuth App for Custom Desktop Application (Basic Setup)</p></div></li>
<li>No Click on Add Products and add Facebook Login. Because our app is used for SSIS PowerPack which has custom login flow (using Embedded Browser). We have to Add Facebook Login support and check Embedded browser option (see below).
<div id="attachment_6509" style="width: 730px" class="wp-caption aligncenter"><a href="//zappysys.com/blog/wp-content/uploads/2016/06/facebook-desktop-native-oauth-app-add-login-embedded-browser-support.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-6509" class="wp-image-6509 size-large" src="https://zappysys.com/blog/wp-content/uploads/2016/06/facebook-desktop-native-oauth-app-add-login-embedded-browser-support-1-1024x625.png" alt="Adding Embedded browser support for Facebook OAuth Application" width="720" height="439" srcset="https://zappysys.com/blog/wp-content/uploads/2016/06/facebook-desktop-native-oauth-app-add-login-embedded-browser-support-1-1024x625.png 1024w, https://zappysys.com/blog/wp-content/uploads/2016/06/facebook-desktop-native-oauth-app-add-login-embedded-browser-support-1-300x183.png 300w, https://zappysys.com/blog/wp-content/uploads/2016/06/facebook-desktop-native-oauth-app-add-login-embedded-browser-support-1-768x468.png 768w, https://zappysys.com/blog/wp-content/uploads/2016/06/facebook-desktop-native-oauth-app-add-login-embedded-browser-support-1.png 1041w" sizes="(max-width: 720px) 100vw, 720px" /></a><p id="caption-attachment-6509" class="wp-caption-text">Adding Embedded browser support for Facebook OAuth Application</p></div></li>
<li>Now you ready to use your App to use OAuth App ID and App Secret.</li>
</ol>
<h2>Test Facebook OAuth App (Consume graph api in SSIS)</h2>
<p>If you using SSIS PowerPack to manage your Facebook data using Graph API then perform the following steps to test your connectivity.</p>
<ol>
<li>In the SSIS Designer in connection manager page .. right click and add ZS-OAUTH</li>
<li>Select Facebook provider, Configure App ID and OAuth App Secret</li>
<li>Select Permission (i.e. Scope) or type by hand (1 per each line)</li>
<li>Click generate Token. You will be redirected to login page and then it will show Authorize App confirmation. Click Accept.</li>
<li>Test Connection (If things go well it will show green success)
<div id="attachment_588" style="width: 610px" class="wp-caption alignnone"><a href="//zappysys.com/blog/wp-content/uploads/2016/06/ssis-facebook-test-oauth-connection-graph-api.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-588" class="wp-image-588" src="//zappysys.com/blog/wp-content/uploads/2016/06/ssis-facebook-test-oauth-connection-graph-api.png" alt="Testing Facebook OAuth Connectivity in SSIS (Use Graph API)" width="600" height="384" srcset="https://zappysys.com/blog/wp-content/uploads/2016/06/ssis-facebook-test-oauth-connection-graph-api.png 957w, https://zappysys.com/blog/wp-content/uploads/2016/06/ssis-facebook-test-oauth-connection-graph-api-300x192.png 300w" sizes="(max-width: 600px) 100vw, 600px" /></a><p id="caption-attachment-588" class="wp-caption-text">Testing Facebook OAuth Connectivity in SSIS (Use Graph API)</p></div></li>
</ol>
<h2>Fetch from Facebook Graph API (Load data into SQL Server)</h2>
<p>Below is sample screenshot how you can use JSON Source to pull data from Facebook REST API and load into SQL Server. <a href="//zappysys.com/blog/get-data-from-facebook-in-ssis-using-rest-api/" target="_blank" rel="noopener">Refer this article</a> for step-by-step information.</p>
<div id="attachment_587" style="width: 710px" class="wp-caption alignnone"><a href="//zappysys.com/blog/wp-content/uploads/2016/06/extract-data-from-facebook-graph-rest-api-use-oauth-load-sql-server.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-587" class="wp-image-587" src="//zappysys.com/blog/wp-content/uploads/2016/06/extract-data-from-facebook-graph-rest-api-use-oauth-load-sql-server.png" alt="Extract data from Facebook using Graph API (SSIS JSON/REST API Connector) - Load into SQL Server Table" width="700" height="508" srcset="https://zappysys.com/blog/wp-content/uploads/2016/06/extract-data-from-facebook-graph-rest-api-use-oauth-load-sql-server.png 889w, https://zappysys.com/blog/wp-content/uploads/2016/06/extract-data-from-facebook-graph-rest-api-use-oauth-load-sql-server-300x218.png 300w" sizes="(max-width: 700px) 100vw, 700px" /></a><p id="caption-attachment-587" class="wp-caption-text">Extract data from Facebook using Graph API (SSIS JSON/REST API Connector) &#8211; Load into SQL Server Table</p></div>
<p>The post <a href="https://zappysys.com/blog/register-facebook-oauth-app-graph-api/">How to register Facebook OAuth App for Graph API Access</a> appeared first on <a href="https://zappysys.com/blog">ZappySys Blog</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to register Google OAuth Application (Get ClientID and ClientSecret)</title>
		<link>https://zappysys.com/blog/register-google-oauth-application-get-clientid-clientsecret/</link>
		
		<dc:creator><![CDATA[ZappySys]]></dc:creator>
		<pubDate>Sat, 09 Apr 2016 21:25:18 +0000</pubDate>
				<category><![CDATA[Google API]]></category>
		<category><![CDATA[google api]]></category>
		<category><![CDATA[json source]]></category>
		<category><![CDATA[oauth]]></category>
		<category><![CDATA[oauth2]]></category>
		<category><![CDATA[OAuthApp]]></category>
		<category><![CDATA[rest api]]></category>
		<category><![CDATA[SSIS PowerPack]]></category>
		<category><![CDATA[xml source]]></category>
		<guid isPermaLink="false">http://zappysys.com/blog/?p=431</guid>

					<description><![CDATA[<p>Introduction In our previous article we understood little bit about OAuth 2.0 Protocol. We talked how to use Default App for ease of use. However In this post you will learn how to register Google OAuth Application so you can access various Google Services programmatically (e.g Youtube, Google Analytics, AdWords, DoubleClick etc.). Here is the [&#8230;]</p>
<p>The post <a href="https://zappysys.com/blog/register-google-oauth-application-get-clientid-clientsecret/">How to register Google OAuth Application (Get ClientID and ClientSecret)</a> appeared first on <a href="https://zappysys.com/blog">ZappySys Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Introduction</h2>
<p>In our previous article we understood little bit about <a href="https://zappysys.com/blog/rest-api-authentication-with-oauth-2-0-using-ssis/" target="_blank" rel="noopener">OAuth 2.0 Protocol</a>. We talked how to use Default App for ease of use. However In this post you will learn <strong>how to register Google OAuth Application</strong> so you can access various Google Services programmatically (e.g Youtube, Google Analytics, AdWords, DoubleClick etc.). Here is the link to find all services: <a href="https://developers.google.com/oauthplayground/" target="_blank" rel="noopener">Google API Services (Using OAuth 2.0)</a></p>
<p>Recently google started supporting <a href="https://developers.google.com/identity/protocols/OAuth2" target="_blank" rel="noopener">OAuth 2.0</a> Protocol. There are many articles written explaining OAuth 2.0 protocol so we are not going to cover that in this article.</p>
<p>Following SSIS Connectors support OAuth Connectivity. When you use below connectors no coding required to pull data from OAuth enabled services.</p>
<p><strong>SSIS Tasks / Components which Supports OAuth Connection / Google API</strong></p>
<div class="su-table su-table-alternate">
<table>
<tbody>
<tr>
<td width="36"><img decoding="async" src="//zappysys.com/onlinehelp/ssis-powerpack/scr/images/api-source/ssis-api-source.png" alt="Custom SSIS Tasks - API Source" width="32" /></td>
<td><a href="/products/ssis-powerpack/ssis-api-source/" target="_blank" rel="noopener">API Source</a></td>
</tr>
<tr>
<td width="36"><img decoding="async" src="//zappysys.com/onlinehelp/ssis-powerpack/scr/images/google-analytics-source/ssis-google-analytics-source.png" alt="Custom SSIS Tasks - Google Analytics Source" width="32" /></td>
<td><a href="//zappysys.com/products/ssis-powerpack/ssis-google-analytics-source-connector/" target="_blank" rel="noopener">Google Analytics Source</a></td>
</tr>
<tr>
<td width="36"><img decoding="async" src="//zappysys.com/images/ssis-powerpack/SSIS-Json-Source-Adapter.png" alt="Custom SSIS Components - JSON Source (File and REST API Connector)" width="32" /></td>
<td><a href="//zappysys.com/products/ssis-powerpack/ssis-json-file-source/" target="_blank" rel="noopener">JSON Source Connector (File, REST API)</a></td>
</tr>
<tr>
<td width="36"><img decoding="async" src="//zappysys.com/images/ssis-powerpack/ssis-rest-api-web-service-task.png" alt="Custom SSIS Tasks - Call REST API Webservice (GET, POST, DELETE etc)" width="32" /></td>
<td><a href="//zappysys.com/products/ssis-powerpack/ssis-rest-api-web-service-task/" target="_blank" rel="noopener">REST API Webservice Task</a></td>
</tr>
<tr>
<td width="36"><img decoding="async" src="//zappysys.com/images/ssis-powerpack/ssis-xml-source.png" alt="Custom SSIS Components - XML Source (File, REST, SOAP)" width="32" /></td>
<td><a href="//zappysys.com/products/ssis-powerpack/ssis-xml-source/" target="_blank" rel="noopener">XML Source (File, REST, SOAP)</a></td>
</tr>
<tr>
<td width="36"><img decoding="async" src="https://zappysys.com/onlinehelp/ssis-powerpack/scr/images/web-api-destination/ssis-web-api-destination.png" alt="SSIS Web API destination" width="32" /></td>
<td><a href="https://zappysys.com/products/ssis-powerpack/ssis-web-api-destination-connector/" target="_blank" rel="noopener">Web API Destination</a></td>
</tr>
</tbody>
</table>
</div>
<p><strong>ODBC Drivers which Supports OAuth Connection / Google API (Call in Power BI, Excel, Informatica, MS Access)</strong></p>
<div class="su-table su-table-alternate">
<table>
<tbody>
<tr>
<td width="36"><img decoding="async" src="https://zappysys.com/images/odbc-powerpack/odbc-api-driver.png" alt="API ODBC Driver" width="32" /></td>
<td><a href="https://zappysys.com/products/odbc-powerpack/odbc-api-driver/" target="_blank" rel="noopener">API ODBC Driver</a></td>
</tr>
<tr>
<td width="36"><img decoding="async" src="https://zappysys.com/images/odbc-powerpack/odbc-json-api-driver.png" alt="JSON ODBC Driver" width="32" /></td>
<td><a href="https://zappysys.com/products/odbc-powerpack/odbc-json-rest-api-driver/" target="_blank" rel="noopener">JSON ODBC Driver</a></td>
</tr>
<tr>
<td width="36"><img decoding="async" src="https://zappysys.com/images/odbc-powerpack/odbc-xml-api-driver.png" alt="XML ODBC Driver" width="32" /></td>
<td><a href="https://zappysys.com/products/odbc-powerpack/odbc-xml-soap-api-driver/" target="_blank" rel="noopener">XML ODBC Driver</a></td>
</tr>
<tr>
<td width="36"><img decoding="async" src="https://zappysys.com/images/odbc-powerpack/odbc-csv-api-driver.png" alt="CSV ODBC Driver" width="32" /></td>
<td><a href="https://zappysys.com/products/odbc-powerpack/odbc-csv-rest-api-driver/" target="_blank" rel="noopener">CSV ODBC Driver</a></td>
</tr>
</tbody>
</table>
</div>
<h2>Create Google Project</h2>
<p>Registering OAuth App in Google first requires you to create API Project. API Project is a container which can host many OAuth Apps or other API Keys.</p>
<ol>
<li>To create API Project Visit <a href="https://console.developers.google.com/project" target="_blank" rel="noopener">https://console.developers.google.com/project</a><br />
If you already have existing API Project then once you click above link you can pick desired API Project from dropdown (Found in the top bar). If you using existing API Project then you may skip next few steps and directly move to step which explains [how to create OAuth ClientId].</li>
<li>To create new project Click on <strong>&#8220;Create Project&#8221;</strong> button. Once you click Create it will take few seconds to create project for you.
<div id="attachment_434" style="width: 394px" class="wp-caption alignnone"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/google-api-create-new-project-for-oauth-app.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-434" class="size-full wp-image-434" src="https://zappysys.com/blog/wp-content/uploads/2016/04/google-api-create-new-project-for-oauth-app.png" alt="Create New Google API Project (Google API - Register new OAuth App)" width="384" height="260" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/google-api-create-new-project-for-oauth-app.png 384w, https://zappysys.com/blog/wp-content/uploads/2016/04/google-api-create-new-project-for-oauth-app-300x203.png 300w" sizes="(max-width: 384px) 100vw, 384px" /></a><p id="caption-attachment-434" class="wp-caption-text">Create New Google API Project (Google API &#8211; Register new OAuth App)</p></div></li>
<li>Now give some friendly name and change default Project ID (optional) for your project and click Create (See below).<br />
<strong><br />
NOTE:</strong> Before you click create you can <strong>change default Project ID</strong> suggested by Google by clicking <strong>Edit</strong>. This Project ID is used everywhere when calling many APIs <a href="https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs/query" target="_blank" rel="noopener">like this one</a> so copy this ID somewhere (You can also see this on project screen so dont worry if you miss it).Project ID is unique across google system so you may not get your preferred ID but if you can get one then its easy to remember for sure.</p>
<div id="attachment_441" style="width: 385px" class="wp-caption alignnone"><a href="//zappysys.com/blog/wp-content/uploads/2016/04/google-api-create-new-project-for-oauth-app-2.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-441" class="size-full wp-image-441" src="//zappysys.com/blog/wp-content/uploads/2016/04/google-api-create-new-project-for-oauth-app-2.png" alt="Create new Google Api Project for OAuth App (Set project name)" width="375" height="271" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/google-api-create-new-project-for-oauth-app-2.png 375w, https://zappysys.com/blog/wp-content/uploads/2016/04/google-api-create-new-project-for-oauth-app-2-300x217.png 300w" sizes="(max-width: 375px) 100vw, 375px" /></a><p id="caption-attachment-441" class="wp-caption-text">Create new Google Api Project for OAuth App (Set project name / edit default project ID)</p></div></li>
</ol>
<h2>Enable Google API for Integration</h2>
<p>Once your Project is created, next step is enable APIs you like to call. By default most Google APIs are disabled so make sure you enable each APi category manually using below steps.</p>
<ol>
<li>Once project is created it will redirect you to the API Home page where you will see many common Google API you can use.If you do not see that you can always click below option to enable API manually.Visit : <a href="https://console.cloud.google.com/apis/library" target="_blank" rel="noopener">https://console.cloud.google.com/apis/library</a>
<div id="attachment_8446" style="width: 722px" class="wp-caption alignnone"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/enable-google-api-services.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-8446" class="size-full wp-image-8446" src="https://zappysys.com/blog/wp-content/uploads/2016/04/enable-google-api-services.png" alt="Enable Google APIs / Services" width="712" height="418" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/enable-google-api-services.png 712w, https://zappysys.com/blog/wp-content/uploads/2016/04/enable-google-api-services-300x176.png 300w" sizes="(max-width: 712px) 100vw, 712px" /></a><p id="caption-attachment-8446" class="wp-caption-text">Enable Google APIs / Services</p></div></li>
<li>By default API you like to call might not be enabled. Search for API you wish to enable, click on the API name and <strong>click Enable</strong>.<span style="text-decoration: underline;">Some common Google API Examples:</span>
<ol>
<li>To enable <strong>Google YouTube API</strong><br />
&gt; search for &#8220;<a href="https://console.cloud.google.com/apis/library?q=youtube" target="_blank" rel="noopener">YouTube</a>&#8220;. It has few APIs so pick the one you need under this,<br />
&gt; For example To manage/view channel use Data API, for Reporting use Analytics API)</li>
<li>To enable <strong>Google Drive API</strong><br />
search for &#8220;<a href="https://console.cloud.google.com/apis/library?q=drive" target="_blank" rel="noopener">Drive</a>&#8221; and click Enable</li>
<li>To enable <strong>Google Sheets API</strong><br />
search for &#8220;<a href="https://console.cloud.google.com/apis/library?q=sheet" target="_blank" rel="noopener">Sheet</a>&#8221; (Some Sheets API operations need Drive API too see enable that as well)</li>
<li>To enable <strong>Google BigQuery API</strong><br />
&gt; search for &#8220;<a href="https://console.cloud.google.com/apis/library?q=bigquery" target="_blank" rel="noopener">BigQuery</a><strong>&#8220;</strong></li>
<li>To enable <strong>Google Analytics (GA3)</strong><br />
&gt; search <strong>&#8220;</strong><a href="https://console.cloud.google.com/apis/library?q=analytics" target="_blank" rel="noopener">Analytics</a><strong>&#8220;</strong> and enable <em>Google Analytics API</em></li>
<li>To enable <strong>Google Analytics (GA4)</strong><br />
&gt; search for <em>Google Analytics Data API</em> and click Enable, Search for <em>Google Analytics Admin API</em> and click enable (needed this to query available properties)</p>
<div id="attachment_440" style="width: 481px" class="wp-caption alignnone"><a href="//zappysys.com/blog/wp-content/uploads/2016/04/google-api-project-enable-api-screen.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-440" class="size-full wp-image-440" src="//zappysys.com/blog/wp-content/uploads/2016/04/google-api-project-enable-api-screen.png" alt="Enable Google API for OAuth Application Access (register Google OAuth Application)" width="471" height="356" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/google-api-project-enable-api-screen.png 471w, https://zappysys.com/blog/wp-content/uploads/2016/04/google-api-project-enable-api-screen-300x227.png 300w" sizes="(max-width: 471px) 100vw, 471px" /></a><p id="caption-attachment-440" class="wp-caption-text">Search Google API for OAuth Application Access</p></div>
<p>&nbsp;</p>
<div id="attachment_439" style="width: 444px" class="wp-caption alignnone"><a href="//zappysys.com/blog/wp-content/uploads/2016/04/google-api-project-enable-api-screen-2.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-439" class="size-full wp-image-439" src="//zappysys.com/blog/wp-content/uploads/2016/04/google-api-project-enable-api-screen-2.png" alt="Enable Google API for OAuth Application Access (register Google OAuth Application)" width="434" height="193" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/google-api-project-enable-api-screen-2.png 434w, https://zappysys.com/blog/wp-content/uploads/2016/04/google-api-project-enable-api-screen-2-300x133.png 300w" sizes="(max-width: 434px) 100vw, 434px" /></a><p id="caption-attachment-439" class="wp-caption-text">Enable Google API for OAuth Application Access</p></div>
<p>&nbsp;</li>
</ol>
</li>
</ol>
<h2>Create OAuth Credentials (Client ID / Secret)</h2>
<p>Once we create project and enable APIs our next step is to obtain OAuth ClientID / Secret. Before you can obtain that you have to configure few properties of your OAuth Consent Screen. Most fields are optional on this screen but fill out them if you plan to publish this API App for other users (i.e. Public App).</p>
<ol>
<li>Now click on the credentials tab and click &#8220;OAuth consent screen&#8221;. Fill out necessary information which will be visible to the user (such as App Name). Once you are done, continue on with credentials creation:<img loading="lazy" decoding="async" class="wp-image-9916 size-full" src="https://zappysys.com/blog/wp-content/uploads/2016/04/google-configure-api-oauth-consent-screen.png" alt="" width="806" height="906" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/google-configure-api-oauth-consent-screen.png 806w, https://zappysys.com/blog/wp-content/uploads/2016/04/google-configure-api-oauth-consent-screen-267x300.png 267w, https://zappysys.com/blog/wp-content/uploads/2016/04/google-configure-api-oauth-consent-screen-768x863.png 768w" sizes="(max-width: 806px) 100vw, 806px" />Google OAuth API &#8211; Create OAuth App &#8211; Set Application Name on Consent Screen</li>
<li>Click on [Create credentials] button and select OAuth Client Id option.
<div id="attachment_438" style="width: 855px" class="wp-caption alignnone"><a href="//zappysys.com/blog/wp-content/uploads/2016/04/google-api-create-oauth-credentials.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-438" class="wp-image-438 size-full" src="//zappysys.com/blog/wp-content/uploads/2016/04/google-api-create-oauth-credentials.png" alt="Create OAuth Client ID Credentials for Google API access" width="845" height="519" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/google-api-create-oauth-credentials.png 845w, https://zappysys.com/blog/wp-content/uploads/2016/04/google-api-create-oauth-credentials-300x184.png 300w" sizes="(max-width: 845px) 100vw, 845px" /></a><p id="caption-attachment-438" class="wp-caption-text">Create OAuth Client ID Credentials for Google API access</p></div></li>
<li>Next you will be asked to select Application Type. Pick &#8220;<strong>Desktop app</strong>&#8221; if your Application is Desktop style application. If your app is web site or running browser then pick Web Application. Click on Create and you will see your ClientID and ClientSecret which you can use during OAuth Authentication. <strong>Keep these both information secret</strong>. This is used to call OAuth Approval Screen by your Desktop App or Web App&#8230; and then user can obtain Token which can be used to call desired Google API.<div class="su-note"  style="border-color:#e5de9d;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;"><div class="su-note-inner su-u-clearfix su-u-trim" style="background-color:#FFF8B7;border-color:#ffffff;color:#333333;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;">NOTE: Make sure you do not choose Web App and only select Desktop App. Desktop App doesnt have Redirect URL making it simple to setup and use with ZappySys software.</div></div>
<div id="attachment_9229" style="width: 732px" class="wp-caption alignnone"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/create-google-oauth-credentials-new-desktop-application.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-9229" class="size-full wp-image-9229" src="https://zappysys.com/blog/wp-content/uploads/2016/04/create-google-oauth-credentials-new-desktop-application.png" alt="Create Google OAuth 2.0 Credentials - Desktop App" width="722" height="445" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/create-google-oauth-credentials-new-desktop-application.png 722w, https://zappysys.com/blog/wp-content/uploads/2016/04/create-google-oauth-credentials-new-desktop-application-300x185.png 300w" sizes="(max-width: 722px) 100vw, 722px" /></a><p id="caption-attachment-9229" class="wp-caption-text">Create Google OAuth 2.0 Credentials &#8211; Desktop App</p></div>
<div id="attachment_444" style="width: 617px" class="wp-caption alignnone"><a href="//zappysys.com/blog/wp-content/uploads/2016/04/api-client-generate-google-oauth-app-clientid-client-secret.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-444" class="size-full wp-image-444" src="//zappysys.com/blog/wp-content/uploads/2016/04/api-client-generate-google-oauth-app-clientid-client-secret.png" alt="Generate ClientID and Client Secret for Google OAuth Application (register Google OAuth Application)" width="607" height="402" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/api-client-generate-google-oauth-app-clientid-client-secret.png 607w, https://zappysys.com/blog/wp-content/uploads/2016/04/api-client-generate-google-oauth-app-clientid-client-secret-300x199.png 300w" sizes="(max-width: 607px) 100vw, 607px" /></a><p id="caption-attachment-444" class="wp-caption-text">Generate ClientID and Client Secret for Google OAuth Application</p></div></li>
</ol>
<h2>Publish App</h2>
<p>The last step in App creation is to go to the OAuth Consent Screen tab. Under Publishing Status, click PUBLISH APP to ensure your refresh token doesn&#8217;t expire often. If you plan to use the App for Private use, you do not have to worry about the Verification Status after Publishing (Which is the case for most users who access their own data).</p>
<div id="attachment_11084" style="width: 606px" class="wp-caption alignnone"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/google-publish-oauth-app-refresh-token-expires-every-7-days.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-11084" class="size-full wp-image-11084" src="https://zappysys.com/blog/wp-content/uploads/2016/04/google-publish-oauth-app-refresh-token-expires-every-7-days.png" alt="Publish Google App (This avoids Refresh Token Expiration every 7 days)" width="596" height="562" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/google-publish-oauth-app-refresh-token-expires-every-7-days.png 596w, https://zappysys.com/blog/wp-content/uploads/2016/04/google-publish-oauth-app-refresh-token-expires-every-7-days-300x283.png 300w" sizes="(max-width: 596px) 100vw, 596px" /></a><p id="caption-attachment-11084" class="wp-caption-text">Publish Google App (This avoids Refresh Token Expiration every 7 days)</p></div>
<h2>Using Client ID and Client Secret in ZappySys OAuth Connection</h2>
<p>You can use generated ClientID and ClientSecret to initiate OAuth Authorization process. We are not going to cover how that works, but below is a simple screenshot of how these two pieces of information are used to call the Consent screen with some desired permission requested by calling Application:</p>
<p>ZappySys OAuth Connection can be used by many components suggested in the beginning of this article. So refer them for more information.</p>
<div id="attachment_6855" style="width: 930px" class="wp-caption alignnone"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/ssis-oauth-connection-manager-generate-access-token.png" target="_blank" rel="noopener"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-6855" class="wp-image-6855 size-full" src="https://zappysys.com/blog/wp-content/uploads/2016/04/ssis-oauth-connection-manager-generate-access-token.png" alt="" width="920" height="1032" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/ssis-oauth-connection-manager-generate-access-token.png 920w, https://zappysys.com/blog/wp-content/uploads/2016/04/ssis-oauth-connection-manager-generate-access-token-267x300.png 267w, https://zappysys.com/blog/wp-content/uploads/2016/04/ssis-oauth-connection-manager-generate-access-token-768x861.png 768w, https://zappysys.com/blog/wp-content/uploads/2016/04/ssis-oauth-connection-manager-generate-access-token-913x1024.png 913w" sizes="(max-width: 920px) 100vw, 920px" /></a><p id="caption-attachment-6855" class="wp-caption-text">Google OAuth Application: Generating Access and Refresh tokens using SSIS and OAuth Connection Manager.</p></div>
<h2>Using System Default Browser to get the token</h2>
<p>If embedded browser has some issue to extract your token then you can close the window by pressing <strong>[X]</strong> in the title bar. Once you do that you will be prompted to use System Default browser to finish the token extraction. If you click Yes then Full browser will be launched.</p>
<p><strong>NOTE:</strong> Below feature is added in version published after Dec 31, 2019 (v3.0.0.11231 or later) so make sure you have latest version.</p>
<div id="attachment_8782" style="width: 570px" class="wp-caption alignnone"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/use-system-browser-flow.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-8782" class="size-full wp-image-8782" src="https://zappysys.com/blog/wp-content/uploads/2016/04/use-system-browser-flow.png" alt="Using System Default Browser to extract OAuth Token" width="560" height="287" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/use-system-browser-flow.png 560w, https://zappysys.com/blog/wp-content/uploads/2016/04/use-system-browser-flow-300x154.png 300w" sizes="(max-width: 560px) 100vw, 560px" /></a><p id="caption-attachment-8782" class="wp-caption-text">Using System Default Browser to extract OAuth Token</p></div>
<h3>Untrusted App Warning</h3>
<p>Sometimes Google might show you below warning. In order to continue the flow you might have to Click on <strong>Advanced</strong> and then click <strong>Go to YourAppName (unsafe)</strong> like below</p>
<p>&nbsp;</p>
<div id="attachment_8779" style="width: 658px" class="wp-caption alignnone"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/google-oauth-app-not-trusted.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-8779" class="size-full wp-image-8779" src="https://zappysys.com/blog/wp-content/uploads/2016/04/google-oauth-app-not-trusted.png" alt="How to ignore Google Unsafe App Warning (OAuth Flow)" width="648" height="455" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/google-oauth-app-not-trusted.png 648w, https://zappysys.com/blog/wp-content/uploads/2016/04/google-oauth-app-not-trusted-300x211.png 300w" sizes="(max-width: 648px) 100vw, 648px" /></a><p id="caption-attachment-8779" class="wp-caption-text">How to ignore Google Unsafe App Warning (OAuth Flow)</p></div>
<p>&nbsp;</p>
<p><strong>OR, in some cases, you may see modern UI like below. In either case, <span style="text-decoration: underline;">choose continue</span>.</strong></p>
<p>&nbsp;</p>
<div id="attachment_11087" style="width: 524px" class="wp-caption alignnone"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/google-app-not-verfied-new.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-11087" class="size-full wp-image-11087" src="https://zappysys.com/blog/wp-content/uploads/2016/04/google-app-not-verfied-new.png" alt="Google App not Verified Warning (New UI)" width="514" height="397" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/google-app-not-verfied-new.png 514w, https://zappysys.com/blog/wp-content/uploads/2016/04/google-app-not-verfied-new-300x232.png 300w" sizes="(max-width: 514px) 100vw, 514px" /></a><p id="caption-attachment-11087" class="wp-caption-text">Google App not Verified Warning (New UI)</p></div>
<p>&nbsp;</p>
<h3>Select the account</h3>
<div id="attachment_8780" style="width: 939px" class="wp-caption alignnone"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/use-system-browser-for-oauth-token-extract.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-8780" class="size-full wp-image-8780" src="https://zappysys.com/blog/wp-content/uploads/2016/04/use-system-browser-for-oauth-token-extract.png" alt="Using System Browser" width="929" height="699" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/use-system-browser-for-oauth-token-extract.png 929w, https://zappysys.com/blog/wp-content/uploads/2016/04/use-system-browser-for-oauth-token-extract-300x226.png 300w, https://zappysys.com/blog/wp-content/uploads/2016/04/use-system-browser-for-oauth-token-extract-768x578.png 768w" sizes="(max-width: 929px) 100vw, 929px" /></a><p id="caption-attachment-8780" class="wp-caption-text">Using System Browser</p></div>
<h3>Copy code and finish the flow</h3>
<div id="attachment_8786" style="width: 1135px" class="wp-caption alignnone"><a href="https://zappysys.com/blog/wp-content/uploads/2017/06/manually-extract-oauth-token-use-full-browser.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-8786" class="size-full wp-image-8786" src="https://zappysys.com/blog/wp-content/uploads/2017/06/manually-extract-oauth-token-use-full-browser.png" alt="Manually Copy Code and Get OAuth Refresh / Access Token" width="1125" height="672" srcset="https://zappysys.com/blog/wp-content/uploads/2017/06/manually-extract-oauth-token-use-full-browser.png 1125w, https://zappysys.com/blog/wp-content/uploads/2017/06/manually-extract-oauth-token-use-full-browser-300x179.png 300w, https://zappysys.com/blog/wp-content/uploads/2017/06/manually-extract-oauth-token-use-full-browser-768x459.png 768w, https://zappysys.com/blog/wp-content/uploads/2017/06/manually-extract-oauth-token-use-full-browser-1024x612.png 1024w" sizes="(max-width: 1125px) 100vw, 1125px" /></a><p id="caption-attachment-8786" class="wp-caption-text">Manually Copy Code and Get OAuth Refresh / Access Token</p></div>
<p>&nbsp;</p>
<h2>Why I didn&#8217;t get refresh token back?</h2>
<p>For some reason if you just see Access token and not refresh token then try following</p>
<ol>
<li>Logout current session in browser and close all browser windows and try again</li>
<li>If you use <strong>Custom</strong> Provider rather than Google on OAuth connection then change Auth URL to include prompt and access_type like below<br />
<pre class="crayon-plain-tag">https://accounts.google.com/o/oauth2/auth?access_type=offline&amp;prompt=consent</pre>
</li>
</ol>
<h2>What to do if Google Refresh Token expires every 7 days</h2>
<p>Technically, once you have a refresh token, you should not worry about renewing as long as the API call is made atleast once every few months (max 6 months idle time). However, in some cases, your refresh token can expire sooner, and you have to click Generate Token manually</p>
<p>One main reason that is not well documented is if the Google Oauth Private App you created to access your own data is still in &#8220;<strong>testing</strong>&#8221; mode and not &#8220;<strong>published</strong>,&#8221; then as per Google, <a href="https://developers.google.com/google-ads/api/docs/get-started/common-errors">you may get this error</a>. Perform these steps to publish your app, which is in testing mode, so you do not have to renew the refresh token every 7 days.</p>
<ol>
<li>Go to your Project in Google API console<br />
Generally here</li>
<li>No API call has been made using the generated refresh_token for six months or longer<br />
<strong>SOLUTION: </strong> Make at least some API in six months to keep refresh_token active</li>
<li>Your OAuth App is in &#8220;testing&#8221; status and not published yet<br />
<strong>SOLUTION:</strong> Just click the <strong>Publish</strong> button on your App OAuth Consent screen. Do not worry about getting verified if you plan to use it for internal use; after this step, your refresh_token may not expire every 7 days <a href="https://stackoverflow.com/questions/8953983/do-google-refresh-tokens-expire" target="_blank" rel="noopener">See this thread</a>.<strong>DO NOT WORRY ABOUT GETTING VERIFIED</strong> &#8211; Just publish it to avoid refresh token expiration every 7 days.</p>
<div id="attachment_11084" style="width: 606px" class="wp-caption alignnone"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/google-publish-oauth-app-refresh-token-expires-every-7-days.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-11084" class="size-full wp-image-11084" src="https://zappysys.com/blog/wp-content/uploads/2016/04/google-publish-oauth-app-refresh-token-expires-every-7-days.png" alt="Publish Google App (This avoids Refresh Token Expiration every 7 days) " width="596" height="562" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/google-publish-oauth-app-refresh-token-expires-every-7-days.png 596w, https://zappysys.com/blog/wp-content/uploads/2016/04/google-publish-oauth-app-refresh-token-expires-every-7-days-300x283.png 300w" sizes="(max-width: 596px) 100vw, 596px" /></a><p id="caption-attachment-11084" class="wp-caption-text">Publish Google App (This avoids Refresh Token Expiration every 7 days)</p></div></li>
</ol>
<p>&nbsp;</p>
<h2>What is Google OAuth AccessToken</h2>
<p><strong>AccessToken</strong> is short lived token which you can pass along with each API Service call. once this token is expired you can get new <strong>AccessToken</strong> as long as you have obtained and saved <strong>RefreshToken</strong> (Returned to caller after very first time user go through Approval process on Consent screen). If you are using <a href="https://zappysys.com/onlinehelp/ssis-powerpack/scr/ssis-oauth-connection-manager.htm" target="_blank" rel="noopener">ZappySys OAuth connection manager</a></p>
<h2>What is Google OAuth RefreshToken</h2>
<p>May OAuth services support short lived token which expires after few minutes or hours. Google API by default expires token after 3600 seconds &#8230; So how to get new token ? Do you always go through that annoying Consent screen&#8230; what if your application is Automated Service? Well OAuth has solution for that too&#8230; its called RefreshToken.</p>
<p>First time to setup OAuth connection user have to go through Approval screen  (i.e. Consent screen) once they click Approve button they may receive two types of token (AccessToken and RefreshToken).  RefreshToken is used only when you need to get new AccessToken without going through Consent screen. So technically if OAuth supports RefreshToken (This is optional) then you can Save this piece of information in database somewhere and when you get token_expired error or you detect expiration time you can get new AccessToken without involving user consent (because you already did once).</p>
<h2>Conclusion</h2>
<p>Hope this article helped you to understand how to <strong>register Google OAuth Application</strong>. Download <a href="//zappysys.com/products/ssis-powerpack/">SSIS PowerPack</a> to try various <strong>OAuth data integration scenarios</strong> using drag and drop high performance connectors. With <a href="//zappysys.com/products/ssis-powerpack/ssis-json-file-source/">SSIS PowerPack OAuth support</a> you can virtually pull data from any API service (<a href="//zappysys.com/products/ssis-powerpack/ssis-xml-source/">XML REST API</a> or <a href="//zappysys.com/products/ssis-powerpack/ssis-json-file-source/">JSON REST API</a>). Such as Facbook, Twitter, SurveyMonkey, LinkedIn and many more.</p>
<p>The post <a href="https://zappysys.com/blog/register-google-oauth-application-get-clientid-clientsecret/">How to register Google OAuth Application (Get ClientID and ClientSecret)</a> appeared first on <a href="https://zappysys.com/blog">ZappySys Blog</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to do REST API Pagination in SSIS / ODBC Drivers</title>
		<link>https://zappysys.com/blog/ssis-rest-api-looping-until-no-more-pages-found/</link>
					<comments>https://zappysys.com/blog/ssis-rest-api-looping-until-no-more-pages-found/#comments</comments>
		
		<dc:creator><![CDATA[ZappySys]]></dc:creator>
		<pubDate>Fri, 08 Apr 2016 15:37:55 +0000</pubDate>
				<category><![CDATA[SSIS Components]]></category>
		<category><![CDATA[SSIS JSON Source (File/REST)]]></category>
		<category><![CDATA[SSIS PowerPack]]></category>
		<category><![CDATA[SSIS XML Source (File / SOAP)]]></category>
		<category><![CDATA[api pagination]]></category>
		<category><![CDATA[json source]]></category>
		<category><![CDATA[looping]]></category>
		<category><![CDATA[pagination]]></category>
		<category><![CDATA[paging]]></category>
		<category><![CDATA[regex]]></category>
		<category><![CDATA[rest api]]></category>
		<category><![CDATA[ssis]]></category>
		<category><![CDATA[xml source]]></category>
		<guid isPermaLink="false">http://zappysys.com/blog/?p=422</guid>

					<description><![CDATA[<p>Introduction In our previous blog, we saw how to call REST in SSIS including concepts of Authentication / Error Handling. Now in this post, we will cover API Pagination. You will learn concepts and patterns about REST API Pagination (for JSON / XML / SOAP or CSV API). We will describe methods and steps to implement REST API [&#8230;]</p>
<p>The post <a href="https://zappysys.com/blog/ssis-rest-api-looping-until-no-more-pages-found/">How to do REST API Pagination in SSIS / ODBC Drivers</a> appeared first on <a href="https://zappysys.com/blog">ZappySys Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Introduction</h2>
<p>In our previous blog, we saw <a href="https://zappysys.com/blog/call-rest-api-using-ssis-web-service-task/">how to call REST in SSIS</a> including concepts of Authentication / Error Handling. Now in this post, <strong>we will cover API Pagination.</strong> You will learn concepts and patterns about REST API Pagination (for JSON / XML / SOAP or CSV API).</p>
<p>We will describe methods and steps to implement REST API Pagination in SSIS PowerPack or  <a href="https://zappysys.com/products/odbc-powerpack/">ODBC PowerPack API Drivers (for apps like Excel, Power BI, Informatica&#8230;)</a> without coding. Both Products share a similar user interface with minor differences. For example purpose, we will show screenshots from SSIS PowerPack UI but concepts should remain same. You will also learn some techniques about <strong>how to implement an infinite loop in SSIS</strong>. Sometimes your REST API requires you to loop through all pages until no more data found then you can use pattern described in this article (sample package attached at the end).</p>
<p>In this article, we will use <a href="https://zappysys.com/products/ssis-powerpack/ssis-rest-api-web-service-task/">SSIS REST API Task</a> and <a href="//zappysys.com/products/ssis-powerpack/ssis-json-file-source/">JSON Source Connector</a> to process data from RESTful web service. If you have to process XML (or SOAP) data from REST API then simply use <a href="//zappysys.com/products/ssis-powerpack/ssis-xml-source/">XML Source Connector for REST API, SOAP or File</a> rather than JSON Source.</p>
<h2>Debugging REST API Requests</h2>
<p>Before we look at various aspects of REST API Pagination, we highly recommend you install FREE Web Debugging Tool Fiddler. <a href="https://zappysys.com/blog/how-to-use-fiddler-to-analyze-http-web-requests/" target="_blank" rel="noopener">Look at this article</a> to understand how to debug REST API requests.</p>
<h2>Method-1: REST API Pagination via URL Parameter</h2>
<p>If you have paging requirement by specifying page number in URL then you can loop until no more pages found. Your REST API can indicate no more page found by any of the following ways.</p>
<p><strong>Example URL: </strong> http://myserver.com/v1/api/getcustomers/?<strong>page=1</strong></p>
<p>If no more data found for specified page number then</p>
<ol>
<li>server may return an empty response</li>
<li>server may return the response with specific error and response status code</li>
</ol>
<p><a href="//zappysys.com/products/ssis-powerpack/ssis-json-file-source/">JSON Source Connector</a> comes with flexible paging options to handle this scenario. See below screenshot how to configure this.</p>
<div id="attachment_10740" style="width: 777px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-1-JSON-source-Pagination-URL-parameter-mode.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-10740" class="size-full wp-image-10740" src="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-1-JSON-source-Pagination-URL-parameter-mode.png" alt="Pagination Method 1 URL parameter mode" width="767" height="730" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-1-JSON-source-Pagination-URL-parameter-mode.png 767w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-1-JSON-source-Pagination-URL-parameter-mode-300x286.png 300w" sizes="(max-width: 767px) 100vw, 767px" /></a><p id="caption-attachment-10740" class="wp-caption-text">REST API Looping/Pagination via URL Page Number Parameter (Loop until last page detected)</p></div>
<p><strong>URL with offset and limit</strong></p>
<p>Sometimes you may have URLs with offset + limit parameters. as below. In this case, you can use the same technique as the above screenshot but just specify Page Num Indicator as <strong>offset</strong> and Increment by the same as your limit parameter (e.g. 1000 in this case). At runtime, your offset parameter will increment and generate URLs like below to fetch the next page.</p>
<div class="su-note"  style="border-color:#e5de9d;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;"><div class="su-note-inner su-u-clearfix su-u-trim" style="background-color:#fff8b7;border-color:#ffffff;color:#333333;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;">If you don&#8217;t specify the offset parameter in the initial URL then <strong>offset=1</strong> will be assumed as the default start. If your offset starts at 0 then refer to the next section for a workaround (i.e. Use URL Path Mode with StartAt variable = 0). Also if your increment for offset is other than the default page size then you must include the limit / pagesize parameter in the URL as below (e.g. limit=100 which is rows per page)</div></div>
<p><strong>Example URLs: </strong><br />
http://myserver.com/v1/api/getcustomers/?offset<strong>=1</strong>&amp;limit=1000<br />
http://myserver.com/v1/api/getcustomers/?offset=<strong>1001</strong>&amp;limit=1000<br />
http://myserver.com/v1/api/getcustomers/?offset=<strong>2001</strong>&amp;limit=1000</p>
<h2>Method-2: REST API Pagination via URL Path</h2>
<p>Sometimes your URL may contain a page or other identifier using path format.</p>
<p><strong>Example URLs: </strong><br />
http://myserver.com/v1/api/getcustomers/<strong>1/</strong><br />
http://myserver.com/v1/api/getcustomers/<strong>2</strong>/<br />
http://myserver.com/data/file<strong>1</strong>.json<br />
http://myserver.com/data/file<strong>2</strong>.json</p>
<p>If no more data is found for the specified page number then</p>
<ol>
<li>the server may return a 404 error (page not found)</li>
<li>server may return a response with a specific error and response status code</li>
</ol>
<p><a href="//zappysys.com/products/ssis-powerpack/ssis-json-file-source/">JSON Source Connector</a> comes with flexible paging options to handle this scenario. See the below screenshot of how to configure this.</p>
<div id="attachment_10741" style="width: 785px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-2-JSON-source-Pagination-URL-path-mode-Page-number-offset-passed-as-URL-path.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-10741" class="size-full wp-image-10741" src="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-2-JSON-source-Pagination-URL-path-mode-Page-number-offset-passed-as-URL-path.png" alt="Pagination Method 2 " width="775" height="479" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-2-JSON-source-Pagination-URL-path-mode-Page-number-offset-passed-as-URL-path.png 775w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-2-JSON-source-Pagination-URL-path-mode-Page-number-offset-passed-as-URL-path-300x185.png 300w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-2-JSON-source-Pagination-URL-path-mode-Page-number-offset-passed-as-URL-path-768x475.png 768w" sizes="(max-width: 775px) 100vw, 775px" /></a><p id="caption-attachment-10741" class="wp-caption-text">REST API Looping/Pagination via URL Path (Loop until last page detected)</p></div>
<h3>URL with Skip Parameter (Offset starts at zero)</h3>
<p>Now let&#8217;s look at another common pattern just like the offset we discussed earlier but in the Skip pattern, it starts at zero rather than offset=1. In the previous mode, we didn&#8217;t have the option to supply the initial value to start the counter but if you use Path mode then you can start the counter at some custom value. See the below screen to show how we can setup pagination with the skip method with custom increment.</p>
<div class="su-note"  style="border-color:#e5de9d;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;"><div class="su-note-inner su-u-clearfix su-u-trim" style="background-color:#fff8b7;border-color:#ffffff;color:#333333;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;">If your increment for offset is other than the default page size then you must include page size parameter in the URL as below (e.g. pagesize=100 which is rows per page. Some APIs name this parameter in different way e.g. count=1000 or limit=100. Refer to the API documentation to know exact names)</div></div>
<p><strong>Example URLs</strong></p><pre class="crayon-plain-tag">http://mysite.com/api/getorders?skip=0&amp;pagesize=100
http://mysite.com/api/getorders?skip=100&amp;pagesize=100
http://mysite.com/api/getorders?skip=200&amp;pagesize=100
http://mysite.com/api/getorders?skip=300&amp;pagesize=100
....</pre><p>
<div id="attachment_10742" style="width: 1098px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-2-Pagination-URL-with-Skip-Parameter.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-10742" class="size-full wp-image-10742" src="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-2-Pagination-URL-with-Skip-Parameter.png" alt="Pagination method 2 URL with Skip Parameter" width="1088" height="481" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-2-Pagination-URL-with-Skip-Parameter.png 1088w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-2-Pagination-URL-with-Skip-Parameter-300x133.png 300w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-2-Pagination-URL-with-Skip-Parameter-768x340.png 768w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-2-Pagination-URL-with-Skip-Parameter-1024x453.png 1024w" sizes="(max-width: 1088px) 100vw, 1088px" /></a><p id="caption-attachment-10742" class="wp-caption-text">REST API Pagination with Custom Skip / Increment Settings (Offset Starts from 0)</p></div>
<p>&nbsp;</p>
<h2>Method-3 : REST API Pagination via Response Attribute (Next Link or Cursor)</h2>
<p>This method is not discussed in this article but <a href="https://zappysys.com/blog/odata-paging-rest-api-paging-using-ssis-json-source/" target="_blank" rel="noopener">click here to read more</a></p>
<p>There are mainly 3 ways you can get next link or cursor.</p>
<ol>
<li>Full Link (e.g. nextPage : &#8220;https://mysite.com/api/v1/1/?filter=AAAA&#8221; )</li>
<li>Partial Link  (e.g. nextPage : &#8220;/api/v1/getcustomer/1/?filter=AAAA&#8221; )</li>
<li>Cursor Continuation Token (e.g.   nextCursor : &#8220;xxxxAAAbbbbCccc112233==&#8221; )</li>
</ol>
<h3>Next Link Method (Partial or Full URL)</h3>
<p>Example response with next URL would be</p><pre class="crayon-plain-tag">{ 
  "value" : [....], 
  "odata.nextLink" : "http://abc.com/customers/2/" 
}</pre><p>
In this method you don&#8217;t specify page number in URL. If response include many records then you will get partial response along with indicator of next link.</p>
<p>For more information about this <em>REST API Pagination</em> please check below links. It explains in depth how to paginate REST API response with next page link found in response.</p>
<p><a title="Permalink to OData Paging using SSIS – REST API Paging Example" href="//zappysys.com/blog/odata-paging-rest-api-paging-using-ssis-json-source/" rel="bookmark">OData Paging using SSIS – REST API Paging Example</a></p>
<p><a title="Permalink to Read Twitter data in SSIS using REST API Task and JSON Source – OAuth2 Protocol" href="//zappysys.com/blog/read-twitter-data-in-ssis-using-rest-api-task-json-source-oauth2/#Handling_paging_of_large_REST_API_result_set_with_twitter_data_8211_loopingcursoring" rel="bookmark">Read Twitter data in SSIS using REST API Task and JSON Source – OAuth2 Protocol</a></p>
<div id="attachment_10743" style="width: 706px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-3-Pagination-via-Response-Attribute-Next-Link-or-Cursor.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-10743" class="size-full wp-image-10743" src="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-3-Pagination-via-Response-Attribute-Next-Link-or-Cursor.png" alt="Method-3: Next Link Method (Partial or Full URL)" width="696" height="557" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-3-Pagination-via-Response-Attribute-Next-Link-or-Cursor.png 696w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-3-Pagination-via-Response-Attribute-Next-Link-or-Cursor-300x240.png 300w" sizes="(max-width: 696px) 100vw, 696px" /></a><p id="caption-attachment-10743" class="wp-caption-text">SSIS API Pagination – Next Link from Response Attribute</p></div>
<h3>Next Link &#8211; Detect the last page based on empty rows (Regular Expression)</h3>
<p>Now let&#8217;s look at a little bit different scenario where the Next Link is never empty even on the last page. This can cause an infinite loop if we configure it like the last section. So in such a case (see below example) when the last page still has the next link URL but the data row array is empty then use settings like the screenshot below.</p>
<p><strong>First Page Example</strong></p><pre class="crayon-plain-tag">{ 
  "value" : [....], 
  "odata.nextLink" : "http://abc.com/customers/2/" 
}</pre><p>
<strong>Last Page Example</strong></p><pre class="crayon-plain-tag">{ 
  "value" : [], 
  "odata.nextLink" : "http://abc.com/customers/NNNN/" 
}</pre><p>
<strong>Example: Last Page</strong></p>
<p>Basically, configure the following options</p>
<ul>
<li>Set <b>Stop indicator attribute</b> to the same node which contains data rows (without array brackets). E.g. <strong>$.items</strong></li>
<li>Set <b>Stop indicator value / Regular Expression </b>to something like <pre class="crayon-plain-tag">[]</pre>  assuming the last page has the same way. <a href="https://zappysys.com/blog/how-to-use-fiddler-to-analyze-http-web-requests/" target="_blank" rel="noopener">Check Fiddler Trace</a> for exact text on the last page.</li>
</ul>
<div id="attachment_10744" style="width: 678px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-3-Pagination-Detect-the-last-page-based-on-empty-rows.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-10744" class="size-full wp-image-10744" src="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-3-Pagination-Detect-the-last-page-based-on-empty-rows.png" alt="Method-3 Detect the last page based on empty rows " width="668" height="399" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-3-Pagination-Detect-the-last-page-based-on-empty-rows.png 668w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-3-Pagination-Detect-the-last-page-based-on-empty-rows-300x179.png 300w" sizes="(max-width: 668px) 100vw, 668px" /></a><p id="caption-attachment-10744" class="wp-caption-text">Last Page with non empty next link and empty data array (Detect Last Page based on zero row count)</p></div>
<h3>Cursor Method</h3>
<p>Many API returns cursor rather than link. Cursor method usually used to support a large number of records. Cursor is opened at server side with initial query information you submit and if cursor has more records you may get next cursor indicator in your response. In cursor method you have to supply Suffix for Next URL so after First URL your next URL will contain extra attribute which will include pagination information.</p>
<p><strong>Suffix for next URL</strong></p>
<p>Suffix for next URL can include special placeholders. There are two placeholders allowed. If you wish to append Next URL value in raw text then use <strong>&lt;%nextlink%&gt;</strong> but if your API needs value in encoded format e.g. A%20B rather than A+B then you have to use <strong>&lt;%nextlink_encoded%&gt;</strong></p>
<p><strong>Example URLs for Cursor:</strong></p>
<p>Below is few sample URLs in the log when pagination occurs via Cursor method. As you see the first URL has Cursor=* means its first call, after first request server may send next cursor in the response body (see example)</p><pre class="crayon-plain-tag">{ 
&nbsp; data: [....], 
&nbsp; nextCursor: &quot;Aooo/MxxxxxxxxxxxtdA==&quot; 
}</pre><p>
First URL: http://api.crossref.org/members/311/works?filter=type:journal-article&amp;rows=100&amp;cursor=*<br />
Second URL: http://api.crossref.org/members/311/works?filter=type:journal-article&amp;rows=100&amp;cursor=Aooo/MxxxxxxxxxxxtdA==<br />
Third URL: http://api.crossref.org/members/311/works?filter=type:journal-article&amp;rows=100&amp;cursor=Booo/MxxxxxxxxxxxtdA==<br />
&#8230;..<br />
&#8230;..</p>
<h2>Method-4: Pass Page Number in Body Attribute</h2>
<p>Some API allows you to pass your PageSize and Page number inside Request Body (i.e. POST data) in that case you may configure your options like below (We used Google AdWords Api as an example)</p>
<div id="attachment_10745" style="width: 838px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-4-pagination.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-10745" class="size-full wp-image-10745" src="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-4-pagination.png" alt="Method-4 Pass Page Number in Body Attribute" width="828" height="735" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-4-pagination.png 828w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-4-pagination-300x266.png 300w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-4-pagination-768x682.png 768w" sizes="(max-width: 828px) 100vw, 828px" /></a><p id="caption-attachment-10745" class="wp-caption-text">Configure REST API Pagination – using Page Number via POST Body Method</p></div>
<div id="attachment_10746" style="width: 838px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-4-Settings.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-10746" class="size-full wp-image-10746" src="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-4-Settings.png" alt="Method-4: Pass Page Number in Body Attribute example" width="828" height="735" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-4-Settings.png 828w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-4-Settings-300x266.png 300w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-4-Settings-768x682.png 768w" sizes="(max-width: 828px) 100vw, 828px" /></a><p id="caption-attachment-10746" class="wp-caption-text">REST API Pagination – Passing PageNumber inside POST Body (Example: Google AdWords SOAP API)</p></div>
<h2>Method-5: REST API Pagination via multiple URL parameters (e.g. Start and End)</h2>
<p>In the previous section, you saw how to pass page numbers via URL (Single Parameter: http://abc.com/?page=1). However, sometimes you have a pagination requirement where you have to specify multiple parameters that need increment. See below example URL.</p><pre class="crayon-plain-tag">http://abc.com/?startRow=1&amp;endRow=100
http://abc.com/?startRow=101&amp;endRow=200
http://abc.com/?startRow=201&amp;endRow=300
...</pre><p>
<div id="attachment_10747" style="width: 838px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-5-pagination.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-10747" class="size-full wp-image-10747" src="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-5-pagination.png" alt="Method-5: REST API Pagination via multiple URL parameters (e.g. Start and End)" width="828" height="478" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-5-pagination.png 828w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-5-pagination-300x173.png 300w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-5-pagination-768x443.png 768w" sizes="(max-width: 828px) 100vw, 828px" /></a><p id="caption-attachment-10747" class="wp-caption-text">Pagination via Multiple URL Parameters</p></div>
<h2>Method-6: REST API Pagination via Header (Next Link in Header)</h2>
<p>Another popular pagination method is paginate via Header. In this method, each API response includes special Header which indicates next link for your response. In header method there are two approaches. [1] Custom Method [2] RFC 5988 Method. Lets look at both.</p>
<h3>Next Link in Custom Header</h3>
<p>In this method you have to specify which response header contains next URL. When no more NEXT url found in response reader stops.</p>
<div id="attachment_10749" style="width: 650px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-6-REST-API-Pagination-via-Header.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-10749" class="size-full wp-image-10749" src="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-6-REST-API-Pagination-via-Header.png" alt="Method 6 REST API Pagination via Headers" width="640" height="213" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-6-REST-API-Pagination-via-Header.png 640w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-6-REST-API-Pagination-via-Header-300x100.png 300w" sizes="(max-width: 640px) 100vw, 640px" /></a><p id="caption-attachment-10749" class="wp-caption-text">Custom Header Pagination Method</p></div>
<h3>Next Link in Header as per RFC 5988</h3>
<p>In this method, HTTP response contains a special header (Link) which contains next link for our response. If no link found to read more data then reader stops. This method is described well here in <a href="https://tools.ietf.org/html/rfc5988" target="_blank" rel="noopener">RFC 5988</a>. Check this <a href="https://developer.github.com/v3/guides/traversing-with-pagination/" target="_blank" rel="noopener">GitHub API Example</a> to understand more on this pagination method.</p>
<div id="attachment_10751" style="width: 696px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-6-Next-Link-in-Header-as-per-RFC-5988.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-10751" class="size-full wp-image-10751" src="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-6-Next-Link-in-Header-as-per-RFC-5988.png" alt="Method 6 Next Link in Header as per RFC 5988" width="686" height="144" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-6-Next-Link-in-Header-as-per-RFC-5988.png 686w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-6-Next-Link-in-Header-as-per-RFC-5988-300x63.png 300w" sizes="(max-width: 686px) 100vw, 686px" /></a><p id="caption-attachment-10751" class="wp-caption-text">Link Header Pagination Method (RFC 5988)</p></div>
<h2>Method-7: REST API Pagination using Cursor / Continuation Token from Response Header</h2>
<p>There will be a time when your API sends some sort of Continuation Token in Response Header and you have to use that token to call next request. Some API needs this token passed as query string in Next URL and in some API you have to pass as request header. We will cover both cases in the following section.</p>
<p>Your API might call these tokens as &#8220;Cursor&#8221; too so we will use these both terms in the following section (They both mean same thing).</p>
<p>There are few ways these APIs pass Cursor to the next request</p>
<ol>
<li>Pass Cursor via Request Header with <strong>same header name</strong></li>
<li>Pass Cursor via Request Header with <strong>different header name (introduced in v4.2.3)</strong></li>
<li>Pass multiple Response Headers via Request Headers (Azure DocumentDB style usecase)</li>
<li>Pass Cursor via URL Query String Parameter (<strong>introduced in v3.0 or later</strong>)</li>
</ol>
<p>Lets see all approaches.</p>
<h3>Pass Token via Request Header (Same header name)</h3>
<p>Consider the API pagination use case in which you get some sort of continuation token in the response header and you take it and pass in the next request via request header (same header name).</p>
<p>Example:</p>
<p><strong>First Request / Response:</strong></p><pre class="crayon-plain-tag">------- Request ------
GET https://abc.com/api/getdata

------- Response ------
x-token: Nxdfabcd11111

{ some response data }</pre><p>
<strong>Second Request / Response:</strong></p><pre class="crayon-plain-tag">------- Request ------
GET https://abc.com/api/getdata
x-token: Nxdfabcd11111

------- Response ------
x-token: Nxdfabcd22222

{ some response data }</pre><p>
&#8230;&#8230;</p>
<p>&#8230;&#8230;</p>
<p><strong>Last Request / Response:</strong></p><pre class="crayon-plain-tag">------- Request ------
GET https://abc.com/api/getdata
x-token: Nxdfabcd22222

------- Response ------

{ some response data }</pre><p>
For above pagination pattern  that just enter the response header name in <strong>Page Num Indicator</strong> field as below</p>
<div id="attachment_10752" style="width: 697px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-7-Pass-Token-via-Request-Header.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-10752" class="size-full wp-image-10752" src="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-7-Pass-Token-via-Request-Header.png" alt="Method 7 Pass Token via Request Header" width="687" height="126" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-7-Pass-Token-via-Request-Header.png 687w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-7-Pass-Token-via-Request-Header-300x55.png 300w" sizes="(max-width: 687px) 100vw, 687px" /></a><p id="caption-attachment-10752" class="wp-caption-text">Pagination using response header continuation token – Pass as Request Header</p></div>
<p>All possible formats for Page Num Indicator is below</p>
<p>x-page-token<br />
x-token1, x-token2<br />
RequestUrlQueryName=ResponseHeaderName<br />
header::RequestHeaderName=ResponseHeaderName<br />
RequestUrlQueryName=ResponseHeaderName(regular-expression)</p>
<h3>Pass Token via Request Header (Different header name)</h3>
<p>Consider the API pagination use case just like previous one but only different is request header name is not same as response header name. For example rather than x-token in request we need to call it x-next-token.</p>
<p>Example:</p>
<p><strong>First Request / Response:</strong></p><pre class="crayon-plain-tag">------- Request ------
GET https://abc.com/api/getdata

------- Response ------
x-token: Nxdfabcd11111

{ some response data }</pre><p>
<strong>Second Request / Response:</strong></p><pre class="crayon-plain-tag">------- Request ------
GET https://abc.com/api/getdata
x-next-token: Nxdfabcd11111

------- Response ------
x-token: Nxdfabcd22222

{ some response data }</pre><p>
&#8230;&#8230;</p>
<p>&#8230;&#8230;</p>
<p><strong>Last Request / Response:</strong></p><pre class="crayon-plain-tag">------- Request ------
GET https://abc.com/api/getdata
x-next-token: Nxdfabcd22222

------- Response ------

{ some response data }</pre><p>
For above pagination pattern  that just enter the response header name in <strong>Page Num Indicator</strong> field as below</p>
<div id="attachment_10753" style="width: 702px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-6-Pass-Token-via-Request-Header.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-10753" class="size-full wp-image-10753" src="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-6-Pass-Token-via-Request-Header.png" alt="Method 7 Pass Token via Request Header " width="692" height="197" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-6-Pass-Token-via-Request-Header.png 692w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-6-Pass-Token-via-Request-Header-300x85.png 300w" sizes="(max-width: 692px) 100vw, 692px" /></a><p id="caption-attachment-10753" class="wp-caption-text">Pagination using response header continuation token – Pass as Request Header (Different name)</p></div>
<h3>Pass multiple Response Headers via Request Headers (Azure DocumentDB style usecase)</h3>
<p>Some API like <a href="https://docs.microsoft.com/en-us/rest/api/cosmos-db/list-documents" target="_blank" rel="noopener">Azure Cosmos DB</a> uses Continuation Token via Header approach. In that case you can enter single header name or multiple headers like below (For multiple headers use comma)</p>
<div id="attachment_10754" style="width: 687px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-7-Pass-multiple-Response-Headers-via-Request-Headers-Azure-DocumentDB-style-usecase.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-10754" class="size-full wp-image-10754" src="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-7-Pass-multiple-Response-Headers-via-Request-Headers-Azure-DocumentDB-style-usecase.png" alt="Method 7 Pass multiple Response Headers via Request Headers" width="677" height="207" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-7-Pass-multiple-Response-Headers-via-Request-Headers-Azure-DocumentDB-style-usecase.png 677w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-7-Pass-multiple-Response-Headers-via-Request-Headers-Azure-DocumentDB-style-usecase-300x92.png 300w" sizes="(max-width: 677px) 100vw, 677px" /></a><p id="caption-attachment-10754" class="wp-caption-text">REST API Pagination using Continuation Token via Header (Azure CosmosDB / DocumentDB API Example )</p></div>
<p>You can use use tools <a href="https://zappysys.com/blog/how-to-use-fiddler-to-analyze-http-web-requests/" target="_blank" rel="noopener">like Fiddler</a> to see paginated requests as below.</p>
<p><strong>First Request</strong></p>
<div id="attachment_10755" style="width: 953px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-7-Fiddler-1.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-10755" class="size-full wp-image-10755" src="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-7-Fiddler-1.png" alt="Method 7 fiddler example 1" width="943" height="777" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-7-Fiddler-1.png 943w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-7-Fiddler-1-300x247.png 300w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-7-Fiddler-1-768x633.png 768w" sizes="(max-width: 943px) 100vw, 943px" /></a><p id="caption-attachment-10755" class="wp-caption-text">View Paginated Requests in Fiddler (Azure CosmosDB API Example)</p></div>
<p><strong>Second Request</strong></p>
<div id="attachment_10756" style="width: 1044px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-7-Fiddler-2.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-10756" class="size-full wp-image-10756" src="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-7-Fiddler-2.png" alt="Method 7 fiddler reuqest 2 " width="1034" height="785" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-7-Fiddler-2.png 1034w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-7-Fiddler-2-300x228.png 300w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-7-Fiddler-2-768x583.png 768w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-7-Fiddler-2-1024x777.png 1024w" sizes="(max-width: 1034px) 100vw, 1034px" /></a><p id="caption-attachment-10756" class="wp-caption-text">Pass Next Page Token via Header (View Paginated Requests in Fiddler – Azure CosmosDB API Example)</p></div>
<h3>Pass Token via URL Parameter (Query String)</h3>
<p>In the new version we added a feature where you can actually read Continuation Token (i.e. Cursor) from Response Header and then pass to next request in the URL rather than Request Header. Here is the <a href="https://api.rosnet.com/#tag/Checks" target="_blank" rel="noopener">example API</a> which uses such method.</p>
<p><strong>First Request</strong></p><pre class="crayon-plain-tag">--------- Request ---------
GET
http://test.com/api/getdata

--------- Response ---------
X-RESPONSE-TOKEN : Pg2xxxxxxxxxxxxxxxxx

{ data : [ 1,2,3.... 10 ] }</pre><p>
<strong>Second Request </strong></p><pre class="crayon-plain-tag">--------- Request ---------
GET
http://test.com/api/getdata?cursor=Pg2xxxxxxxxxxxxxxxxx

--------- Response ---------
X-RESPONSE-TOKEN : Pg3xxxxxxxxxxxxxxxxx

{ data : [ 11,12,13.... 20 ] }</pre><p>
Here is how to configure above pagination pattern</p>
<div id="attachment_10759" style="width: 706px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-6-Pass-Token-via-URL-Parameter.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-10759" class="size-full wp-image-10759" src="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-6-Pass-Token-via-URL-Parameter.png" alt="Method 7 Pass Token via URL Parameter (Query String)" width="696" height="148" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-6-Pass-Token-via-URL-Parameter.png 696w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-6-Pass-Token-via-URL-Parameter-300x64.png 300w" sizes="(max-width: 696px) 100vw, 696px" /></a><p id="caption-attachment-10759" class="wp-caption-text">Pass Response Header value to URL (Cursor)</p></div>
<h3>Pass Token via URL Parameter (Query String) &#8211; with custom Regular expression (Usecase: Salesforce BULK query API)</h3>
<p>Now consider previous scenario but with slightly different requirement. By default previous pagination pattern stops when specified response header is missing or response header value is blank. However is some cases header value contains custom string to indicate last page. For example x-token: NULL. In such case we need to use <strong>Page Num Indicator</strong> like below (must use v4.2.3 or higher in SSIS PowerPack / 1.5.2 or higher in ODBC PowerPack)</p><pre class="crayon-plain-tag">nextUrlParameterName=responseHeadername(Some_Regular_Expression)</pre><p>
For example to stop pagination in below case you have to enter Page Num Indicator as below. It says stop pagination when  &#8220;NULL&#8221; word is detected</p><pre class="crayon-plain-tag">cursor=X-RESPONSE-TOKEN(^((?!NULL\b).)*$)</pre><p>
&nbsp;</p>
<p><strong>First Request</strong></p><pre class="crayon-plain-tag">--------- Request ---------
GET
http://test.com/api/getdata

--------- Response ---------
X-RESPONSE-TOKEN : Pg2xxxxxxxxxxxxxxxxx

{ data : [ 1,2,3.... 10 ] }</pre><p>
<strong>Second Request </strong></p><pre class="crayon-plain-tag">--------- Request ---------
GET
http://test.com/api/getdata?cursor=Pg2xxxxxxxxxxxxxxxxx

--------- Response ---------
X-RESPONSE-TOKEN : Pg3xxxxxxxxxxxxxxxxx

{ data : [ 11,12,13.... 20 ] }</pre><p>
&#8230;&#8230;</p>
<p>&#8230;&#8230;</p>
<p><strong>Last Request </strong></p><pre class="crayon-plain-tag">--------- Request ---------
GET
http://test.com/api/getdata?cursor=Pg3xxxxxxxxxxxxxxxxx

--------- Response ---------
X-RESPONSE-TOKEN : NULL

{ data : [ 21,22,23.... 30 ] }</pre><p>
Here is how to configure above pagination pattern</p>
<div id="attachment_10761" style="width: 706px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-7-with-custom-Regular-expression.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-10761" class="size-full wp-image-10761" src="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-7-with-custom-Regular-expression.png" alt="Method 7 with custom Regular expression" width="696" height="156" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-7-with-custom-Regular-expression.png 696w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-7-with-custom-Regular-expression-300x67.png 300w" sizes="(max-width: 696px) 100vw, 696px" /></a><p id="caption-attachment-10761" class="wp-caption-text">Pass Response Header value to URL (Cursor)</p></div>
<h2>Method-8: Pass Pagination Token in Request Body</h2>
<p>In previous section (Method-4: Pass Page Number in Body Attribute ) we saw how to pass simple numeric page counter in Body. This is fine for some API but if your API has base64 style text token then counter based method doesn&#8217;t work. Also if you have requirement to hide page attribute node in first request and send page counter node in second request body (Changing Request Body Pattern for First vs Next)  then check next two sections.</p>
<p>Next two sections covers two API Pagination patterns to fetch 100 rows (1000 in each page) . Both requires to send token in Body but second section is more complex need (Different Body Attributes in first vs next requests )</p>
<h3>Passing Page Token in Body (Blank Token in first request allowed)</h3>
<p>Lets look at simple pattern where first request has blank token in Body but all other requests until we find last page we keep sending non-empty token. This approach works as long as API Provider doesn&#8217;t mind having Blank Token in first request. If you get error then check next section to handle more complex way.</p>
<p>Here is the example of API which needs token in body</p>
<p><strong>First API call</strong></p><pre class="crayon-plain-tag">--------- Request ---------
POST http://test.com/api/getdata

{ searchFor: "Account", continueToken:"" }

--------- Response ---------
{recordsFound: 5000, data: ["Acct1", "Acct2"..., "Acct1000"], nextToken:"AxBxCx112233001==" }</pre><p>
<strong>Second API call</strong></p><pre class="crayon-plain-tag">--------- Request ---------
POST http://test.com/api/getdata

{ searchFor: "Account", continueToken:"AxBxCx112233001==" }

--------- Response ---------
{data: ["Acct1001", "Acct1002"..., "Acct2000"], nextToken:"AxBxCx112233002==" }</pre><p>
&#8230;.. many more calls &#8230;</p>
<p>&#8230;. many more calls &#8230;.</p>
<p><strong>Last API call (no more nextToken in response so STOP pagination)</strong></p><pre class="crayon-plain-tag">--------- Request ---------
POST http://test.com/api/getdata

{ searchFor: "Account", continueToken:"AxBxCx112233009==" }

--------- Response ---------
{data: ["Acct9001", "Acct9002"..., "Acct10000"] }</pre><p>
So if you have such pattern then you can set few properties</p>
<p>For such issue you can use Changing few properties like below. Use Property Grid if you cant find on UI</p>
<ul>
<li>Set EnablePageTokenForBody  = <pre class="crayon-plain-tag">True</pre></li>
<li>Set PagePlaceholders = <pre class="crayon-plain-tag">header=|;filter=|;</pre></li>
<li>Set HttpRequestData = <pre class="crayon-plain-tag">{ searchFor: "Account", continueToken:"[$pagetoken$]" }</pre></li>
</ul>
<div id="attachment_10762" style="width: 838px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Pass-Passing-Page-Token-in-Body-1.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-10762" class="size-full wp-image-10762" src="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Pass-Passing-Page-Token-in-Body-1.png" alt="Method 8 Pass Passing Page Token in Body 1" width="828" height="488" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Pass-Passing-Page-Token-in-Body-1.png 828w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Pass-Passing-Page-Token-in-Body-1-300x177.png 300w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Pass-Passing-Page-Token-in-Body-1-768x453.png 768w" sizes="(max-width: 828px) 100vw, 828px" /></a><p id="caption-attachment-10762" class="wp-caption-text">Setting Body with [$pagetoken$] to implement dynamic pagination</p></div>
<div id="attachment_10763" style="width: 838px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Pass-Passing-Page-Token-in-Body-2.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-10763" class="size-full wp-image-10763" src="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Pass-Passing-Page-Token-in-Body-2.png" alt="Method 8 advanced pagination tab" width="828" height="437" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Pass-Passing-Page-Token-in-Body-2.png 828w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Pass-Passing-Page-Token-in-Body-2-300x158.png 300w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Pass-Passing-Page-Token-in-Body-2-768x405.png 768w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Pass-Passing-Page-Token-in-Body-2-720x380.png 720w" sizes="(max-width: 828px) 100vw, 828px" /></a><p id="caption-attachment-10763" class="wp-caption-text">Setting Page Placeholders in Advanced Pagination tab.</p></div>
<h3>Passing Page Token in Body (Blank Token in first request)</h3>
<p>Now let&#8217;s look at more complex pattern. Here our first request body is different than other requests.</p>
<p><strong>First API call</strong></p><pre class="crayon-plain-tag">--------- Request ---------
POST http://test.com/api/getdata

{ searchFor: "Account" }

--------- Response ---------
{recordsFound: 5000, data: ["Acct1", "Acct2"..., "Acct1000"], nextToken:"AxBxCx112233001==" }</pre><p>
<strong>Second API call</strong></p><pre class="crayon-plain-tag">--------- Request ---------
POST http://test.com/api/getdataNext

{ continueToken:"AxBxCx112233001==" }

--------- Response ---------
{data: ["Acct1001", "Acct1002"..., "Acct2000"], nextToken:"AxBxCx112233002==" }</pre><p>
&#8230;.. many more calls &#8230;</p>
<p>&#8230;. many more calls &#8230;.</p>
<p><strong>Last API call (no more nextToken)</strong></p><pre class="crayon-plain-tag">--------- Request ---------
POST http://test.com/api/getdataNext

{ continueToken:"AxBxCx112233009==" }

--------- Response ---------
{data: ["Acct9001", "Acct9002"..., "Acct10000"] }</pre><p>
So notice few things</p>
<ul>
<li>First Request Body / URL is different than second / third and Nth API call</li>
<li>For first request we do not have token attribute but after first request we do have token attribute</li>
</ul>
<p>We have <a href="https://zappysys.com/blog/call-amazon-mws-api-using-ssis-marketplace-web-service/" target="_blank" rel="noopener">this article</a> and <a href="https://zappysys.com/blog/read-data-netsuite-ssis-simpletalk-soap-api/" target="_blank" rel="noopener">this article</a> which describes similar pattern.</p>
<p>Now lets look at how to solve both problems</p>
<h3>Passing PageToken or Counter in Next API Call Body</h3>
<p>For such issue you can use Changing few properties like below. Use Property Grid if you cant find on UI</p>
<ul>
<li>Set EnablePageTokenForBody  = <pre class="crayon-plain-tag">True</pre></li>
<li>Set PagePlaceholders = <pre class="crayon-plain-tag">header=|;filter=|;</pre></li>
<li>Set HttpRequestData = <pre class="crayon-plain-tag">[$tag$]</pre></li>
<li>Set HasDifferentNextPageInfo = <pre class="crayon-plain-tag">True</pre></li>
<li>Set FirstPageBodyPart = <pre class="crayon-plain-tag">{ searchFor: "Account"}</pre></li>
<li>Set NextPageBodyPart = <pre class="crayon-plain-tag">{ token:"[$pagetoken$]" }</pre></li>
</ul>
<p>So notice how we defined Body in two different properies as template. And in HttpRequestData we used <pre class="crayon-plain-tag">[$tag$]</pre>
<h2>Output Page Number as column</h2>
<p>Sometimes you have use case where you want to Start Page Number from the last page loaded successfully. By default, you will see one additional column __FileName in the output. This column contains PageNumber  from URL for each row. You can save this into database so when next time you run your SSIS you can start at MAX(PageNumber) + 1.</p>
<p>Outputting PageNumber option is not visible by default so Use Property Grid and look for <strong>OutputFileName</strong> property (Default=true)</p>
<h2>Last Page Detection</h2>
<p>Every API may have different way of telling you that you reached last page or no more data found so you should stop looping. SSIS PowerPack comes with many options so you can implement desired logic for last page detection.</p>
<p>Following approaches supported by last page detection. Below options are not applicable if you are using Method#3 (Response contains Next Link / Cursor)</p>
<ol>
<li>Detect the last page by row count</li>
<li>Detect the last page by response status code</li>
<li>Detect the last page by error message (substring search)</li>
<li>Detect the last page by response size</li>
<li>Detect the last page based on response value or regular expression pattern</li>
</ol>
<p>Now lets look at each setting. You should choose correct one based on your API behavior</p>
<h3>Detect the last page by row count</h3>
<p>If your API returns blank document or blank Array (if its JSON) then you can use this method to detect the last page. So when no content found in Response document it will stop pagination.</p>
<p>See below example of JSON API .. It shows sample first page and Sample last page (Assuming you entered Filter as $.Records[*] to extract data from Records array.</p>
<p><strong>First Page</strong></p><pre class="crayon-plain-tag">{&nbsp;
&nbsp; Records : [ {...}, {...}, {...} .........&nbsp;]
}</pre><p>
<strong>Last Page</strong></p><pre class="crayon-plain-tag">{&nbsp;
&nbsp; Records : [&nbsp;&nbsp;]
}</pre><p>
<div id="attachment_10769" style="width: 654px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Detect-the-last-page-by-row-count.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-10769" class="size-full wp-image-10769" src="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Detect-the-last-page-by-row-count.png" alt="Method 8 Detect the last page by row count" width="644" height="222" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Detect-the-last-page-by-row-count.png 644w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Detect-the-last-page-by-row-count-300x103.png 300w" sizes="(max-width: 644px) 100vw, 644px" /></a><p id="caption-attachment-10769" class="wp-caption-text">SSIS API Pagination – Detect the last page by row count (Blank document or array)</p></div>
<h3>Detect the last page by response status code</h3>
<p>Sometimes you get error with status code when the last page is reached (Most common is 404). So rather than failure, you can treat that status code as last page indicator using this option (see below).</p>
<div id="attachment_10766" style="width: 644px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Detect-the-last-page-by-response-status-code.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-10766" class="size-full wp-image-10766" src="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Detect-the-last-page-by-response-status-code.png" alt="Method 8 Detect the last page by response status code" width="634" height="245" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Detect-the-last-page-by-response-status-code.png 634w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Detect-the-last-page-by-response-status-code-300x116.png 300w" sizes="(max-width: 634px) 100vw, 634px" /></a><p id="caption-attachment-10766" class="wp-caption-text">SSIS API Pagination – Detect last page by response status code</p></div>
<h3>Detect the last page by the error message</h3>
<p>If you cant use above two methods and want to detect the last page based on a certain error string in the response then use below approach.</p>
<div id="attachment_10767" style="width: 647px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Detect-the-last-page-by-the-error-message.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-10767" class="size-full wp-image-10767" src="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Detect-the-last-page-by-the-error-message.png" alt="Method 8 Detect the last page by the error message" width="637" height="249" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Detect-the-last-page-by-the-error-message.png 637w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Detect-the-last-page-by-the-error-message-300x117.png 300w" sizes="(max-width: 637px) 100vw, 637px" /></a><p id="caption-attachment-10767" class="wp-caption-text">SSIS API Pagination – Detect the last page by error/response string search</p></div>
<h3>Detect the last page by response size</h3>
<p>Sometimes you can detect the last page by response size. For example, your response contains &#8220;&#8211;&#8221; only if no more data is found then you cannot use any of the above approaches and you have to detect based on response size (e.g. less than 3 bytes). See below</p>
<div id="attachment_10768" style="width: 654px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Detect-the-last-page-by-response-size-1.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-10768" class="size-full wp-image-10768" src="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Detect-the-last-page-by-response-size-1.png" alt="Method 8 Detect the last page by response size" width="644" height="243" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Detect-the-last-page-by-response-size-1.png 644w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Detect-the-last-page-by-response-size-1-300x113.png 300w" sizes="(max-width: 644px) 100vw, 644px" /></a><p id="caption-attachment-10768" class="wp-caption-text">SSIS API Pagination – Detect last page by response size</p></div>
<h3>Detect the last page based on the response attribute value</h3>
<p>There will be a time when you want to detect the last page based on some indicator value from your response. In that case, you can use the following settings to detect the last page.</p>
<ul>
<li>Select Paging mode =Response Attribute Mode</li>
<li>Select Next Link Attribute (Example: <strong>$.next_page</strong> )</li>
<li>Select Stop Indicator Attribute (Example: <strong>$.hasMorePages</strong> )</li>
<li>Enter a value for Stop Indicator (Example: <strong>false</strong> )</li>
</ul>
<p>If you don&#8217;t want to use Hardcoded value for stop indicator and want to use expression then see next section.</p>
<h3>Detect the last page based on regular expression pattern</h3>
<p>There will be a time when you want to detect the last page based on some indicator value from your response. In that case, you can use the following settings to detect the last page.</p>
<ul>
<li>Select Paging mode =Response Attribute Mode</li>
<li>Select Next Link Attribute (Example: <strong>$.next_page</strong> )</li>
<li>Select Stop Indicator Attribute (Example: <strong>$.count</strong> )</li>
<li>Enter regex pattern (regular expression) for Stop Indicator (Example: <strong>regex=^\d{1,3}$</strong> ). Stop when count attribute is less than 1000 in other word less than 4 digits.</li>
</ul>
<p>Here is an example from <a href="https://zappysys.com/blog/read-zendesk-data-in-ssis-call-rest-api/" target="_blank" rel="noopener">Zendesk API</a> (Stop pagination when count attribute from the response is less than 1000)</p>
<div id="attachment_10770" style="width: 687px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Detect-the-last-page-based-on-regular-expression-pattern.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-10770" class="size-full wp-image-10770" src="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Detect-the-last-page-based-on-regular-expression-pattern.png" alt="Method 8 Detect the last page based on regular expression pattern" width="677" height="418" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Detect-the-last-page-based-on-regular-expression-pattern.png 677w, https://zappysys.com/blog/wp-content/uploads/2016/04/Method-8-Detect-the-last-page-based-on-regular-expression-pattern-300x185.png 300w" sizes="(max-width: 677px) 100vw, 677px" /></a><p id="caption-attachment-10770" class="wp-caption-text">Pagination for Zendesk Incremental API – Next Link and Last Page detection using Stop Indicator Regular Expression</p></div>
<div class="content_block" id="custom_post_widget-9862"><h2>Handling API Rate Limit - Retry on too many API requests</h2>
<p>Many API restricts you from calling too many API calls too soon (just to save their servers from being overwhelmed) - <a href="https://shopify.dev/api/usage/rate-limits" target="_blank" rel="noopener">Example</a>. Let's think this way if you fetching a million rows via paginated response and the very last page fails then you won't be happy because now you have to fetch everything again. To solve this ZappySys provides retry options on HTTP / OAuth and REST API connection managers.</p>

<p>Generally, when you exceed the rate limit, the server sends you <strong>error code 429</strong> but it can be something else too or multiple codes are returned. In the below example, we use 503. Check your API documentation to know the exact code you should retry.</p>

<p>To set the retry options go to connection settings (e.g. HTTP / OAuth / REST connection). The below example is for OAuth connection.</p>

<p>To retry on multiple codes use Pipe as a delimiter. Example: <strong>429|503</strong></p>


<div class="wp-caption alignnone">
 <a href="https://zappysys.com/blog/wp-content/uploads/2018/09/http-retry-settings-oauth-connection.png">
   <img decoding="async" src="https://zappysys.com/blog/wp-content/uploads/2018/09/http-retry-settings-oauth-connection.png" alt="Retry Settings for API Rate Limit Exceeded Error (Status code 429)" />
 </a>
<p class="wp-caption-text">Retry Settings for API Rate Limit Exceeded Error (Status code 429 or other)</p>
</div></div>
<h2>Performance Tips</h2>
<p>You can improve performance of your API calls by doing a few changes (again not every API may support this)</p>
<ul>
<li>Use the maximum page size possible (e.g. if you doing pagination you can set max possible page size &#8211; refer to your API documentation whats the default size and what is the max page size you can supply)<br />
e.g.  /myapi?pagesize=100  (parameter name can be something else like limit=100)</li>
</ul>
<p>&nbsp;</p>
<h2>SSIS Infinite Loop</h2>
<p>So now you know how to paginate automatically in <a href="//zappysys.com/products/ssis-powerpack/ssis-json-file-source/">JSON Source Connector</a> but what if you want to use <a href="https://zappysys.com/products/ssis-powerpack/ssis-rest-api-web-service-task/">REST API Task</a> for pagination? Some custom scenarios like web scraping require you to download all HTML pages until no more results found? In that case, you most likely need infinite looping pattern (Loop until the last page detected). To loop through pages until the last page is reached you can perform the following logic.</p>
<p>The last page can be detected based on any of the following ways<br />
1. Check Response StatusCode<br />
2. Check Error Message<br />
3. Check Response Size (If less than X bytes then consider as the last page)</p>
<p>REST API Task support #1 and #2 scenarios. If you want to check bytes then use the expression in Expression Task or Script Task<br />
(e.g. @exitloop = LEN(@responseData) &lt;= 3 )</p>
<p><b>URL for Rest API Task (On Request Settings Tab)</b><br />
When you configure REST API Task enter URL as below so its dynamic. You can use PageCounter variable anywhere in the URL.</p><pre class="crayon-plain-tag">//zappysys.com/downloads/files/test/cust-{{User::pagecounter}}.json</pre><p>
<div id="attachment_10771" style="width: 755px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/SSIS-Infinite-Loop-1.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-10771" class="size-full wp-image-10771" src="https://zappysys.com/blog/wp-content/uploads/2016/04/SSIS-Infinite-Loop-1.png" alt="SSIS Infinite Loop part 1 " width="745" height="957" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/SSIS-Infinite-Loop-1.png 745w, https://zappysys.com/blog/wp-content/uploads/2016/04/SSIS-Infinite-Loop-1-234x300.png 234w" sizes="(max-width: 745px) 100vw, 745px" /></a><p id="caption-attachment-10771" class="wp-caption-text">SSIS REST API Looping – Pass Page number in URL, SSIS Infinite Loop</p></div>
<div id="attachment_10772" style="width: 729px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2016/04/SSIS-Infinite-Loop-2.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-10772" class="size-full wp-image-10772" src="https://zappysys.com/blog/wp-content/uploads/2016/04/SSIS-Infinite-Loop-2.png" alt="SSIS Infinite Loop part 2" width="719" height="504" srcset="https://zappysys.com/blog/wp-content/uploads/2016/04/SSIS-Infinite-Loop-2.png 719w, https://zappysys.com/blog/wp-content/uploads/2016/04/SSIS-Infinite-Loop-2-300x210.png 300w" sizes="(max-width: 719px) 100vw, 719px" /></a><p id="caption-attachment-10772" class="wp-caption-text">Configure For Loop Task for Infinite Looping (Loop until last page found)</p></div>
<h2>Download Sample SSIS Package</h2>
<p><a href="//zappysys.com/blog/wp-content/uploads/2016/04/SSIS-Loop-Rest-API-2012.dtsx.zip">SSIS-Loop-Rest-API-2012.dtsx (Zip file)</a></p>
<h2>Video Tutorial &#8211; Reading data from API in SSIS</h2>
<p>In case you missed our previous article about <a href="https://zappysys.com/blog/call-rest-api-using-ssis-web-service-task/" target="_blank" rel="noopener">calling REST API is SSIS</a> then check below video.</p>
<a href="https://zappysys.com/blog/ssis-rest-api-looping-until-no-more-pages-found/"><img decoding="async" src="https://zappysys.com/blog/wp-content/plugins/wp-youtube-lyte/lyteCache.php?origThumbUrl=%2F%2Fi.ytimg.com%2Fvi%2FaO8cVRyCBWw%2Fhqdefault.jpg" alt="YouTube Video"></a><br /><br /></p>
<p>&nbsp;</p>
<h2>Conclusion</h2>
<p>It can be time consuming and steep learning curve to write C#/JAVA code to handle your rest api integration but using some Tasks and Connectors listed below can help you to solve big headache and provide clean drag and drop REST API integration in SSIS for virtually any REST API Source (e.g. Twitter, Facebook, Salesforce, office 365). <a href="//zappysys.com/products/ssis-powerpack/">Download SSIS PowerPack</a> and try it out by yourself.</p>
<h2 class="su-box-title">SSIS Components for REST API/JSON/XML/SOAP</h2>
<div class="su-box-content su-clearfix">
<table>
<tbody>
<tr>
<td width="36"><img decoding="async" src="//zappysys.com/images/ssis-powerpack/SSIS-Json-Source-Adapter.png" alt="Custom SSIS Components - JSON Source (File and REST API Connector)" width="32" /></td>
<td><a href="//zappysys.com/products/ssis-powerpack/ssis-json-file-source/" target="_blank" rel="noopener"><span style="color: #248cc8;">JSON Source Connector (File, REST API)</span></a></td>
</tr>
<tr>
<td width="36"><span style="color: #248cc8;"><img decoding="async" src="//zappysys.com/images/ssis-powerpack/ssis-export-json-file-task.png" alt="Custom SSIS Tasks - Export JSON File Task" width="32" /></span></td>
<td><a href="//zappysys.com/products/ssis-powerpack/ssis-export-json-file-task/" target="_blank" rel="noopener"><span style="color: #248cc8;">Export JSON File Task</span></a></td>
</tr>
<tr>
<td width="36"><span style="color: #248cc8;"><img decoding="async" src="//zappysys.com/images/ssis-powerpack/ssis-json-parser-task.png" alt="Custom SSIS Tasks - JSON Parser Task" width="32" /></span></td>
<td><a href="//zappysys.com/products/ssis-powerpack/ssis-json-parser-task-free/" target="_blank" rel="noopener"><span style="color: #248cc8;">JSON Parser Task</span></a></td>
</tr>
<tr>
<td width="36"><span style="color: #248cc8;"><img decoding="async" src="//zappysys.com/images/ssis-powerpack/ssis-xml-source.png" alt="Custom SSIS Tasks - XML Source Connector (File, SOAP, REST API)" width="32" /></span></td>
<td><a href="//zappysys.com/products/ssis-powerpack/ssis-xml-source/" target="_blank" rel="noopener"><span style="color: #248cc8;">XML Source Connector (File, SOAP, REST API)</span></a></td>
</tr>
</tbody>
</table>
</div>
<p>The post <a href="https://zappysys.com/blog/ssis-rest-api-looping-until-no-more-pages-found/">How to do REST API Pagination in SSIS / ODBC Drivers</a> appeared first on <a href="https://zappysys.com/blog">ZappySys Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://zappysys.com/blog/ssis-rest-api-looping-until-no-more-pages-found/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Reading JSON Arrays from file / REST API</title>
		<link>https://zappysys.com/blog/extract-read-multiple-arrays-from-json-data-file-rest-api-response/</link>
		
		<dc:creator><![CDATA[ZappySys]]></dc:creator>
		<pubDate>Mon, 11 Jan 2016 16:50:48 +0000</pubDate>
				<category><![CDATA[SSIS JSON Source (File/REST)]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[json source]]></category>
		<category><![CDATA[jsonpath]]></category>
		<category><![CDATA[rest api]]></category>
		<category><![CDATA[ssis json parser transform]]></category>
		<category><![CDATA[ssis json source]]></category>
		<category><![CDATA[SSIS PowerPack]]></category>
		<category><![CDATA[ssis xml parser transform]]></category>
		<guid isPermaLink="false">http://zappysys.com/blog/?p=298</guid>

					<description><![CDATA[<p>Introduction REST API is becoming more and more common and with that you will see explosion in use of JSON data format. One of the questions we get a lot is &#8220;How to extract or read array from JSON data file&#8221; or &#8220;How to read multiple arrays from JSON data&#8220;. Example : Store JSON document [&#8230;]</p>
<p>The post <a href="https://zappysys.com/blog/extract-read-multiple-arrays-from-json-data-file-rest-api-response/">Reading JSON Arrays from file / REST API</a> appeared first on <a href="https://zappysys.com/blog">ZappySys Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Introduction</h2>
<p><a href="https://zappysys.com/blog/wp-content/uploads/2016/01/SSIS-Json-Source-Adapter.png"><img loading="lazy" decoding="async" class="size-full wp-image-3074 alignleft" src="https://zappysys.com/blog/wp-content/uploads/2016/01/SSIS-Json-Source-Adapter.png" alt="" width="100" height="100" /></a><a href="https://en.wikipedia.org/wiki/Representational_state_transfer" target="_blank" rel="noopener">REST API</a> is becoming more and more common and with that you will see explosion in use of JSON data format. One of the questions we get a lot is &#8220;<em>How to extract or read array from JSON data file</em>&#8221; or &#8220;<em>How to read multiple arrays from JSON data</em>&#8220;. Example : Store JSON document has Customers[&#8230;] and Employees[&#8230;] arrays and lets say you want to extract both and save to target SQL server database. In this post you will learn how to make this possible and how to make it fast with some performance tips. We will use <a href="//zappysys.com/products/ssis-powerpack/ssis-json-file-source/">SSIS JSON Source (File, REST API Connector)</a></p>
<p>If you want to learn how to parse Multi-Dimensional JSON arrays then check <a href="//zappysys.com/blog/parse-multi-dimensional-json-array-ssis/" target="_blank" rel="noopener">this article</a>.</p>
<h2>Video Tutorial &#8211; Read from multiple arrays from JSON document</h2>
<a href="https://zappysys.com/blog/extract-read-multiple-arrays-from-json-data-file-rest-api-response/"><img decoding="async" src="https://zappysys.com/blog/wp-content/plugins/wp-youtube-lyte/lyteCache.php?origThumbUrl=%2F%2Fi.ytimg.com%2Fvi%2FOt7z8BIFbis%2Fhqdefault.jpg" alt="YouTube Video"></a><br /><br /></p>
<h2>Read array from JSON document</h2>
<p>To extract subdocument or array content from JSON document you need to use <strong>JSON Path</strong> expression. Lets check following example JSON document.</p><pre class="crayon-plain-tag">{
  "store": {
    "employees": [
      {
        "name": "bob",
        "hiredate": "2015-01-01"
      },
      {
        "name": "sam",
        "hiredate": "2015-01-02"
      },
      {
        "name": "ken",
        "hiredate": "2015-01-03"
      }
    ],
    "books": [
      {
        "category": "reference",
        "author": "bob",
        "title": "hellooo1",
        "price": 1.95,
        "sections": [
          "s1",
          "s2",
          "s3"
        ]
      },
      {
        "category": "fiction",
        "author": "sam",
        "title": "hellooo2",
        "price": 1.96,
        "sections": [
          "s4",
          "s1",
          "s3"
        ]
      },
      {
        "category": "science",
        "author": "steve",
        "title": "hellooo3",
        "tag": "1bcd",
        "price": 11,
        "sections": [
          "s9",
          "s2",
          "s3"
        ]
      }
    ],
    "location": {
      "street": "123 Main St.",
      "city": "Newyork",
      "state": "GA"
    }
  }
}</pre><p>
Below is example filter expression to extract common elements</p><pre class="crayon-plain-tag">$.store.books[*]       //get all books for store              
$.store.employees[*]       //get all employees for store                 
$.store.books[*].sections[*]       //get all sections from all books   
$.store.books[*].author //get all authors of all books for store           
$.store.books[*]    //get all books for store  
$.store.books[2]    //get 3rd book record
$.store.books[:2]   //get first 2 books from the top
$.store.books[-2:]  //get last 2 books
$.store.books[?(@.price &lt; 10)] //get books where price is less than 10
$.store.books[?(@.tag)] //filter all books with tag</pre><p>
<h2>Read single array from JSON data (JSON Path expression)</h2>
<p>SSIS PowerPack comes with powerful REST API Connectors for <a href="//zappysys.com/products/ssis-powerpack/ssis-json-file-source/">JSON</a> and <a href="https://zappysys.com/products/ssis-powerpack/ssis-xml-source/">XML </a> . In below example screenshot you will see how to extract single array section from your JSON File. But if you have multiple array sections (e.g. books and employees from above example) then you have to use Multiple JSON Source Connectors for same JSON File.</p>
<p><img decoding="async" src="//zappysys.com/onlinehelp/ssis-powerpack/scr/images/json-source/ssis-json-source-data-read-from-file-url.png" alt="Read Json File data from Web Url Example in SSIS" /></p>
<h2>Read multiple arrays from JSON data</h2>
<p>If you have scenario to extract multiple arrays from same JSON (e.g. extract Employees and Books from store ) then you have two options. You can pick any approach which suites your need (Method-1 is recommended).</p>
<ol>
<li>Method-1: Use single JSON Source with [Output As Document] option and feed that to <a href="//zappysys.com/products/ssis-powerpack/ssis-json-parser-transform/" target="_blank" rel="noopener">JSON Parser Transform</a></li>
<li>Method-2: Use multiple JSON Sources with different filter expressions</li>
<li>Method-3: Enable <strong>Array Flattening</strong> Option (Useful if you have smaller arrays &#8211; i.e. less than 10 items) &#8211; <strong>Version v2.7.6+</strong></li>
</ol>
<p>Now lets discuss each approach in detail.</p>
<h3>Method-1: Use single JSON Source along with JSON Parser Transform</h3>
<p><a href="//zappysys.com/onlinehelp/ssis-powerpack/scr/release-notes.htm#v2_2" target="_blank" rel="noopener">SSIS PowerPack v2.2</a> released new <a href="//zappysys.com/products/ssis-powerpack/ssis-json-parser-transform/" target="_blank" rel="noopener">JSON Parser Transform</a> and <a href="//zappysys.com/products/ssis-powerpack/ssis-json-parser-transform/" target="_blank" rel="noopener">XML Parser Transform</a> which can be used to parse any input JSON/XML data coming from upstream in pipeline. It parse input string  column into multiple columns how JSON/XML Source does but the only difference is JSON Parser takes String as input from existing upstream column.</p>
<p>Here are the steps to parse multiple JSON arrays using JSON Parser Transform. For example purpose we will use sample store json listed above.</p>
<ol>
<li>Drag new data flow in SSIS Control Flow designer. Double click on Data flow<br />
<img decoding="async" class="figureimage" title="SSIS Data Flow Task - Drag and Drop" src="https://zappysys.com/onlinehelp/ssis-powerpack/scr/images/drag-and-drop-data-flow-task.png" alt="SSIS Data Flow Task - Drag and Drop" /></li>
<li>Drag ZS JSON Source from SSIS Toolbox. Configure Source, Filter and other property.<br />
<img decoding="async" class="figureimage" title="SSIS JSON Source - Drag and Drop" src="https://zappysys.com/onlinehelp/ssis-powerpack/scr/images/json-source/ssis-json-source-adapter-drag.png" alt="SSIS JSON Source - Drag and Drop" /></li>
<li>Check [<strong>Output As Document</strong>] option (Found under Access Mode dropdown). Click preview. From grid <strong>copy one sample document from __DOCUMENT__ column</strong>. (Right click on Cell and Copy).This is raw JSON which we will use later to feed as sample in JSON Parser Transform (If you cant copy JSON then obtain some other way)
<div id="attachment_9175" style="width: 627px" class="wp-caption alignnone"><a href="https://zappysys.com/blog/wp-content/uploads/2016/01/ssis-json-source-output-row-document-option.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-9175" class="size-full wp-image-9175" src="https://zappysys.com/blog/wp-content/uploads/2016/01/ssis-json-source-output-row-document-option.png" alt="Enable Output As Raw Document Option - SSIS JSON Source" width="617" height="753" srcset="https://zappysys.com/blog/wp-content/uploads/2016/01/ssis-json-source-output-row-document-option.png 617w, https://zappysys.com/blog/wp-content/uploads/2016/01/ssis-json-source-output-row-document-option-246x300.png 246w" sizes="(max-width: 617px) 100vw, 617px" /></a><p id="caption-attachment-9175" class="wp-caption-text">Enable Output As Raw Document Option &#8211; SSIS JSON Source</p></div></li>
<li>Click OK to save JSON Source.</li>
<li>Drag Multicast Transform (Native SSIS Transform) from Toolbox
<div id="attachment_9174" style="width: 546px" class="wp-caption alignnone"><a href="https://zappysys.com/blog/wp-content/uploads/2016/01/ssis-toolbox-drag-multicast-transform.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-9174" class="size-full wp-image-9174" src="https://zappysys.com/blog/wp-content/uploads/2016/01/ssis-toolbox-drag-multicast-transform.png" alt="Drag &amp; Drop SSIS MultiCast Transform from Toolbox on designer surface" width="536" height="204" srcset="https://zappysys.com/blog/wp-content/uploads/2016/01/ssis-toolbox-drag-multicast-transform.png 536w, https://zappysys.com/blog/wp-content/uploads/2016/01/ssis-toolbox-drag-multicast-transform-300x114.png 300w" sizes="(max-width: 536px) 100vw, 536px" /></a><p id="caption-attachment-9174" class="wp-caption-text">Drag &amp; Drop SSIS MultiCast Transform from Toolbox on designer surface</p></div></li>
<li>Connect JSON Source to Multicast Transform</li>
<li>Drag first <a href="//zappysys.com/products/ssis-powerpack/ssis-json-parser-transform/" target="_blank" rel="noopener">JSON Parser Transform</a> from Toolbox. Rename it to [Parse Employees]. Connect blue arrow coming from Multicast to JSON Parser Transform</li>
<li>Drag second <a href="//zappysys.com/products/ssis-powerpack/ssis-json-parser-transform/" target="_blank" rel="noopener">JSON Parser Transform</a> from Toolbox. Rename it to [Parse Books]. Connect blue arrow coming from Multicast to JSON Parser Transform</li>
<li>Double click [Parse Employees]. Select <strong>__DOCUMENT__</strong> as upstream column. Enter sample JSON you obtained in step#3. Click on select Filter and highlight Employees node (i.e. $.store.employees[*] ). Click preview to see data.
<div id="attachment_2399" style="width: 714px" class="wp-caption alignnone"><a href="https://zappysys.com/blog/wp-content/uploads/2017/12/ssis-sql-server-to-elasticsearch-json-parser-transform-configuration.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-2399" class="size-full wp-image-2399" src="https://zappysys.com/blog/wp-content/uploads/2017/12/ssis-sql-server-to-elasticsearch-json-parser-transform-configuration.png" alt="Use JSON Parser Transform to parse Elasticsearch API HTTP JSON response into columns to redirect the rows later" width="704" height="622" srcset="https://zappysys.com/blog/wp-content/uploads/2017/12/ssis-sql-server-to-elasticsearch-json-parser-transform-configuration.png 704w, https://zappysys.com/blog/wp-content/uploads/2017/12/ssis-sql-server-to-elasticsearch-json-parser-transform-configuration-300x265.png 300w" sizes="(max-width: 704px) 100vw, 704px" /></a><p id="caption-attachment-2399" class="wp-caption-text">Use <em>JSON Parser Transform</em> to parse Raw JSON document</p></div></li>
<li><strong>Very Important:</strong>Click Columns tab and verify metadata (e.g. datatype, length). If you think you need extra columns or bigger column length then change in the grid and check [Lock] option found in the last grid column. If column length is smaller than output data then you will get error message when you run package. You can review error message carefully to determine which column needs to be adjusted  (Repeat this until you clear all errors).</li>
<li>Click OK to save [Parse Employees].</li>
<li>Double click [Parse Books]. Select __DOCUMENT__ as upstream column. Enter sample JSON you obtained in step#3. Click on select Filter and highlight Books node (i.e. $.store.books[*] ). Click ok. Click preview to see data.</li>
<li>Perform same steps as #11 for  [Parse Books] to set correct metadata.</li>
<li>Click OK to save [Parse Books].</li>
<li>Drag ZS Trash destination from Toolbox. Connect Trash destination to [Parse Employees]</li>
<li>Drag ZS Trash destination from Toolbox. Connect Trash destination to [Parse Books]</li>
<li>Run the package and you will see both 2 outputs from different JSON Parser with different row count.</li>
</ol>
<p>Here is how it will look like</p>
<div style="width: 789px" class="wp-caption alignnone"><img loading="lazy" decoding="async" src="//zappysys.com/onlinehelp/ssis-powerpack/scr/images/json-parser-transform/ssis-json-extract-multiple-array-output-using-parser.png" alt="Extract multiple array output from JSON file / REST API response in (SSIS JSON Source, JSON Parser Transform)" width="779" height="555" /><p class="wp-caption-text">Extract multiple array output from JSON file / REST API response in (SSIS JSON Source, JSON Parser Transform)</p></div>
<p>&nbsp;</p>
<h3>Method-2: Use multiple JSON Sources with different filter expressions</h3>
<p>You can consider using multiple JSON Source (each source with unique filter expression). Since one JSON source can only extract one array or Document.. You have to use below technique to read multiple arrays from same JSON document.</p>
<div id="attachment_322" style="width: 601px" class="wp-caption alignnone"><a href="//zappysys.com/blog/wp-content/uploads/2016/01/read-multiple-array-from-json-data-file.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-322" class="size-full wp-image-322" src="//zappysys.com/blog/wp-content/uploads/2016/01/read-multiple-array-from-json-data-file.png" alt="Read array from JSON data - Reading multiple array or single array" width="591" height="293" srcset="https://zappysys.com/blog/wp-content/uploads/2016/01/read-multiple-array-from-json-data-file.png 591w, https://zappysys.com/blog/wp-content/uploads/2016/01/read-multiple-array-from-json-data-file-300x149.png 300w" sizes="(max-width: 591px) 100vw, 591px" /></a><p id="caption-attachment-322" class="wp-caption-text">Read array from JSON data &#8211; Reading multiple array or single array</p></div>
<h3>Method-3: Use Array Flattening Option (Preferred for smaller arrays)</h3>
<p>If you have array inside extracted record and you like to flatten it so each items of array becomes column then use newly introduced feature [<strong>Enable Array Flattening</strong>]
<p>Consider JSON like below. What if you don&#8217;t like to store every detail from below JSON in just one table (i.e. rather than splitting in 3 tables Customers, CustomerHobbies , CustomerAddresses ?) . To achieve full denormalization ZappySys offers powerful yet simple one click option.</p><pre class="crayon-plain-tag">{
	"Customer" : [{
			"Name" : "John",
			"Hobby" : ["Painting","Reading","Swimming"],
			"Addresses" : [
				{"Street":"100 Main St","ZipCode":"10062"}, 
				{"Street":"101 Fire St","ZipCode":"11121"}
			]
		}, {
			"Name" : "Peter",
			"Hobby" : ["Hiking","Golf"],
			"Addresses" : [
				{"Street":"200 Main St","ZipCode":"20062"}, 
				{"Street":"201 Fire St","ZipCode":"33321"}
			]
		}
	]
}</pre><p>
To enable flattening check below option on Filter</p>
<div id="attachment_4760" style="width: 857px" class="wp-caption alignnone"><a href="https://zappysys.com/blog/wp-content/uploads/2016/01/json-array-flattening-option.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-4760" class="size-full wp-image-4760" src="https://zappysys.com/blog/wp-content/uploads/2016/01/json-array-flattening-option.png" alt="JSON Array Flattening Option in SSIS JSON Source " width="847" height="551" srcset="https://zappysys.com/blog/wp-content/uploads/2016/01/json-array-flattening-option.png 847w, https://zappysys.com/blog/wp-content/uploads/2016/01/json-array-flattening-option-300x195.png 300w, https://zappysys.com/blog/wp-content/uploads/2016/01/json-array-flattening-option-768x500.png 768w" sizes="(max-width: 847px) 100vw, 847px" /></a><p id="caption-attachment-4760" class="wp-caption-text">JSON Array Flattening Option in SSIS JSON Source</p></div>
<p>&nbsp;</p>
<div id="attachment_4761" style="width: 454px" class="wp-caption alignnone"><a href="https://zappysys.com/blog/wp-content/uploads/2016/01/ssis-json-source-columns-denormalize-array-option.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-4761" class="size-full wp-image-4761" src="https://zappysys.com/blog/wp-content/uploads/2016/01/ssis-json-source-columns-denormalize-array-option.png" alt="Column after Array Flattening Option" width="444" height="443" srcset="https://zappysys.com/blog/wp-content/uploads/2016/01/ssis-json-source-columns-denormalize-array-option.png 444w, https://zappysys.com/blog/wp-content/uploads/2016/01/ssis-json-source-columns-denormalize-array-option-150x150.png 150w, https://zappysys.com/blog/wp-content/uploads/2016/01/ssis-json-source-columns-denormalize-array-option-300x300.png 300w" sizes="(max-width: 444px) 100vw, 444px" /></a><p id="caption-attachment-4761" class="wp-caption-text">Column after Array Flattening Option</p></div>
<p>&nbsp;</p>
<h2>Using JSON REST API Connector to parse JSON data</h2>
<p>If you want to access JSON data from REST API then you can use same JSON Source Connector.  All you have to do is rather than local file path c:\data\xyz.json change it to URL as below and you will be able to access and filter JSON data using same technique as above.</p>
<div style="width: 657px" class="wp-caption alignnone"><a href="//zappysys.com/onlinehelp/ssis-powerpack/scr/images/json-source/ssis-json-source-data-from-web-url.png"><img loading="lazy" decoding="async" src="//zappysys.com/onlinehelp/ssis-powerpack/scr/images/json-source/ssis-json-source-data-from-web-url.png" alt="Get JSON data from URL (REST API JSON response)" width="647" height="574" /></a><p class="wp-caption-text">Get JSON data from URL (REST API JSON response)</p></div>
<h2>JSON Path for recursive data extract (Double dot expression)</h2>
<p>There will be a time when you dont know how many levels deep you have to go for data extract. See below example. We will to get all employees id and name from hierarchy. For that you can use double dot like below. As you can see there are many nested levels and we want to extract id and name from each level so data can be</p>
<p><strong>Expected Output</strong></p><pre class="crayon-plain-tag">id      name
-------------------------
100	Jeff (CEO)
200	Bob (VP Sales)
300	Kim (VP HR)
400	Kumar (VP Dev)
210	Ron (Sales Mgr)	
220	Akash (Sales Mgr)	
410	Den (Sr. Dev)	
420	Den (Sr. Dev)
411	Den (Jr. Dev)
412	Sita (Jr. Dev)</pre><p>
<strong>Sample Data</strong></p><pre class="crayon-plain-tag">{
  "employees": [
    {
      "id": 100,
      "name": "Jeff (CEO)",
      "employees": [
        {
          "id": 200,
          "name": "Bob (VP Sales)",
          "employees": [
            {
              "id": 210,
              "name": "Ron (Sales Mgr)"
            },
            {
              "id": 220,
              "name": "Akash (Sales Mgr)"
            }
          ]
        },
        {
          "id": 300,
          "name": "Kim (VP HR)"
        },
        {
          "id": 400,
          "name": "Kumar (VP Dev)",
          "employees": [
            {
              "id": 410,
              "name": "Den (Sr. Dev)",
              "employees": [
                {
                  "id": 411,
                  "name": "Den (Jr. Dev)"
                },
                {
                  "id": 412,
                  "name": "Sita (Jr. Dev)"
                }
              ]
            },
            {
              "id": 420,
              "name": "Den (Sr. Dev)"
            }
          ]
        }
      ]
    }
  ]
}</pre><p>
<strong>Configure JSON Source for Recursive Children Scan using Double Dot JSONPath</strong></p>
<p>Open JSON Source and configure like below.</p>
<p>Set Filter as $..employees[*] (Notice how we used double dots in expression. This does recursive scan for N number of levels)</p>
<div id="attachment_8960" style="width: 1214px" class="wp-caption alignnone"><a href="https://zappysys.com/blog/wp-content/uploads/2016/01/ssis-extract-json-array-recursive-double-dot-jsonpath.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-8960" class="size-full wp-image-8960" src="https://zappysys.com/blog/wp-content/uploads/2016/01/ssis-extract-json-array-recursive-double-dot-jsonpath.png" alt="JSON Path for recursive scan of nested array (many levels deep)" width="1204" height="788" srcset="https://zappysys.com/blog/wp-content/uploads/2016/01/ssis-extract-json-array-recursive-double-dot-jsonpath.png 1204w, https://zappysys.com/blog/wp-content/uploads/2016/01/ssis-extract-json-array-recursive-double-dot-jsonpath-300x196.png 300w, https://zappysys.com/blog/wp-content/uploads/2016/01/ssis-extract-json-array-recursive-double-dot-jsonpath-768x503.png 768w, https://zappysys.com/blog/wp-content/uploads/2016/01/ssis-extract-json-array-recursive-double-dot-jsonpath-1024x670.png 1024w" sizes="(max-width: 1204px) 100vw, 1204px" /></a><p id="caption-attachment-8960" class="wp-caption-text">JSON Path for recursive scan of nested array (many levels deep)</p></div>
<h2>Parse Multi-Dimensional Array</h2>
<p>If you want to learn more how to parse Multi-Dimensional JSON arrays then check <a href="//zappysys.com/blog/parse-multi-dimensional-json-array-ssis/" target="_blank" rel="noopener">this article</a> full length article.</p>
<h3><strong>Sample JSON with Multi Dimensional array</strong></h3>
<pre class="crayon-plain-tag">{
  "columns" : ["Id", "FirstName", "IsActive"],
  "rows" : [ [1,"bob",true], [2,"sam",false], [3,"joe",true] ]
}</pre>
<h3><strong>Array Transformation Options for 2D array</strong></h3>
<p><a href="https://i0.wp.com/zappysys.com/blog/wp-content/uploads/2017/08/ssis-parse-json-array-pattern-1-select-2d-transformation.png"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-1640" src="https://i0.wp.com/zappysys.com/blog/wp-content/uploads/2017/08/ssis-parse-json-array-pattern-1-select-2d-transformation.png?resize=687%2C165" sizes="(max-width: 687px) 100vw, 687px" srcset="https://i0.wp.com/zappysys.com/blog/wp-content/uploads/2017/08/ssis-parse-json-array-pattern-1-select-2d-transformation.png?w=687 687w, https://i0.wp.com/zappysys.com/blog/wp-content/uploads/2017/08/ssis-parse-json-array-pattern-1-select-2d-transformation.png?resize=300%2C72 300w" alt="" width="687" height="165" data-attachment-id="1640" data-permalink="//zappysys.com/blog/parse-multi-dimensional-json-array-ssis/ssis-parse-json-array-pattern-1-select-2d-transformation/#main" data-orig-file="https://i0.wp.com/zappysys.com/blog/wp-content/uploads/2017/08/ssis-parse-json-array-pattern-1-select-2d-transformation.png?fit=687%2C165" data-orig-size="687,165" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="ssis-parse-json-array-pattern-1-select-2d-transformation" data-image-description="" data-medium-file="https://i0.wp.com/zappysys.com/blog/wp-content/uploads/2017/08/ssis-parse-json-array-pattern-1-select-2d-transformation.png?fit=300%2C72" data-large-file="https://i0.wp.com/zappysys.com/blog/wp-content/uploads/2017/08/ssis-parse-json-array-pattern-1-select-2d-transformation.png?fit=687%2C165" /></a></p>
<p><strong>Sample JSON with Multi Dimensional array (No columns in document)</strong></p><pre class="crayon-plain-tag">{
  "rows" : [ [1,"bob",true], [2,"sam",false], [3,"joe",true] ]
}</pre><p>
<strong>Array Transformation Options for 2D array</strong></p>
<p><img decoding="async" src="//zappysys.com/blog/wp-content/uploads/2017/08/ssis-parse-json-array-pattern-2-select-2d-transformation.png" /></p>
<h2>Performance Tips</h2>
<p>In this section we will describe how to make your things faster.</p>
<h3>Reduce number of requests to server by changing page size</h3>
<p>If you are doing <a href="//zappysys.com/blog/odata-paging-rest-api-paging-using-ssis-json-source/" target="_blank" rel="noopener">REST API paging to get full resultset </a> then make sure you adjust page size to appropriate number so total requests sent to server is reduced. Each request to server adds overhead. Most of API supports page size parameter. Refer to your API documentation how to adjust page size.</p>
<h3>Avoid multiple REST API Round trips by caching response</h3>
<p>If you extracting multiple arrays from REST API response using above technique then we recommend you to use <a href="//zappysys.com/products/ssis-powerpack/ssis-rest-api-web-service-task/" target="_blank" rel="noopener">REST API Task </a>so save response to File or variable first and then use cached JSON data multiple times. This approach is not as friendly as others but it can certainly reduce your total API requests.</p>
<h3>Use GZip compression</h3>
<p>If your REST API supports GZip compression then check Enable Gzip on Advanced tab of <a href="//zappysys.com/products/ssis-powerpack/ssis-json-file-source/">SSIS JSON Source (File, REST API Connector).</a> This will compress response in Gzip format from server and when it comes to your server it will be automatically decompressed by JSON Source connector. This seeds up thing significantly if you have lots of data to download.</p>
<h3>Uncheck include parent columns if not needed</h3>
<p>By default JSON Source connect includes parent column (Level above last property in filter) from the Filter path you specify. For Example  if you specify $.store.employees[*] and &#8220;Include parent columns&#8221; checked then It will extract all employees and then also include parent level columns for store (Tip: Parent column name start with P_ by default) . If you don&#8217;t need parent columns then uncheck from output, this reduces many steps during data extract process.</p>
<h2>Download sample package</h2>
<p><a href="//zappysys.com/onlinehelp/ssis-powerpack/scr/images/json-parser-transform/JsonXmlMultiOutputDemo_ParserTransform_2012.zip">Click here to download SSIS 2012 Package</a> (Will work in SSIS 2014, 2016)</p>
<h2>Conclusion</h2>
<p>In this post you learned how to extract data from JSON array and how to make data extract fast. Download <a href="//zappysys.com/products/ssis-powerpack/ssis-json-file-source/">SSIS JSON Source (File, REST API Connector)</a> to try everything listed above.</p>
<p>The post <a href="https://zappysys.com/blog/extract-read-multiple-arrays-from-json-data-file-rest-api-response/">Reading JSON Arrays from file / REST API</a> appeared first on <a href="https://zappysys.com/blog">ZappySys Blog</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>SSIS Code &#8211; Check URL Exists using C# Script &#8211; 404 Error</title>
		<link>https://zappysys.com/blog/ssis-code-check-url-exists-using-c-script-404-error/</link>
		
		<dc:creator><![CDATA[ZappySys]]></dc:creator>
		<pubDate>Wed, 11 Nov 2015 15:56:18 +0000</pubDate>
				<category><![CDATA[SSIS PowerPack]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[json source]]></category>
		<category><![CDATA[rest api]]></category>
		<category><![CDATA[script task]]></category>
		<guid isPermaLink="false">http://zappysys.com/blog/?p=146</guid>

					<description><![CDATA[<p>In this post you will learn how to use SSIS Script Task (C# Code) to detect specific URL found or not (Detect HTTP 404 Error) If you using SSIS JSON Source or our REST API Task then if URL/Document you trying to read not found then server may return 404 (Not Found) Exception. In order [&#8230;]</p>
<p>The post <a href="https://zappysys.com/blog/ssis-code-check-url-exists-using-c-script-404-error/">SSIS Code &#8211; Check URL Exists using C# Script &#8211; 404 Error</a> appeared first on <a href="https://zappysys.com/blog">ZappySys Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>In this post you will learn how to use <strong>SSIS Script Task</strong> (<strong>C# Code</strong>) to detect specific URL found or not (<strong>Detect HTTP 404 Error</strong>)</p>
<p>If you using <a href="//zappysys.com/products/ssis-powerpack/ssis-json-file-source/">SSIS JSON Source</a> or our <a href="//zappysys.com/products/ssis-powerpack/ssis-rest-api-web-service-task/">REST API Task </a>then if URL/Document you trying to read not found then server may return 404 (Not Found) Exception. In order to handle this error gracefully you can use following Script to store status in a variable and then you can use conditional Control Flow to Skip data loading from Web Service.</p>
<p>Step1: Drag Script Task from toolbox<br />
Step2: Select Language as <strong>C#</strong><br />
Step3: Select Readonly variable (In this case &#8220;User::url&#8221; &#8211; String Type)<br />
Step4: Select ReadWrite variable (In this case &#8220;User::found&#8221; &#8211; Boolean Type)<br />
Step5: Edit code and paste following script in your script task</p>
<div id="attachment_147" style="width: 598px" class="wp-caption alignnone"><a href="//zappysys.com/blog/wp-content/uploads/2015/11/ssis-check-url-exists-catch-404-error.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-147" class="size-full wp-image-147" src="//zappysys.com/blog/wp-content/uploads/2015/11/ssis-check-url-exists-catch-404-error.png" alt="SSIS C# Code - Check URL Exists (Catch 404 Not Found Error) " width="588" height="403" srcset="https://zappysys.com/blog/wp-content/uploads/2015/11/ssis-check-url-exists-catch-404-error.png 588w, https://zappysys.com/blog/wp-content/uploads/2015/11/ssis-check-url-exists-catch-404-error-300x206.png 300w" sizes="(max-width: 588px) 100vw, 588px" /></a><p id="caption-attachment-147" class="wp-caption-text">SSIS C# Code &#8211; Check URL Exists (Catch 404 Not Found Error)</p></div>
<h2>C# Code: Check URL Exists (Detect 404 Error)</h2>
<pre class="crayon-plain-tag">public void Main()
	{
		// TODO: Add your code here
            Dts.Variables["found"].Value = UrlFound(Dts.Variables["url"].Value.ToString());
		Dts.TaskResult = (int)ScriptResults.Success;
	}

        private bool UrlFound(string url)
        {
            try
            {
                var request = WebRequest.Create(url);
                var response = request.GetResponse();
                return true;
            }
            catch (WebException we)
            {
                HttpWebResponse errorResponse = we.Response as HttpWebResponse;
                if (errorResponse != null)
                    if (errorResponse.StatusCode == HttpStatusCode.NotFound)
                    {
                        return false;
                    }
                    else
                        throw; //we only look for 404 Error
            }
            return false;
        }</pre>
<p>The post <a href="https://zappysys.com/blog/ssis-code-check-url-exists-using-c-script-404-error/">SSIS Code &#8211; Check URL Exists using C# Script &#8211; 404 Error</a> appeared first on <a href="https://zappysys.com/blog">ZappySys Blog</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to read Twitter data in SSIS using REST API Call</title>
		<link>https://zappysys.com/blog/read-twitter-data-in-ssis-using-rest-api-task-json-source-oauth2/</link>
		
		<dc:creator><![CDATA[ZappySys]]></dc:creator>
		<pubDate>Thu, 22 Oct 2015 16:09:00 +0000</pubDate>
				<category><![CDATA[REST API Integration]]></category>
		<category><![CDATA[SSIS REST API Task]]></category>
		<category><![CDATA[API Integration]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[json source]]></category>
		<category><![CDATA[looping]]></category>
		<category><![CDATA[oauth]]></category>
		<category><![CDATA[oauth2]]></category>
		<category><![CDATA[OAuthApp]]></category>
		<category><![CDATA[rest api]]></category>
		<category><![CDATA[SSIS PowerPack]]></category>
		<category><![CDATA[twitter]]></category>
		<guid isPermaLink="false">http://zappysys.com/blog/?p=93</guid>

					<description><![CDATA[<p>Introduction In this article you will how to Read Twitter data in SSIS using SSIS JSON Source and SSIS REST API Web Service Task. You will also learn about latest OAuth 2.0 Protocol to simplify REST API access. Twitter REST API Authentication In order to fetch any data from twitter using OAuth REST API calls [&#8230;]</p>
<p>The post <a href="https://zappysys.com/blog/read-twitter-data-in-ssis-using-rest-api-task-json-source-oauth2/">How to read Twitter data in SSIS using REST API Call</a> appeared first on <a href="https://zappysys.com/blog">ZappySys Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Introduction</h2>
<p><a href="//zappysys.com/blog/wp-content/uploads/2015/10/twitter-api-integration.png"><img loading="lazy" decoding="async" class="alignleft wp-image-1660" src="//zappysys.com/blog/wp-content/uploads/2015/10/twitter-api-integration.png" alt="" width="180" height="146" /></a>In this article you will <em>how to Read Twitter data in SSIS</em> using <a href="//zappysys.com/products/ssis-powerpack/ssis-json-file-source/">SSIS JSON Source</a> and <a href="//zappysys.com/products/ssis-powerpack/ssis-rest-api-web-service-task/">SSIS REST API Web Service Task</a>. You will also learn about latest OAuth 2.0 Protocol to simplify REST API access.</p>
<h2>Twitter REST API Authentication</h2>
<p>In order to fetch any data from twitter using OAuth REST API calls you have to obtain two Keys (Consumer Key [Like UserID] and Consumer Secret [Like Password]). There are mainly two methods to read data from Twitter. Using <strong>Application-user authentication</strong> and <strong>Application Only authentication</strong>. Use correct method depending what type of information you want to pull from twitter. Most common method is <strong>Application-user authentication</strong> . If you want to read more about other methods then <a href="https://developer.twitter.com/en/docs/basics/authentication/overview" target="_blank" rel="noopener">click here</a></p>
<h2>Method 1 &#8211; Read Twitter data in SSIS using Application-user authentication</h2>
<p>In this method you will need twitter user account to connect Twitter API. Once first time authorization is done you don&#8217;t have to re-authenticate. Certain type of API calls only allowed by this method (such as POST new tweet using API). For any API call in Twitter very first step is create OAuth App (i.e. Register new App in Twitter developer portal).</p>
<h3>Using Default OAuth App Created by ZappySys</h3>
<p>To make your life easy ZappySys provides default App for certain OAuth providers (e.g. Google, Twitter). If you decide to create your own app for whatever reason then check next section on how to register twitter OAuth Application. See below screenshot how to use Twitter OAuth connection using Default App. Once you click Generate Token it will prompt you to login using Twitter account and then you can grant permission.</p>
<p><strong>Step-By-Step</strong></p>
<ol>
<li>Download and Install <a href="//zappysys.com/products/ssis-powerpack/" target="_blank" rel="noopener">SSIS PowerPack FREE Trial</a> from <a href="//zappysys.com/products/ssis-powerpack/download/" target="_blank" rel="noopener">this link</a></li>
<li>Create new SSIS Project and add new package.</li>
<li>Open Package. Go to control flow. Drag and drop Data Flow task from SSIS Toolbox
<div id="attachment_8028" style="width: 470px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2019/02/drag-and-drop-data-flow-task.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-8028" class="size-full wp-image-8028" src="https://zappysys.com/blog/wp-content/uploads/2019/02/drag-and-drop-data-flow-task.png" alt="" width="460" height="155" srcset="https://zappysys.com/blog/wp-content/uploads/2019/02/drag-and-drop-data-flow-task.png 460w, https://zappysys.com/blog/wp-content/uploads/2019/02/drag-and-drop-data-flow-task-300x101.png 300w" sizes="(max-width: 460px) 100vw, 460px" /></a><p id="caption-attachment-8028" class="wp-caption-text">Dragging and dropping Data Flow Task into Control Flow</p></div></li>
<li>Go to Data flow designer.Drag and drop ZS JSON Source Component and double on it to configure it.
<div id="attachment_3766" style="width: 604px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2018/05/ssis-json-source-for-getting-basic-profile-from-linkedin.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-3766" class="size-full wp-image-3766" src="https://zappysys.com/blog/wp-content/uploads/2018/05/ssis-json-source-for-getting-basic-profile-from-linkedin.png" alt="Drag and Drop JSON Source Component" width="594" height="268" srcset="https://zappysys.com/blog/wp-content/uploads/2018/05/ssis-json-source-for-getting-basic-profile-from-linkedin.png 594w, https://zappysys.com/blog/wp-content/uploads/2018/05/ssis-json-source-for-getting-basic-profile-from-linkedin-300x135.png 300w" sizes="(max-width: 594px) 100vw, 594px" /></a><p id="caption-attachment-3766" class="wp-caption-text">Drag and Drop JSON Source Component</p></div></li>
<li>Enter any twitter API URL you want to call such as below<br />
<pre class="crayon-plain-tag">https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=zappysys&amp;count=4</pre>
</li>
<li>Now check use credentials option</li>
<li>Select new ZS-OAuth connection from dropdown</li>
<li>When new connection dialogbox pops up select Twitter from providers dropdown. Select Default App option for now.</li>
<li>Click Generate Token. It may ask you to login using your Twitter account credentials. If prompted click Approve.</li>
<li>If twitter OAuth grant approved then you will see Access Token and Access Token Secret both populated</li>
<li>Click Test Connection and if it works then click OK to close connection</li>
<li>On JSON Source you can now click Preview to see data from Twitter</li>
<li>You can optionally specify Filter expression [Click Select Filter button] to select result from specific JSON Node. For example if you want to select all Hashtags used inside each Tweet then select Filter like <strong>$.entities.hashtags[*]</strong></li>
<li>Click OK to close the UI</li>
<li>Drag ZS Trash Destination from Toolbox (Or you can use OLEDB Destination if you want to load inside SQL Server)</li>
<li>Connect JSON Source to ZS Trash Destination</li>
<li>Execute SSIS package</li>
</ol>
<div id="attachment_652" style="width: 710px" class="wp-caption alignnone"><a href="//zappysys.com/blog/wp-content/uploads/2015/10/fetch-twitter-data-rest-api-call-ssis-oauth-connection.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-652" class="wp-image-652" src="//zappysys.com/blog/wp-content/uploads/2015/10/fetch-twitter-data-rest-api-call-ssis-oauth-connection.png" alt="Call Twitter REST API in SSIS - using OAuth Connection (Default App)" width="700" height="592" srcset="https://zappysys.com/blog/wp-content/uploads/2015/10/fetch-twitter-data-rest-api-call-ssis-oauth-connection.png 867w, https://zappysys.com/blog/wp-content/uploads/2015/10/fetch-twitter-data-rest-api-call-ssis-oauth-connection-300x254.png 300w" sizes="(max-width: 700px) 100vw, 700px" /></a><p id="caption-attachment-652" class="wp-caption-text">Call Twitter REST API in SSIS &#8211; using OAuth Connection (Default App)</p></div>
<h3>Using Custom OAuth App Created by you</h3>
<p>For some reason if you dont want to use Default Twitter App then you can register Custom App. It requires few extra steps listed in next section but it wont take more than few minutes. In Custom App option you have to specify ClientId and Client Secret (in above screenshot). Once you click Generate Token it will prompt you to login using Twitter account and then you can grant permission.</p>
<h3>Register/Create OAuth Application for twitter API Access</h3>
<p>Now lets look at how to register OAuth Application for Twitter API access.</p>
<p>Goto <a href="https://apps.twitter.com/app/new" target="_blank" rel="noopener">https://apps.twitter.com/app/new</a> and create new app by providing necessary information. Don&#8217;t get confused by calling it App, its just way in twitter to create multiple API Access Keys so you can grant different level of access to different users. Once app is created you will be taken to page where your Consumer Key and Secret Key will be listed.</p>
<div id="attachment_103" style="width: 502px" class="wp-caption alignnone"><a href="//zappysys.com/blog/wp-content/uploads/2015/10/create-twitter-app-access-new-consumer-key-secreat-key.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-103" class="size-full wp-image-103" src="//zappysys.com/blog/wp-content/uploads/2015/10/create-twitter-app-access-new-consumer-key-secreat-key.png" alt="Create Twitter Application - REST API Access for Developer" width="492" height="643" srcset="https://zappysys.com/blog/wp-content/uploads/2015/10/create-twitter-app-access-new-consumer-key-secreat-key.png 492w, https://zappysys.com/blog/wp-content/uploads/2015/10/create-twitter-app-access-new-consumer-key-secreat-key-230x300.png 230w" sizes="(max-width: 492px) 100vw, 492px" /></a><p id="caption-attachment-103" class="wp-caption-text">Create Twitter Application &#8211; REST API Access for Developer</p></div>
<h3>Obtaining Consumer Key and Consumer Secret from Twitter</h3>
<p>Once app is created you can go to <b>Keys and Access Tokens</b> tab. Here you will find Consumer Key and Consumer Secret.<br />
Consumer Key can be Public but Consumer Secret must not be shared (think it like a password).</p>
<div id="attachment_102" style="width: 661px" class="wp-caption alignnone"><a href="//zappysys.com/blog/wp-content/uploads/2015/10/twitter-api-consumer-key-and-access-key.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-102" class="size-full wp-image-102" src="//zappysys.com/blog/wp-content/uploads/2015/10/twitter-api-consumer-key-and-access-key.png" alt="Obtain Twitter API Consumer Key and Consumer Secret - REST API Access for Developer" width="651" height="465" srcset="https://zappysys.com/blog/wp-content/uploads/2015/10/twitter-api-consumer-key-and-access-key.png 651w, https://zappysys.com/blog/wp-content/uploads/2015/10/twitter-api-consumer-key-and-access-key-300x214.png 300w" sizes="(max-width: 651px) 100vw, 651px" /></a><p id="caption-attachment-102" class="wp-caption-text">Obtain Twitter API Consumer Key and Consumer Secret &#8211; REST API Access for Developer</p></div>
<h2>Method 2 &#8211; Read Twitter data in SSIS &#8211; Application-only authentication</h2>
<p>For some reason if you don&#8217;t want to use Twitter user account to access data (e.g. Giving access to consultant so he can access you company Twitter Account via API). In this scenario you have to use Application Only method. In this method you don&#8217;t authorize application using Login form.</p>
<p>Here is our basic flow to access twitter data.</p>
<ol>
<li>Get Bearer Access Token by calling https://api.twitter.com/oauth2/token service (Use POST method and Pass BASE64 encoded ConsumerKey and Consumer Secret)</li>
<li>Call any twitter service by passing Bearer AccessToken we retrieved in previous step.<strong>NOTE:</strong> Any access to twitter service is over HTTPS so automatically your tokens passed along request is encrypted before sending over wire unless someone know how to hack SSL 🙂</li>
</ol>
<h3>Application Only Authentication using REST API task &#8211; Get Access Token</h3>
<p>Once we create SSIS Package &#8211; First step to access any twitter data will be get Access Token. As you can see from below screenshot we have called https://api.twitter.com/oauth2/token service URL with POST method. Notice how we have supplied POST data and 2 headers. Authorization header contains BASE64 encoded value of <strong>YourConsumerKey:YourConsumerSecret</strong></p>
<div id="attachment_107" style="width: 841px" class="wp-caption alignnone"><a href="//zappysys.com/blog/wp-content/uploads/2015/10/ssis-twitter-rest-api-call-get-token.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-107" class="size-full wp-image-107" src="//zappysys.com/blog/wp-content/uploads/2015/10/ssis-twitter-rest-api-call-get-token.png" alt="SSIS Twitter REST API Get Token" width="831" height="465" srcset="https://zappysys.com/blog/wp-content/uploads/2015/10/ssis-twitter-rest-api-call-get-token.png 831w, https://zappysys.com/blog/wp-content/uploads/2015/10/ssis-twitter-rest-api-call-get-token-300x168.png 300w" sizes="(max-width: 831px) 100vw, 831px" /></a><p id="caption-attachment-107" class="wp-caption-text">SSIS Twitter REST API Get Token</p></div>
<h3>Fetch data from Twitter using JSON Source &#8211; Deformalize nested JSON</h3>
<p>Once we have Authentication Token we are ready <b>pull twitter data</b> using JSON Source. Check below screenshot how we have supplied Token in Authorization Header. JSON Source can make your JSON look like normal table (It also de-normalize nested JSON into flat dataset. If you want to extract subset of JSON then simply specify JSON Path expression e.g. $.data.users[*]
<div id="attachment_108" style="width: 852px" class="wp-caption alignnone"><a href="//zappysys.com/blog/wp-content/uploads/2015/10/read-twitter-data-in-ssis-json-source-rest-api.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-108" class="size-full wp-image-108" src="//zappysys.com/blog/wp-content/uploads/2015/10/read-twitter-data-in-ssis-json-source-rest-api.png" alt="Read JSON response of Twitter REST API in SSIS" width="842" height="520" srcset="https://zappysys.com/blog/wp-content/uploads/2015/10/read-twitter-data-in-ssis-json-source-rest-api.png 842w, https://zappysys.com/blog/wp-content/uploads/2015/10/read-twitter-data-in-ssis-json-source-rest-api-300x185.png 300w" sizes="(max-width: 842px) 100vw, 842px" /></a><p id="caption-attachment-108" class="wp-caption-text">Read JSON response of Twitter REST API in SSIS</p></div>
<h3>Load Twitter JSON data to SQL Server</h3>
<p>You can easily connect your <a href="//zappysys.com/products/ssis-powerpack/ssis-json-file-source/">SSIS JSON Source</a> to OLEDB Destination if you want to load Twitter Data to some RDBMS such as SQL Server, MySQL.</p>
<h2>Handling paging of large REST API result set with twitter data &#8211; looping/cursoring</h2>
<p>Most of REST API limit total data sent in single response. So if you wish to get all records then you have to loop through multiple results. Twitter provides looping mechanism using Cursor<a href="https://dev.twitter.com/overview/api/cursoring" target="_blank" rel="noopener">Click here to read more</a></p>
<p>In our case <a href="//zappysys.com/products/ssis-powerpack/ssis-json-file-source/">SSIS JSON Source</a> Supports Paging very well so we are covered. To loop through multiple result sets of twitter data simply configure following 3 properties. See below screenshot.</p>
<div id="attachment_100" style="width: 514px" class="wp-caption alignnone"><a href="//zappysys.com/blog/wp-content/uploads/2015/10/loop-through-twitter-rest-api-result-cursor-paging.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-100" class="size-full wp-image-100" src="//zappysys.com/blog/wp-content/uploads/2015/10/loop-through-twitter-rest-api-result-cursor-paging.png" alt="Twitter REST API - Paging Example -Loop through resultset using cursor" width="504" height="440" srcset="https://zappysys.com/blog/wp-content/uploads/2015/10/loop-through-twitter-rest-api-result-cursor-paging.png 504w, https://zappysys.com/blog/wp-content/uploads/2015/10/loop-through-twitter-rest-api-result-cursor-paging-300x262.png 300w" sizes="(max-width: 504px) 100vw, 504px" /></a><p id="caption-attachment-100" class="wp-caption-text">Twitter REST API &#8211; Paging Example -Loop through resultset using cursor</p></div>
<h2>Word of caution about too many requests</h2>
<p>Twitter does not allow you request too much data too quickly so be careful how many requests you make :). Check their official page on twitter Rate Limit for REST API. You can add delay after each request if you doing pagination. Go to <strong>Throttling tab</strong> of JSON/XML Source. You can change setting there based on API restriction. For example if API allows only 30 requests per minute then adding 2 seconds delay will make sure you wont exceed 30 requests in 1 minute.</p>
<p>To learn more about <a href="https://dev.twitter.com/rest/public/rate-limits" target="_blank" rel="noopener">rate limit of Twitter API check this table</a></p>
<h2>Handling Twitter API Date Format (Parse Twitter Date/Time)</h2>
<p>Twitter returns date in the following format e.g. Fri May 03 15:22:09 +0000 2013 to parse this to correct date/time datatype you can use Date/Time Handling Tab of JSON/XML Source.</p>
<p>Change Custom Date Format as below and preview Twitter data.</p>
<div id="attachment_693" style="width: 821px" class="wp-caption alignnone"><a href="//zappysys.com/blog/wp-content/uploads/2015/10/parse-twitter-date-time-format.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-693" class="size-full wp-image-693" src="//zappysys.com/blog/wp-content/uploads/2015/10/parse-twitter-date-time-format.png" alt="Parsing Twitter API date/time format" width="811" height="249" srcset="https://zappysys.com/blog/wp-content/uploads/2015/10/parse-twitter-date-time-format.png 811w, https://zappysys.com/blog/wp-content/uploads/2015/10/parse-twitter-date-time-format-300x92.png 300w" sizes="(max-width: 811px) 100vw, 811px" /></a><p id="caption-attachment-693" class="wp-caption-text">Parsing Twitter API date/time format</p></div>
<h2>Download related files</h2>
<p>Below is sample SSIS package<br />
<a href="//zappysys.com/blog/wp-content/uploads/2015/11/TwitterFetchDemo_2012.zip">Twitter Demo SSIS 2012</a></p>
<h2>Conclusion</h2>
<p>So you have now seen how easy it is to access twitter data with OAuth 2.0 using <a href="//zappysys.com/products/ssis-powerpack/ssis-json-file-source/">SSIS JSON Source</a> and <a href="//zappysys.com/products/ssis-powerpack/ssis-rest-api-web-service-task/">SSIS REST API Web Service Task</a>. We have also seen how to loop through large resultset using inbuilt Paging support of JSON Source.</p>
<p>The post <a href="https://zappysys.com/blog/read-twitter-data-in-ssis-using-rest-api-task-json-source-oauth2/">How to read Twitter data in SSIS using REST API Call</a> appeared first on <a href="https://zappysys.com/blog">ZappySys Blog</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to Call REST API in SSIS &#8211; Read JSON / XML / CSV</title>
		<link>https://zappysys.com/blog/call-rest-api-using-ssis-web-service-task/</link>
		
		<dc:creator><![CDATA[ZappySys]]></dc:creator>
		<pubDate>Mon, 03 Aug 2015 04:41:10 +0000</pubDate>
				<category><![CDATA[SSIS REST API Task]]></category>
		<category><![CDATA[client certificate]]></category>
		<category><![CDATA[cookies]]></category>
		<category><![CDATA[http post]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[json source]]></category>
		<category><![CDATA[oauth]]></category>
		<category><![CDATA[odata]]></category>
		<category><![CDATA[paging]]></category>
		<category><![CDATA[rest api]]></category>
		<category><![CDATA[rest api task]]></category>
		<category><![CDATA[SSIS PowerPack]]></category>
		<category><![CDATA[web service]]></category>
		<category><![CDATA[xml]]></category>
		<guid isPermaLink="false">http://zappysys.com/blog/?p=22</guid>

					<description><![CDATA[<p>Introduction The REST API is becoming increasingly popular in the Data Integration landscape. If you are an SSIS Developer (not a coder) and stumbled upon a question What is REST API and how to consume API inside an SSIS package?&#8221; then you are at the right place :). We encourage you to read this article carefully and [&#8230;]</p>
<p>The post <a href="https://zappysys.com/blog/call-rest-api-using-ssis-web-service-task/">How to Call REST API in SSIS &#8211; Read JSON / XML / CSV</a> appeared first on <a href="https://zappysys.com/blog">ZappySys Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Introduction</h2>
<p><a href="https://zappysys.com/blog/wp-content/uploads/2018/06/REST-API-icon.jpg"><img loading="lazy" decoding="async" class=" wp-image-4254 alignleft" src="https://zappysys.com/blog/wp-content/uploads/2018/06/REST-API-icon.jpg" alt="Logo REST API" width="122" height="130" /></a>The REST API is becoming increasingly popular in the Data Integration landscape. <span style="box-sizing: border-box; margin: 0px; padding: 0px;">If you are an SSIS Developer (not a coder) and stumbled upon a question What is REST API and <em>how to consume API inside an SSIS package?</em>&#8221; then you are at the right place :).</span> We encourage you to read this article carefully and follow the various links we provided.</p>
<p>In this article, you will learn about many REST API Tips / Tools on the topic <em>of how to call a REST API using </em><a target="_blank" rel="noopener"><em>the SSIS REST API Task</em></a><em>, </em><a target="_blank" rel="noopener"><em>JSON Source,</em></a><em> or </em><a target="_blank" rel="noopener"><em>XML Source</em></a>. You will also learn how to perform <em>HTTP GET </em>and <em>HTTP POST Requests</em> without needing to know any programming languages (e.g., C#, Java, Python) &#8211; simply do a drag-and-drop operation in SSIS.</p>
<h2></h2>
<h2>What is REST API / RESTful Web Service</h2>
<p>Let&#8217;s first understand <strong>what a REST API</strong> is, also sometimes referred to as a <strong>RESTful Web Service</strong>. This is a new buzzword that you will likely hear frequently. More and more services are available in the Cloud, which makes it obvious to come up with some way for you to access data in a more firewall-friendly manner. What can be a better option than accessing it using a several-decade-old HTTP protocol, so no additional configuration is required for anybody accessing Cloud Services?</p>
<p>So, in short highlights for <em>REST Web Service</em></p>
<ul>
<li><em>REST Web Service</em> is a stateless client-server service model</li>
<li>By passing an <strong>HTTP verb,</strong> you can perform server-side action over the standard HTTP protocol (e.g., GET, POST, LIST, DELETE, HEAD)</li>
<li>You can pass <strong>parameters via URL</strong> query string and via <strong>HTTP Headers</strong></li>
<li>If you are doing HTTP POST, then you can <strong>pass additional data in the Request Body</strong> along with the other two methods described above</li>
<li><i>REST API</i> works by sending an HTTP Request and getting an <strong>HTTP Response</strong></li>
<li>The HTTP Response of a web service can contain Headers and Response Data, which can be in binary, text, JSON, XML, or other formats.</li>
<li>You can secure your data by simply sending it over the <strong>HTTPS (Secure HTTP) protocol</strong> or encrypting values passed along with your request.</li>
</ul>
<h2>Tasks/Components in SSIS for Consuming RESTful API / WebService</h2>
<div class="su-table su-table-alternate">
<table>
<colgroup>
<col style="vertical-align: top" width="100" />
<col style="vertical-align: top" /></colgroup>
<tbody>
<tr>
<td><img decoding="async" style="width: 72px;height: 72px" src="//zappysys.com/images/ssis-powerpack/SSIS-Json-Source-Adapter.png" alt="Custom SSIS Components - Json Source" /></td>
<td style="vertical-align: top"><a target="_blank" rel="noopener">JSON Source</a> (Read from REST API, JSON file or OData Service): Use this dataflow component when you have to <strong>fetch data from a REST API web service like a table</strong>. This component enables you to extract JSON data from web services and de-normalize nested structures, allowing you to save the data to a Relational database, such as SQL Server, or any other target (Oracle, FlatFile, Excel, MySQL). This component also supports reading local JSON files or direct JavaScript strings (Wildcard pattern support, e.g., c:\data\file*.json).</td>
</tr>
<tr>
<td><img decoding="async" style="width: 72px;height: 72px" src="//zappysys.com/onlinehelp/ssis-powerpack/scr/images/web-api-destination/ssis-web-api-destination.png" alt="SSIS Custom Target Adapter - Web API Destination" /></td>
<td style="vertical-align: top"><a href="//zappysys.com/products/ssis-powerpack/ssis-web-api-destination-connector/">Web API Destination</a> (POST data to API URL): Use this data flow component when you need to load data into a target system via API calls (<a href="https://zappysys.com/blog/http-post-in-ssis-send-data-to-web-api-url-json-xml/" target="_blank" rel="noopener">POST to URL</a>). E.g., Loading Contacts into a Marketing System like <a href="//zappysys.com/blog/get-data-from-mailchimp-in-ssis-using-rest-api-call/" target="_blank" rel="noopener">MailChimp</a> for email campaigns. Loading documents into CRM or document storage systems, e.g,. Couchbase or <a href="//zappysys.com/blog/call-elasticsearch-api-using-ssis/" target="_blank" rel="noopener">ElasticSearch</a>.</td>
</tr>
<tr>
<td><img decoding="async" style="width: 72px;height: 72px" src="//zappysys.com/images/ssis-powerpack/ssis-rest-api-web-service-task.png" alt="Custom SSIS Tasks - SSIS Rest Api Web Service Task" /></td>
<td style="vertical-align: top"><a target="_blank" rel="noopener">REST API Tak</a>: Use this task when you don’t want to pull REST API data in tabular format but want to call the REST API for POST data to the server, DELETE data from the server, or things like download an HTML page, extract Authentication tokens, etc, where you are not necessarily dealing with data in tabular format. This task also allows you many other options, such as saving the RAW response into a variable or a file.</td>
</tr>
<tr>
<td><img decoding="async" style="width: 72px;height: 72px" src="//zappysys.com/images/ssis-powerpack/ssis-xml-source.png" alt="Custom SSIS Components - XML Source (Read File/SOAP/REST Web Service)" /></td>
<td style="vertical-align: top"><a target="_blank" rel="noopener">XML Source</a> (SOAP, File, REST): Use this dataflow component when you have to fetch data from an XML or SOAP web service and consume data like a table. This component allows you to extract data from a web service and save it to SQL Server or any other target (Oracle, FlatFile, Excel, MySQL). This component also supports reading local XML files or a direct XML string.</td>
</tr>
<tr>
<td><img loading="lazy" decoding="async" class="alignnone" style="width: 72px;height: 72px" src="https://zappysys.com/onlinehelp/ssis-powerpack/scr/images/csv-source/ssis-csv-file-source.png" alt="Custom SSIS Components - CSV Source (Read File/REST API)" width="128" height="128" /></td>
<td style="vertical-align: top"><a href="https://zappysys.com/products/ssis-powerpack/ssis-csv-file-source-flat-file-web-api/">CSV Source</a> (File, REST): Use this dataflow component when you have to fetch data from File or REST API which returns data in CSV format . This component allows you to extract data from a web service and save it to SQL Server or any other target (Oracle, FlatFile, Excel, MySQL). This component also supports reading local CSV files or direct CSV string.</td>
</tr>
</tbody>
</table>
</div>
<h2>Using SSIS JSON Source to read from REST API and load into SQL Server</h2>
<div>
<p>If you need to consume a REST API Service and store the result into SQL Server or any other RDBMS/FLAT File, then you can check this <a target="_blank" rel="noopener">SSIS JSON Source</a>. The JSON Source can deserialize your nested JSON (it also supports JSONPath filter expressions).</p>
<table>
<tbody>
<tr>
<td><a href="https://zappysys.com/blog/call-rest-api-using-ssis-web-service-task/"><img decoding="async" src="https://zappysys.com/blog/wp-content/plugins/wp-youtube-lyte/lyteCache.php?origThumbUrl=%2F%2Fi.ytimg.com%2Fvi%2FaO8cVRyCBWw%2Fhqdefault.jpg" alt="YouTube Video"></a><br /><br /></td>
</tr>
</tbody>
</table>
</div>
<h2>REST API Task &#8211; Ad-hoc web requests &#8211; Call REST API (POST, DELETE)</h2>
<table>
<tbody>
<tr>
<td><a href="https://zappysys.com/blog/call-rest-api-using-ssis-web-service-task/"><img decoding="async" src="https://zappysys.com/blog/wp-content/plugins/wp-youtube-lyte/lyteCache.php?origThumbUrl=%2F%2Fi.ytimg.com%2Fvi%2FjPdcQlWOBZA%2Fhqdefault.jpg" alt="YouTube Video"></a><br /><br /></td>
</tr>
</tbody>
</table>
<h2>HTTP GET Request using SSIS Web Service Task or JSON/XML Source</h2>
<div>Calling the REST API from the <strong>SQL Server BI Stack</strong> usually requires programming skills. <span style="box-sizing: border-box; margin: 0px; padding: 0px;">However, in this section, we will learn how easy it is to call <strong>a RESTful Web Service</strong> using the SSIS Web Service Task, JSON Source, or XML Source (all of which are drag-and-drop components</span>).</div>
<p>In this example, we will retrieve JSON data from an OData web service.</p>
<ul>
<li><a title="Download - SSIS REST API Web Service Task" href="//zappysys.com/products/ssis-powerpack/download/">Download and Install SSIS PowerPack</a></li>
<li>Create a new sample SSIS package in BIDS/SSDT</li>
<li>From the SSIS Toolbox, look for items starting with &#8220;ZS&#8221;. Drag and Drop [ZS Rest API Web Service Task] to Designer Surface</li>
<li>Configure HTTP Request properties as below</li>
<li>Configure HTTP Response properties as below</li>
<li>Run SSIS Package</li>
</ul>
<h3>Pass values in HTTP Headers</h3>
<div>
<p>You can pass a value in HTTP Headers using a direct approach or a dynamic approach. If you wish to pass a value from an SSIS variable, then use a variable placeholder, e.g., {{User::varSomeVariable}}. You can also use a variable format specifier, e.g.</p>
<ul>
<li><strong>Format Date:</strong> {{User::varSomeVariable,yyyy-MM-dd}}</li>
<li><strong>Encode into BASE64:</strong> {{User::varSomeVariable,BASE64ENC}}</li>
<li><strong>Decode into plain text from BASE64:</strong> {{User::varSomeVariable,BASE64DEC}}</li>
</ul>
</div>
<div>
<div id="attachment_11523" style="width: 848px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2015/08/SSIS-REST-Api-Task-HTTP-POST-SSIS-Call-Web-Service.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-11523" class="size-full wp-image-11523" src="https://zappysys.com/blog/wp-content/uploads/2015/08/SSIS-REST-Api-Task-HTTP-POST-SSIS-Call-Web-Service.png" alt="" width="838" height="735" srcset="https://zappysys.com/blog/wp-content/uploads/2015/08/SSIS-REST-Api-Task-HTTP-POST-SSIS-Call-Web-Service.png 838w, https://zappysys.com/blog/wp-content/uploads/2015/08/SSIS-REST-Api-Task-HTTP-POST-SSIS-Call-Web-Service-300x263.png 300w, https://zappysys.com/blog/wp-content/uploads/2015/08/SSIS-REST-Api-Task-HTTP-POST-SSIS-Call-Web-Service-768x674.png 768w" sizes="(max-width: 838px) 100vw, 838px" /></a><p id="caption-attachment-11523" class="wp-caption-text">Calling REST API in SSIS using REST API Task, Pass headers, Body, Url Parameters</p></div>
<div class="mceTemp"></div>
</div>
<div>
<div id="attachment_11522" style="width: 848px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2015/08/SSIS-REST-Api-Task-HTTP-GET-Test-SSIS-Web-Service-Call-Pass-Custom-Header.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-11522" class="size-full wp-image-11522" src="https://zappysys.com/blog/wp-content/uploads/2015/08/SSIS-REST-Api-Task-HTTP-GET-Test-SSIS-Web-Service-Call-Pass-Custom-Header.png" alt="" width="838" height="735" srcset="https://zappysys.com/blog/wp-content/uploads/2015/08/SSIS-REST-Api-Task-HTTP-GET-Test-SSIS-Web-Service-Call-Pass-Custom-Header.png 838w, https://zappysys.com/blog/wp-content/uploads/2015/08/SSIS-REST-Api-Task-HTTP-GET-Test-SSIS-Web-Service-Call-Pass-Custom-Header-300x263.png 300w, https://zappysys.com/blog/wp-content/uploads/2015/08/SSIS-REST-Api-Task-HTTP-GET-Test-SSIS-Web-Service-Call-Pass-Custom-Header-768x674.png 768w" sizes="(max-width: 838px) 100vw, 838px" /></a><p id="caption-attachment-11522" class="wp-caption-text">SSIS REST Api Task &#8211; HTTP GET, Test SSIS Web Service Call, Pass Custom Header</p></div>
</div>
<div>
<div class="mceTemp"></div>
<div id="attachment_11524" style="width: 848px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2015/08/SSIS-REST-Api-Task-Validate-Status-Code-Content-and-Header.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-11524" class="size-full wp-image-11524" src="https://zappysys.com/blog/wp-content/uploads/2015/08/SSIS-REST-Api-Task-Validate-Status-Code-Content-and-Header.png" alt="" width="838" height="735" srcset="https://zappysys.com/blog/wp-content/uploads/2015/08/SSIS-REST-Api-Task-Validate-Status-Code-Content-and-Header.png 838w, https://zappysys.com/blog/wp-content/uploads/2015/08/SSIS-REST-Api-Task-Validate-Status-Code-Content-and-Header-300x263.png 300w, https://zappysys.com/blog/wp-content/uploads/2015/08/SSIS-REST-Api-Task-Validate-Status-Code-Content-and-Header-768x674.png 768w" sizes="(max-width: 838px) 100vw, 838px" /></a><p id="caption-attachment-11524" class="wp-caption-text">REST API response validation ( By status code, content, header)</p></div>
</div>
<div></div>
<h3>Pass values in the Query String dynamically</h3>
<div>Most web services usually accept parameters via the query string. You can also use variable placeholders to make your URL with Querystring dynamic (e.g., https://mysite.com/orderservice/?startrow={{User::varStart}}&amp;endrow={{User::varEnd}}</div>
<h2>HTTP POST Request using SSIS Web Service Task or JSON/XML Source</h2>
<div>
<p>When you select the HTTP POST <span style="box-sizing: border-box; margin: 0px; padding: 0px;">method, the content-type is set to <em>application/x-www-form-urlencoded by default</em></span>. With the POST method, you can send POST data. When the POST method is selected, the data textbox becomes editable. You can also use variable place holders in POST data to make it dynamic.</p>
<p>POST data is usually in key/value format (e.g., user=abcd&amp;pass=mypass123), but sometimes the service requires data in JSON format or XML format. In that case, you can submit that way. Depending on the service requirements, you must set additional headers to indicate the content type (please refer to your service documentation).</p>
<h3>Uploading files using HTTP Multipart/form-data POST Request</h3>
<p>Many API support uploading files along with your POST request. Refer to <a href="//zappysys.com/blog/rest-api-file-upload-using-ssis-multi-part-post/" target="_blank" rel="noopener">this article</a> to learn more about how to upload files using REST API calls.</p>
</div>
<h2>Passing Credentials to your Web Service</h2>
<div>
<p>If your service requires authentication, ensure that you pass the credentials needed in the correct format. Below is a list of some of the most common authentication techniques.</p>
<p>There are mainly three connections:</p>
<ol>
<li><a href="https://zappysys.com/onlinehelp/ssis-powerpack/scr/ssis-http-connection-manager.htm" target="_blank" rel="noopener">HTTP Connection Manager</a></li>
<li><a href="https://zappysys.com/onlinehelp/ssis-powerpack/scr/ssis-oauth-connection-manager.htm" target="_blank" rel="noopener">OAuth Connection Manager</a></li>
<li>Salesforce Connection</li>
</ol>
<h3><strong>Using HTTP Connection</strong></h3>
<p>HTTP Connection supports multiple methods for authenticating to your API. Here are some popular modes.</p>
<ul>
<li><a href="//zappysys.com/blog/how-to-set-base64-encoded-authorization-header-for-http-web-request/" target="_blank" rel="noopener">Basic Authentication</a> (UserID and Password Approach)</li>
<li><a href="https://zappysys.com/blog/call-soap-rest-api-using-dynamic-token-ssis/" target="_blank" rel="noopener">Dynamic Token approach</a> (Two-step process &#8211; First get Token and then Call API (Pass the token extracted in the first step)</li>
<li>Static Token</li>
<li><a href="https://zappysys.com/blog/using-hmac-authentication-api-ssis-odbc-drivers/" target="_blank" rel="noopener">HMAC / Hash Signature Authentication</a></li>
<li><a href="https://zappysys.com/blog/get-data-from-workday-in-ssis-using-soap-or-rest-api/" target="_blank" rel="noopener">SOAP WSS Security</a></li>
<li>Windows Authentication (NTLM)</li>
<li>Client Certificate</li>
</ul>
<h3>OAuth Connection</h3>
<p>Many modern APIs now support OAuth Standard (i.e. v2.0, v1.0, v1.0a). ZappySys offers out-of-the-box support for this standard using <a href="https://zappysys.com/onlinehelp/ssis-powerpack/scr/ssis-oauth-connection-manager.htm" target="_blank" rel="noopener">OAuth Connection Manager</a></p>
<ul>
<li><a href="https://zappysys.com/blog/rest-api-authentication-with-oauth-2-0-using-ssis/" target="_blank" rel="noopener">OAuth authorization</a>
<ul>
<li>Authorize Code Grant (3-legged &#8211; using Login Popup)</li>
<li>Client Credentials Grant (Simple key/secret &#8211; No login Popup)</li>
<li>Password Grant (Use of userid /password rather than only key/secret)</li>
</ul>
</li>
</ul>
</div>
<h3>Basic Authentication &#8211; Set Authorization Header (Base64 Encoding)</h3>
<div>The HTTP Standard supports BASIC Authorization mode, in which you can pass the username and password as a base64-encoded string. Check this article for more <span style="box-sizing: border-box; margin: 0px; padding: 0px;">information <a target="_blank" rel="noopener">on how</a></span><a href="//zappysys.com/blog/how-to-set-base64-encoded-authorization-header-for-http-web-request/"> to pass a BASE64 Encoded Authorization Header</a></div>
<h3>Token-based approach &#8211; such as OAuth</h3>
<div>This is becoming the most common approach, utilizing protocols such as OAuth, where the user first authenticates to the service using an AccountKey and SecretKey. Once authenticated, you receive a token that can be valid for a certain duration (or an infinite duration). After you receive the token, you can call services (each service call will include this token). Parsing a token from the initial response can be achieved through the REST API Response Filter Expression (e.g., $.token) or using the <a href="//zappysys.com/products/ssis-powerpack/ssis-json-parser-task-free/">JSON Parser Task</a>.</div>
<div>
<h3>OAuth Authorization</h3>
<div>All REST API Tasks/Components in Zappysys SSIS PowerPack support <strong>OAuth</strong> Authorization. OAuth is gaining popularity, and many larger companies have already adopted this standard (e.g., Facebook, Twitter, Google, Salesforce). With this method, you can connect to the REST API Service without storing your User ID/Password. Only the first time, you need to log in using your credentials to obtain an initial Token, and after that, the service will continue to use the Access Token rather than your username and password. Once the Token expires, it can automatically renew.  <a href="//zappysys.com/blog/tag/oauth/">Check this for more information about using OAuth</a>.</div>
</div>
<h3>Windows Authentication (NTLM)</h3>
<p>By default, ZappySys REST API Tasks/Components use your default credentials. You can also use the HTTP Connection Manager with the &#8220;Use Credentials&#8221;&gt; &#8220;Use Windows Authentication&#8221; option. <a href="//zappysys.com/blog/how-to-set-base64-encoded-authorization-header-for-http-web-request/" target="_blank" rel="noopener">See this article</a></p>
<h3>Pass Client Certificate</h3>
<p>Sometimes you may have to pass a client certificate along with your web request. The server checks the certificate passed along with your request and, if it matches, proceeds with your request. Here is the real-world use case <a href="https://azure.microsoft.com/en-us/documentation/articles/cloud-services-certs-create/" target="_blank" rel="noopener">How Azure Management Api uses Client Certificate</a>.</p>
<p><span style="box-sizing: border-box; margin: 0px; padding: 0px;">ZappySys <a target="_blank" rel="noopener">HTTP Connection Manager</a> and <a target="_blank" rel="noopener">OAuth Connection Manager</a> both support passing a Client certificate.</span></p>
<h2>Saving HTTP Web Service Response to a File or Variable</h2>
<div class="d-editor-preview">
<p>Let’s break down how to save the response from a ZappySys REST API Task into either an SSIS variable or a file within your SSIS package.</p>
<p><strong>Scenario:</strong> Imagine you’re using the ZappySys REST API Task to retrieve JSON data from a URL. You want to store this data for further processing within your SSIS package.</p>
<h3>1. Saving the REST API Response to an SSIS Variable</h3>
<p>This is ideal when you need to manipulate the data within your SSIS package.</p>
<ol>
<li><strong>Add a ZappySys REST API Task to your Control Flow:</strong><br />
Drag and drop the task onto your SSIS package’s Control Flow.</li>
<li><strong>Configure the REST API Task:</strong>
<ul>
<li>Set the <code>Connection</code> Property to your REST API Connection Manager. (Optional)</li>
<li>Specify the <code>URL</code> of the API endpoint.</li>
<li>Configure any necessary headers, query parameters, or request body.</li>
<li>Go to the &#8220;Response Settings&#8221; tab.</li>
</ul>
</li>
<li><strong>Configure the Output Variable:</strong>
<ul>
<li>Check-mark Save Response content</li>
<li>Select Save Mode as &#8220;Save to Variable&#8221;</li>
<li>Select or create an SSIS variable of type <code>String</code>. This variable, named <code>User::WeatherResponse</code> will store the REST API response.</li>
</ul>
<div class="mceTemp"></div>
<div id="attachment_11521" style="width: 848px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2015/08/Saving-the-REST-API-Response-to-an-SSIS-Variable.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-11521" class="size-full wp-image-11521" src="https://zappysys.com/blog/wp-content/uploads/2015/08/Saving-the-REST-API-Response-to-an-SSIS-Variable.png" alt="" width="838" height="735" srcset="https://zappysys.com/blog/wp-content/uploads/2015/08/Saving-the-REST-API-Response-to-an-SSIS-Variable.png 838w, https://zappysys.com/blog/wp-content/uploads/2015/08/Saving-the-REST-API-Response-to-an-SSIS-Variable-300x263.png 300w, https://zappysys.com/blog/wp-content/uploads/2015/08/Saving-the-REST-API-Response-to-an-SSIS-Variable-768x674.png 768w" sizes="(max-width: 838px) 100vw, 838px" /></a><p id="caption-attachment-11521" class="wp-caption-text">Saving the REST API Response to an SSIS Variable</p></div></li>
</ol>
<h3>2. Saving the REST API Response to a File</h3>
<p>This is useful for archiving the response or when you need to process the data outside of SSIS.</p>
<ol>
<li><strong>Add a ZappySys REST API Task to your Control Flow:</strong><br />
Drag and drop the task onto your SSIS package’s Control Flow.</li>
<li><strong>Configure the REST API Task:</strong>
<ul>
<li>Set the <code>Connection</code> Property to your REST API Connection Manager. (Optional)</li>
<li>Specify the <code>URL</code> of the API endpoint.</li>
<li>Configure any necessary headers, query parameters, or request body.</li>
<li>Go to the &#8220;Response Settings&#8221; tab.</li>
</ul>
</li>
<li><strong>Configure the Output File:</strong>
<ul>
<li>Check-mark Save Response content</li>
<li>Select Save Mode as &#8220;Save to File&#8221;</li>
<li>In the “Enter File Path” property, specify the path and filename where you want to save the REST API response. For example, if you are fetching JSON data from a product API, you can save it to the following file: <code>C:\Data\Products.json</code>.
<div class="mceTemp"></div>
</li>
</ul>
</li>
</ol>
<div id="attachment_11520" style="width: 848px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2015/08/Saving-the-REST-API-Response-to-a-File.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-11520" class="size-full wp-image-11520" src="https://zappysys.com/blog/wp-content/uploads/2015/08/Saving-the-REST-API-Response-to-a-File.png" alt="" width="838" height="735" srcset="https://zappysys.com/blog/wp-content/uploads/2015/08/Saving-the-REST-API-Response-to-a-File.png 838w, https://zappysys.com/blog/wp-content/uploads/2015/08/Saving-the-REST-API-Response-to-a-File-300x263.png 300w, https://zappysys.com/blog/wp-content/uploads/2015/08/Saving-the-REST-API-Response-to-a-File-768x674.png 768w" sizes="(max-width: 838px) 100vw, 838px" /></a><p id="caption-attachment-11520" class="wp-caption-text">Saving the REST API Response to a File</p></div>
<p>REST APIs enable array filtering to extract specific data from JSON or XML responses. This is achieved through techniques such as query parameters, JSONPath (for JSON), and XPath (for XML), allowing for the precise selection of elements. Additionally, regular expressions can be employed for string-based filtering and data validation.</p>
<div id="attachment_11519" style="width: 848px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2015/08/REST-APIs-enable-array-filtering-to-extract-specific-data-from-JSON-or-XML-responses.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-11519" class="size-full wp-image-11519" src="https://zappysys.com/blog/wp-content/uploads/2015/08/REST-APIs-enable-array-filtering-to-extract-specific-data-from-JSON-or-XML-responses.png" alt="" width="838" height="275" srcset="https://zappysys.com/blog/wp-content/uploads/2015/08/REST-APIs-enable-array-filtering-to-extract-specific-data-from-JSON-or-XML-responses.png 838w, https://zappysys.com/blog/wp-content/uploads/2015/08/REST-APIs-enable-array-filtering-to-extract-specific-data-from-JSON-or-XML-responses-300x98.png 300w, https://zappysys.com/blog/wp-content/uploads/2015/08/REST-APIs-enable-array-filtering-to-extract-specific-data-from-JSON-or-XML-responses-768x252.png 768w" sizes="(max-width: 838px) 100vw, 838px" /></a><p id="caption-attachment-11519" class="wp-caption-text">REST APIs enable array filtering to extract specific data from JSON or XML responses.</p></div>
<h4>Key Setting: “Treat response as binary”</h4>
<p>As highlighted in the steps, the <strong>“Treat response as binary”</strong> option in the “Response” tab is the most important setting for correctly saving binary files. If you don’t check this, the task might try to interpret the binary data as text.</p>
<p><strong>Example Scenario:</strong></p>
<p>Let’s say you want to download a ZIP file from a REST API or a Public URL:</p>
<ul>
<li><strong>API URL:</strong> <code>https://example.com/api/download/archive.zip</code></li>
<li><strong>File Path:</strong> <code>C:\Downloads\archive.zip</code></li>
<li>In the ZS Rest API Task’s “Response” tab, you would:
<ul>
<li>Check-mark Save Response content</li>
<li>Select Save Mode as &#8220;Save to File&#8221;</li>
<li><strong>Check “Treat response as binary”.</strong></li>
<li>In the “Enter File Path” property, specify the path and filename where you want to save the REST API response. <code>C:\Downloads\archive.zip</code>.</li>
</ul>
<div class="mceTemp"></div>
<div id="attachment_11518" style="width: 848px" class="wp-caption aligncenter"><a href="https://zappysys.com/blog/wp-content/uploads/2015/08/REST-API-Task-Download-File.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-11518" class="size-full wp-image-11518" src="https://zappysys.com/blog/wp-content/uploads/2015/08/REST-API-Task-Download-File.png" alt="" width="838" height="280" srcset="https://zappysys.com/blog/wp-content/uploads/2015/08/REST-API-Task-Download-File.png 838w, https://zappysys.com/blog/wp-content/uploads/2015/08/REST-API-Task-Download-File-300x100.png 300w, https://zappysys.com/blog/wp-content/uploads/2015/08/REST-API-Task-Download-File-768x257.png 768w" sizes="(max-width: 838px) 100vw, 838px" /></a><p id="caption-attachment-11518" class="wp-caption-text">REST API Task &#8211; Download File</p></div></li>
</ul>
<p>By following these steps, you can effectively use the ZappySys Rest API Task to download and save binary content from REST APIs to files within your SSIS workflows.</p>
</div>
<h2>Save HTTP Web Response Headers / StatusCode</h2>
<div>If you wish to save the response to a file, then go to the response tab of the REST API Task and check the &#8220;Save Response&#8221; option, and you can select Save to File option from the dropdown</div>
<h2>HTTP Web Response Validation</h2>
<p><a target="_blank" rel="noopener">REST API Task</a> supports validating your response for a specific header, status code, or content value. See the Validation tab for more information. Using this feature, you can throw an error if a certain header is missing from the response or reject the response if the StatusCode is other than 200.</p>
<div>
<h2>REST API Pagination (Loop through multiple requests)</h2>
<p>Another popular concept in REST API is paging. If your response is significant, the server often returns a partial response. You must then ensure that you consume the remaining data by requesting all subsequent URLs until the last page is returned.</p>
<p><a href="//zappysys.com/blog/ssis-rest-api-looping-until-no-more-pages-found/" target="_blank" rel="noopener">Read this article to learn more about rest api paging</a></p>
<h2>HTTP Web Response Error Handling</h2>
<p><a href="//zappysys.com/products/ssis-powerpack/ssis-rest-api-web-service-task/">REST API Task</a> supports rich error handling. You can ignore specific errors and save the error flag into a variable based on any of the following criteria.</p>
<ul>
<li>Continue on any error</li>
<li>Continue on error with specific Response Code (e.g. 404)</li>
<li>Continue on error with a specific string in the message</li>
</ul>
<h2>Read/Write and Parse Cookies for HTTP Web Request/Response</h2>
<p>Many times, you need to supply an authentication token via cookies, or any other information must be passed via cookies. In such cases, the REST API Task provides complete support for reading, writing, or parsing individual values from a cookie string. Look at the Cookies tab for more information. The Cookie Mapping grid can help you to map a cookie value to an SSIS variable (Write Cookie value to a variable).</p>
<p><a href="//zappysys.com/blog/ssis-rest-api-task-pass-cookies-to-web-request/" target="_blank" rel="noopener">Read this article to learn more about passing cookies with your web request</a></p>
<h2>Changing Headers/URL or POST data Dynamically</h2>
<p>Most of the fields on the REST API Task, JSON Source, and XML Source support placeholders.</p>
<p>Use a placeholder anywhere in the following fields using {{User::yourVariable}} format. If you edit the value, you may see the Insert PlaceHolder option.</p>
<ul>
<li>Url</li>
<li>Body</li>
<li>Headers</li>
</ul>
<p>You may format datetime using special syntax like this {{User::myDate,yyyy-MM-dd HHmmss.fff}}</p>
</div>
<h2>Extract a single value from JSON/XML Web Response (e.g., Token)</h2>
<div>If your web response is in JSON or XML format, then you can filter it using Expression (e.g., <a target="_blank" rel="noopener">JSONPath </a>or <a href="https://en.wikipedia.org/wiki/XPath" target="_blank" rel="noopener">XPath</a>). Go to the Response Tab and select Content Type Format from the dropdown. Enter an expression to select a nested sub-document or a value from your response. If you want to save individual properties from the response into multiple variables, then use <a href="//zappysys.com/products/ssis-powerpack/ssis-json-parser-task-free/">JSON Parser Task</a></div>
<p>The most common use case is if you are getting a token from your JSON REST API service. Assume that Service sends you a response in the following format, but you only care about the access_token property from the response below. In that case you can use JSON Path expression like this <strong>$.data.access_token</strong></p><pre class="crayon-plain-tag">{
&nbsp;&nbsp;&nbsp; data: {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; access_token: 111223344444,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; expires_in: 3600
&nbsp;&nbsp;&nbsp; }
}</pre><p>
<h2>REST API Testing / Debugging Tools (3rd party)</h2>
<p>Now, let&#8217;s look at a few popular tools that you will need to test/debug REST API calls during your development cycle.</p>
<h3>Testing Rest API</h3>
<p>There are a  few ways to test REST APIs, and each tool has its pros and cons, but the most popular tool to test REST API is Postman, so we will start from there</p>
<ol>
<li><a href="https://www.postman.com/downloads/" target="_blank" rel="noopener">Postman</a> &#8211; GUI<br />
Postman offers an excellent User interface to test the API. You can edit URLs, methods, and parameters, and add authentication with ease. See our article on how to <a href="https://zappysys.com/blog/postman-to-ssis-odbc-powerpack/" target="_blank" rel="noopener">migrate Postman settings to zappysys UI</a>. Many API Providers offer easy-to-use Postman settings files for Testing API in Postman. If your API offers such a file, simply import it into Postman and start testing before using the ZappySys UI.</li>
<li><a href="https://www.soapui.org/downloads/latest-release.html" target="_blank" rel="noopener">SoapUI</a> &#8211; GUI<br />
SoapUI is another tool to test SOAP or REST APIs. They are primarily known for SOAP API Testing, but in recent versions, they have enhanced REST API Testing capability.</li>
<li><a href="https://curl.haxx.se/" target="_blank" rel="noopener">cURL</a> &#8211; Command line<br />
If you want to call/test the API via the command line, then this is the most popular tool. Many API vendors use cURL syntax in their API documentation. Here is how to <a href="https://zappysys.com/blog/using-ssis-curl-syntax-to-ssis-api-task/">migrate cURL syntax to ZappySys UI</a>.</li>
<li>Fiddler- GUI<br />
Fiddler has limited capability to test API call &#8211; <a href="https://zappysys.com/blog/how-to-use-fiddler-to-analyze-http-web-requests/#How_to_Test_API_using_Fiddler_Call_REST_API_for_without_Postman" target="_blank" rel="noopener">See Replay in Composer option</a></li>
<li><a href="https://zappysys.com/products/ssis-powerpack/ssis-rest-api-web-service-task/" target="_blank" rel="noopener">ZappySys REST API Task</a><br />
You can use the ZappySys REST API Task to <a href="https://i0.wp.com/zappysys.com/blog/wp-content/uploads/2019/04/ssis-call-freshdesk-rest-api.png?ssl=1" target="_blank" rel="noopener">test the API inside Visual Studio</a>. Edit URL / Headers / Body, etc, and click the <strong>Test Request Response</strong> option</li>
</ol>
<h3>Debugging REST API &#8211; Proxy</h3>
<p>So far, we have seen client tools to test Request/Response for the URL you entered in the UI, but what if you want to Sniff Requests sent by some applications for which you have no way to know what Request Data / URL, or Body is sent behind the scenes? What response is it getting back and so on? Well, not to worry&#8230; Telerik Fiddler is the most popular tool at your fingertips and it&#8217;s FREE.</p>
<ol>
<li><a href="https://zappysys.com/blog/how-to-use-fiddler-to-analyze-http-web-requests/" target="_blank" rel="noopener">Fiddler</a> &#8211; HTTP /  HTTPS Proxy / Debugger</li>
<li><a href="https://www.wireshark.org/">Wireshark</a> &#8211; Low-level Network Packet Sniffer</li>
</ol>
<h2>Conclusion</h2>
<p>The REST API is becoming increasingly popular every day. With that, Data integration from RESTful services is going to be a challenge. <span style="box-sizing: border-box; margin: 0px; padding: 0px;"><a target="_blank" rel="noopener">The SSIS REST API Task </a>and <a target="_blank" rel="noopener">SSIS JSON Source</a> can help resolve some of the issues you may encounter</span> with SSIS. Use JSON Source if you need to store data into a SQL Table. Use REST API Task if you need to make an ad-hoc HTTP/REST request (such as get token, Delete Record, etc). ZappySys REST API Components gives you total control over your REST API Integration challenges without learning a programming language (e.g., Python, Ruby, C#, Java).</p>
<p>The post <a href="https://zappysys.com/blog/call-rest-api-using-ssis-web-service-task/">How to Call REST API in SSIS &#8211; Read JSON / XML / CSV</a> appeared first on <a href="https://zappysys.com/blog">ZappySys Blog</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
