<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Brenda Chepkorir - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Browse thousands of programming tutorials written by experts. Learn Web Development, Data Science, DevOps, Security, and get developer career advice. ]]>
        </description>
        <link>https://www.freecodecamp.org/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Brenda Chepkorir - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 30 May 2026 11:14:15 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/news/author/Chepkorir/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ How to Use a Postman Mock Server with Angular ]]>
                </title>
                <description>
                    <![CDATA[ New front end features often require back end data support – especially where new endpoints are concerned.  For example, an application that needs an authenticated user experience may need a new /authenticate endpoint. If for any reason endpoint deve... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-use-a-postman-mock-server-with-angular/</link>
                <guid isPermaLink="false">66b9fa17d6f1a89d918606af</guid>
                
                    <category>
                        <![CDATA[ Angular ]]>
                    </category>
                
                    <category>
                        <![CDATA[ api ]]>
                    </category>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Brenda Chepkorir ]]>
                </dc:creator>
                <pubDate>Wed, 28 Jun 2023 21:47:41 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2023/06/pexels-christina-morillo-1181247.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>New front end features often require back end data support – especially where new endpoints are concerned. </p>
<p>For example, an application that needs an authenticated user experience may need a new <code>/authenticate</code> endpoint.</p>
<p>If for any reason endpoint development is stalled or lags behind, despite the sprint planning, you will be faced with the question: <em>do you build with or without the data?</em></p>
<p>Fortunately, there is a third option: building with mock data  (which could work depending on your use case). This option is especially beneficial when the feature is a must-have by the end of a sprint. </p>
<p>Some other pros of having mock data handy include:</p>
<ul>
<li>Better testing with different API response data</li>
<li>Secure testing with de-identified data</li>
<li>Re-usable test data</li>
<li>Smoother demos — just in case the real server decides to be offline</li>
</ul>
<p>There are multiple tools that can help with creating and using mock data, such as <a target="_blank" href="https://www.postman.com/">Postman</a> and its <a target="_blank" href="https://learning.postman.com/docs/designing-and-developing-your-api/mocking-data/setting-up-mock/">mock servers</a>. You can also integrate these tools in front end applications for use in development.</p>
<p>A Postman mock server is straightforward to set up and integrate with an Angular application – particularly, when it is paired with an Angular interceptor. It might not be for every use case, but it offers a convenient way of working with mock data.</p>
<h2 id="heading-what-is-a-postman-mock-server">What is a Postman Mock Server?</h2>
<p><a target="_blank" href="https://www.postman.com/product/what-is-postman/">Postman</a> is a collaborative API platform that is designed to support the complete lifecycle of APIs. It provides tools and integrations that help with designing, documenting, testing, monitoring, sharing, and using APIs.</p>
<p>A Postman Mock Server is a dummy API server that accepts requests to endpoints you create in a <a target="_blank" href="https://learning.postman.com/docs/sending-requests/intro-to-collections/">collection</a> and returns the responses you specify in <a target="_blank" href="https://learning.postman.com/docs/sending-requests/examples/">examples</a>. It has its own <a target="_blank" href="https://www.techopedia.com/definition/4858/base-url">base URL</a> and an optional <a target="_blank" href="https://www.techtarget.com/whatis/definition/API-key">API key</a> for added security.</p>
<p>A Postman collection is a logical grouping that helps organize related requests, while a Postman example is an instance of a request in action. It is made up of the request and an expected response. </p>
<p>The <a target="_blank" href="https://learning.postman.com/docs/sending-requests/requests/">Postman documentation</a> provides more comprehensive details about collections and examples if you want to learn more.</p>
<p>Once you’ve decided to work with a Postman Mock Server, you then need to integrate it with the application in such a manner as to not:</p>
<ul>
<li>Disrupt ongoing development</li>
<li>Break the application</li>
</ul>
<p>There are two popular ways that come to mind:</p>
<ol>
<li>Using a <a target="_blank" href="https://angular.io/guide/build#proxying-to-a-backend-server">proxy</a></li>
<li>Using a <a target="_blank" href="https://angular.io/api/common/http/HttpInterceptor">HTTP Interceptor</a></li>
</ol>
<p>The major difference between these two options is that the proxy is applied at build-time, while the interceptor is applied at run-time.</p>
<h3 id="heading-what-is-a-proxy">What is a Proxy?</h3>
<p>A <a target="_blank" href="https://www.techtarget.com/whatis/definition/proxy-server">proxy server</a> is a software tool that often acts as an intermediary between a client and a server. It receives requests from the client, modifies, and diverts some of them to other servers. </p>
<p>Angular uses <a target="_blank" href="https://webpack.js.org/configuration/dev-server/#devserverproxy">Webpack's dev-server</a> as a proxy. It can be configured to divert some requests to a different server, through the <a target="_blank" href="https://angular.io/guide/build#proxying-to-a-backend-server">Angular CLI</a>. This is what makes it a viable solution to use with a Postman mock server in development. </p>
<h3 id="heading-what-is-an-angular-http-interceptor">What is an Angular HTTP Interceptor?</h3>
<p>Angular's <code>HttpInterceptor</code> is a lightweight class that can tap into an outgoing request or an incoming response. It can be used to inspect a request or transform parts of it, like the URL or headers. If you use an interceptor instead of a proxy:</p>
<ul>
<li>You can access run-time environment variables  to determine whether to divert a request to the mock server</li>
<li>You will <em>not</em> need to re-serve the application after a change to the interceptor — code changes trigger reloads (if live reloads are enabled)</li>
</ul>
<p>The proxy and the interceptor can essentially do the same thing: tap into and transform outgoing requests. However, each option has its own pros and cons. </p>
<h3 id="heading-interceptor-vs-proxy">Interceptor vs Proxy</h3>
<ul>
<li>An interceptor will require relatively less set-up than a proxy</li>
<li>A proxy will necessitate setting build-time environment variables in the system or a <code>.env</code> file (an interceptor may need this if an API key is required)</li>
<li>A change to the proxy will require the application to be re-served while a change to an interceptor will trigger a reload</li>
<li>If you are unfamiliar with setting up a proxy in Angular, there is an expected gentle learning curve. However, there is an even gentler learning curve when creating an interceptor since it's just a class</li>
</ul>
<p>Using an interceptor seems like a more straightforward option for this simple use case.</p>
<h2 id="heading-how-to-create-a-postman-mock-server">How to Create a Postman Mock Server</h2>
<p>The first step to using a mock server is to create one. First, ensure you have a Postman account and a <a target="_blank" href="https://www.postman.com/product/workspaces/">workspace</a>. You can create both from the <a target="_blank" href="https://www.postman.com/">platform's website</a>. A Postman workspace is like a dashboard that organizes your work, tools, and collaborators.</p>
<p>Then, create a Postman collection to group and organize the requests you would like the mock server to handle. </p>
<p>Next, add a request to the collection. It can be any type of <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Glossary/CRUD">CRUDL</a> request. Use your actual server's URL – like you would when testing a real endpoint. </p>
<p>Here's a snapshot of a workspace with a collection and a GET request:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/create-and-send-req.png" alt="Image" width="600" height="400" loading="lazy">
<em>A collection with a request</em></p>
<p>Next, test your endpoint by sending the request. Do this until you get a successful response back then save the response as a Postman example. You can update the example by removing any sensitive data like user information or PII. </p>
<p>Here's a snapshot of an updated example. Some user information has been replaced with some mock data using Postman variables.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/add-example.png" alt="Image" width="600" height="400" loading="lazy">
<em>An updated example for a request</em></p>
<p>Finally, create a Postman mock server from the collection you just created. You can do this by clicking on the ellipsis beside the collection and selecting <code>Mock collection</code> (at least, at the time of this writing). Here's a snapshot of these steps.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/mock-collection.png" alt="Image" width="600" height="400" loading="lazy">
<em>How to create a mock server from a collection</em></p>
<p>You will be presented with a simple form that will allow you to configure the mock server. </p>
<p>For example, you can rename the mock server or make it private–this means it will need an API key. </p>
<p>Once the mock server is configured, click <code>Create Mock Server</code> . You will then be provided with a URL for the server. Copy the URL.</p>
<p>To associate the mock server with your requests and examples, go into the collection and update the URLs. Replace the base URLs of the requests and examples with the copied mock server's base URL. Send a few requests within Postman to verify that your set up was successful.</p>
<p><strong>Note:</strong></p>
<ul>
<li>If your API is private, you can generate an API key from the settings in your account</li>
<li>Your mock server keeps a log of the requests it receives which you can view in your workspace</li>
</ul>
<p>After creating the mock server, create the interceptor in your Angular application.</p>
<p>For more information, you can refer to the <a target="_blank" href="https://learning.postman.com/docs/designing-and-developing-your-api/mocking-data/setting-up-mock/#creating-mock-servers">documentation</a>. </p>
<h3 id="heading-how-to-create-an-angular-http-interceptor">How to Create an Angular HTTP Interceptor</h3>
<p>An interceptor is an injectable class that implements Angular’s <code>HttpInterceptor</code> interface. </p>
<p>This interface has one required method — the <code>intercept</code> method. This method primarily does one thing: it takes request and handler arguments and passes the request to the <code>next</code> method of the handler. Requests can be altered before they are passed on to the handler.</p>
<pre><code class="lang-typescript"><span class="hljs-meta">@Injectable</span>()
<span class="hljs-keyword">export</span> <span class="hljs-keyword">class</span> ApiInterceptor <span class="hljs-keyword">implements</span> HttpInterceptor {
  intercept(req: HttpRequest&lt;unknown&gt;, next: HttpHandler):
    Observable&lt;HttpEvent&lt;unknown&gt;&gt;
  {
    <span class="hljs-keyword">return</span> next.handle(req);
  }
}
</code></pre>
<p>To use a created interceptor in the application, add it to the <code>providers</code> array at the same level where the <code>HttpClientModule</code> is imported:</p>
<pre><code class="lang-typescript">[{ provide: HTTP_INTERCEPTORS, useClass: ApiInterceptor, multi: <span class="hljs-literal">true</span> }]
</code></pre>
<p>This is so it can be managed by Angular’s Dependency Injection system as optional dependencies of the <code>HttpClient</code> service. The <code>HttpClient</code> service is used for making HTTP requests.</p>
<p>Note that when it comes to using interceptors, order is important. </p>
<p>For example, if you provide another interceptor that adds authentication headers after an API interceptor that adds an API key header, the request may send unnecessary headers to the mock server.</p>
<p>Finally, integrate the mock server with your application.</p>
<p>For more information, refer to the <a target="_blank" href="https://angular.io/guide/http-intercept-requests-and-responses">documentation</a>.</p>
<h3 id="heading-how-to-use-an-angular-http-interceptor-with-a-postman-mock-server">How to Use an Angular Http Interceptor with a Postman Mock Server</h3>
<p>First, s<a target="_blank" href="https://angular.io/guide/build#configuring-application-environments">pecify an environment variable</a> to toggle between mock data and real data. Environment variables in Angular are primarily defined as TypeScript variables in environment files:</p>
<pre><code class="lang-typescript"><span class="hljs-comment">// environment.ts file</span>

<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> environment = {
  production: <span class="hljs-literal">false</span>,
  useMock: <span class="hljs-literal">true</span>,
  postman: {
    baseUrl: <span class="hljs-string">"postman-mock-server-url"</span>,
    apiKey: <span class="hljs-string">"optional-mock-server-api-key"</span>
  }
};
</code></pre>
<p>At least for framework versions &lt;15.</p>
<p>Then, use the environment variable in the interceptor. Where you can clone an outgoing request and update its URL before passing it to the handler:</p>
<pre><code class="lang-typescript"><span class="hljs-meta">@Injectable</span>()
<span class="hljs-keyword">export</span> <span class="hljs-keyword">class</span> ApiInterceptor <span class="hljs-keyword">implements</span> HttpInterceptor {
  intercept(req: HttpRequest&lt;unknown&gt;, next: HttpHandler):
    Observable&lt;HttpEvent&lt;unknown&gt;&gt;
  {
    <span class="hljs-keyword">if</span> (environment.useMock) {
      <span class="hljs-comment">// optional headers</span>
      <span class="hljs-keyword">const</span> headers = <span class="hljs-keyword">new</span> HttpHeaders({
        <span class="hljs-string">"x-api-key"</span>: <span class="hljs-string">"my-api-key"</span>
      });
      <span class="hljs-keyword">const</span> cloneReq = req.clone({ url: <span class="hljs-built_in">this</span>.getUpdatedURL(req.url), headers });
      <span class="hljs-keyword">return</span> next.handle(cloneReq);
    }
    <span class="hljs-keyword">return</span> next.handle(req);
  }
}
</code></pre>
<h2 id="heading-conclusion">Conclusion</h2>
<p>To summarize, using mock data in applications, especially data-intensive ones, can be cumbersome. But they do have their merits. </p>
<p>Reusable mock data helps make testing better and more secure particularly if the data is varied and de-identified. Furthermore, they help progress development while real data are unavailable.</p>
<p>There are a couple of tools that help with creating and managing mock data through mock servers, like Postman. </p>
<p>These tools are not only nifty for API and back end software engineers, but also for front end software engineers.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Angular Upgrades That Will Improve Your Developer Experience ]]>
                </title>
                <description>
                    <![CDATA[ When we talk about the Developer Experience, we're referring to the level of difficulty a developer faces when completing essential tasks.  Factors like the complexity of a development framework or the absence of syntactic sugar in a programming lang... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/angular-upgrades-to-improve-developer-experience/</link>
                <guid isPermaLink="false">66b9fa152d0f884246b52442</guid>
                
                    <category>
                        <![CDATA[ Angular ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Brenda Chepkorir ]]>
                </dc:creator>
                <pubDate>Wed, 17 May 2023 23:40:59 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2023/05/pexels-thisisengineering-3861958.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>When we talk about the <a target="_blank" href="https://microsoft.github.io/code-with-engineering-playbook/developer-experience/">Developer Experience</a>, we're referring to the level of difficulty a developer faces when completing essential tasks. </p>
<p>Factors like the complexity of a development framework or the absence of <a target="_blank" href="https://www.techopedia.com/definition/10212/syntactic-sugar">syntactic sugar</a> in a programming language can negatively impact it.</p>
<p>A robust modern framework can be complex. But Angular wouldn’t be so beloved if it didn't get easier to use with each new version. </p>
<p>Versions 14, 15, and 16 have many improvements that you may not know about and may want to take advantage of when you're migrating from one version to the next. </p>
<p>These improvements include:</p>
<ul>
<li>succinct tree-shakable error messages</li>
<li>template auto-magic</li>
<li>required inputs</li>
<li>page title in route options</li>
<li>component-bound route data</li>
<li>CLI completion</li>
</ul>
<p>Let's look at each of these features in more depth so you can use them in your Angular applications.</p>
<h2 id="heading-succinct-tree-shakablehttpsdevelopermozillaorgen-usdocsglossarytreeshaking-error-messages">Succinct <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Glossary/Tree_shaking">Tree-Shakable</a> Error Messages</h2>
<p>Now, tree-shaking mostly gets rid of unused code from a bundle. In this instance, it refers to the trimming of runtime error messages in production. </p>
<p>Runtime error messages and codes in Angular are not new. What is new are the less verbose production error messages. </p>
<p>In version 14, instead of long messages, you get their related error codes. And you can quickly look up these codes in the <a target="_blank" href="https://angular.io/errors">Angular documentation</a> for debugging. You can view the longer detailed messages in development for further debugging.</p>
<h2 id="heading-templatehttpsangularioguidetemplate-syntax-auto-magic"><a target="_blank" href="https://angular.io/guide/template-syntax">Template</a> Auto-Magic</h2>
<p>In version 16, template self-closing tags help developers forgo the need to add closing tags to component selectors in templates. This is similar to the ubiquitous <code>input</code> HTML element that doesn't need a closing tag. For example: </p>
<pre><code class="lang-html"><span class="hljs-comment">&lt;!--Before--&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">app-root</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">app-root</span>&gt;</span>

<span class="hljs-comment">&lt;!--After--&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">app-root</span> /&gt;</span>
</code></pre>
<p>Furthermore, upgrades to the Angular language service in version 16 make automatic imports of standalone pipes and components in templates possible. Like automatic class imports within components. Most code editors, like VS Code, <a target="_blank" href="https://code.visualstudio.com/docs/editor/intellisense#_intellisense-features">use language services</a> to support automatic imports through <em>quick fixes</em>.</p>
<p>In addition, version 14 introduced an additional template compiler option, <a target="_blank" href="https://angular.io/guide/angular-compiler-options">a TypeScript configuration</a>, called <code>[extendedDiagnostics](https://angular.io/extended-diagnostics)</code> to supplement template insights. This configuration helps the compiler find common template pitfalls like an optional chain when a value will never be <code>null</code>. If it is <code>null</code>, it’s either a bug or a mis-typed value. </p>
<p>These types of syntax errors are usually harder to spot since they don't always break the application.</p>
<h2 id="heading-required-inputshttpsangularioapicoreinput">Required <a target="_blank" href="https://angular.io/api/core/Input">Inputs</a></h2>
<p>Inputs in Angular are vital in data-sharing from parent to child components. They specify what values are being passed to the child. Version 16 introduced <a target="_blank" href="https://angular.io/api/core/Input#required">required</a> inputs to help developers remember to pass these data when using child components. </p>
<p>Missing data assigned to required inputs will trigger compile-time errors.</p>
<pre><code class="lang-typescript"><span class="hljs-keyword">export</span> <span class="hljs-keyword">class</span> ChildComponent {
    <span class="hljs-meta">@Input</span>({ required: <span class="hljs-literal">true</span> }) someList: unknown[];
}
</code></pre>
<pre><code class="lang-html"><span class="hljs-comment">&lt;!--In parent template--&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">child-one</span>  /&gt;</span> <span class="hljs-comment">&lt;!--triggers compile-time error--&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">child-one</span> [<span class="hljs-attr">someList</span>]=<span class="hljs-string">"list"</span> /&gt;</span> <span class="hljs-comment">&lt;!--no compile-time error--&gt;</span>
</code></pre>
<p>Perhaps further updates to required inputs may help delay rendering child components while the data is still <code>falsy</code>. </p>
<h2 id="heading-page-title-in-route-options">Page Title in Route Options</h2>
<p>Page titles are important. Even more so for the <a target="_blank" href="https://web.dev/the-accessibility-tree/">Accessiblity Tree</a>. You can see them in the pages’ browser tabs, like headings. The Accessibility Tree is the <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model/Introduction">DOM</a> that Accessibility tools, like screen readers, use to navigate through the web page.</p>
<p>Page titles summarize content for users which is useful for navigation. It can be easy to forget to set them, especially if setting them seems a little counterintuitive in development.</p>
<p>Version 14 introduced a <code>title</code> option to the <code>[Route](https://angular.io/api/router/Route)</code> interface  which you can  use to configure application routes. This allows each route to set its own page title. In addition, this option can be configured as a <code>string</code> or a function that resolves to a string for more dynamic titles.</p>
<pre><code class="lang-typescript"><span class="hljs-keyword">const</span> appRoutes: Route[] = [
{
    path: <span class="hljs-string">'/customers'</span>,
    component: CustomersComponent,
    title: <span class="hljs-string">'Customers'</span>,
    children: [{
        path: <span class="hljs-string">':id/customer'</span>,
        component: CustomerComponent,
        title: <span class="hljs-function">(<span class="hljs-params">route: ActivatedRouteSnapshot, state:     RouterStateSnapshot</span>) =&gt;</span> <span class="hljs-built_in">this</span>.getRouteTitleForCustomer()
      }]
}
];
</code></pre>
<h2 id="heading-component-bound-route-data">Component-Bound Route Data</h2>
<p>While inputs have always been used for data-sharing between components in parent-child relationships, you can also use them for data-sharing between routed components in version 16.</p>
<p>Some application routing scenarios require passing data, like IDs, to components being routed to. This was possible through use of the injectable <code>[ActivatedRoute](https://angular.io/api/router/ActivatedRoute)</code> class in the components needing the data.</p>
<p>Developers can now get these data in through the components’ inputs, whether it's from the route resolvers or path and query parameters. These data values get tied to component inputs with matching names. So, a <code>customerId</code> data value from the route will correspond to a <code>customerId</code> input in the component. </p>
<pre><code class="lang-typescript"><span class="hljs-keyword">export</span> <span class="hljs-keyword">class</span> CustomerComponent {
    <span class="hljs-meta">@Input</span>() customerId: <span class="hljs-built_in">string</span>;
}
</code></pre>
<pre><code class="lang-typescript"><span class="hljs-keyword">const</span> appRoutes: Route[] = [
{
    path: <span class="hljs-string">'/customers'</span>,
    component: CustomersComponent,
    title: <span class="hljs-string">'Customers'</span>,
    children: [{
        path: <span class="hljs-string">':id/customer'</span>,
        component: CustomerComponent,
        title: <span class="hljs-string">'Customer'</span>,
        resolve: { customerId: <span class="hljs-function">(<span class="hljs-params">route: ActivatedRouteSnapshot, state:     RouterStateSnapshot</span>) =&gt;</span> <span class="hljs-built_in">this</span>.getCustomerId()
          }
      }]
}
];
</code></pre>
<p>Be sure to <a target="_blank" href="https://angular.io/guide/router#getting-route-information">enable component binding through the router</a>.</p>
<h2 id="heading-cli-completionhttpsangularioclicompletion"><a target="_blank" href="https://angular.io/cli/completion">CLI Completion</a></h2>
<p>As for <a target="_blank" href="https://dev.to/ruizb/declarative-vs-imperative-4a7l">imperative coders</a> and terminal lovers, version 14 brought command auto-completion through <code>ng completion</code>. This allows developers to get quick intuitive references for commands and their applicable options with a <code>tab</code> key press in the terminal. This makes using the CLI easier and faster.</p>
<h2 id="heading-wrapping-up">Wrapping Up</h2>
<p>The latest Angular versions 14, 15, and 16 contain many more requested changes that not only boost the Developer Experience, but also address many framework issues. </p>
<p>The <a target="_blank" href="https://blog.angular.io/">Angular Blog</a> and the <a target="_blank" href="https://angular.io/docs">documentation</a> provide more details about all these changes with specific examples.</p>
 ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
