<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Renée</title>
    <description>The latest articles on DEV Community by Renée (@renee).</description>
    <link>https://dev.to/renee</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F163733%2Fdf70bff9-affa-4d8e-8699-dde0a84997e0.jpg</url>
      <title>DEV Community: Renée</title>
      <link>https://dev.to/renee</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/renee"/>
    <language>en</language>
    <item>
      <title>Change HTTP status codes for UI testing</title>
      <dc:creator>Renée</dc:creator>
      <pubDate>Mon, 24 Feb 2020 10:12:36 +0000</pubDate>
      <link>https://dev.to/renee/change-http-status-codes-for-ui-testing-25kb</link>
      <guid>https://dev.to/renee/change-http-status-codes-for-ui-testing-25kb</guid>
      <description>&lt;p&gt;This miniblog simulates a backend error to check how Unsplash app behaves when encountering a Searching issue.&lt;/p&gt;




&lt;h3&gt;
  
  
  Get Started
&lt;/h3&gt;

&lt;p&gt;Instead of asking backend developers for fake status codes to test different user cases, we could use a debugging tool named &lt;a href="https://proxyman.io/" rel="noopener noreferrer"&gt;Proxyman&lt;/a&gt;. Basically, it's a handy tool when debugging mobile and web applications as it allows developers to modify both requests and responses on-the-fly. After setting up Proxyman certificate on my iOS device, all requests coming from/to my device are captured by Proxyman under the Remote devices section&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1ng2h9mod8om5mwpzuwb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1ng2h9mod8om5mwpzuwb.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can double click an URL to see the content of its Response. The origin Status code is &lt;strong&gt;200 OK&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvq9l9uqk1mdd9uxr9nct.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvq9l9uqk1mdd9uxr9nct.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After that, we can &lt;a href="https://dev.to/meg_review/modifying-api-responses-with-proxyman-part-i-3ojj"&gt;enable the Map Local tool to start monitoring the Requests and Responses&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2vd0rwqlo9p6bz906xl3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2vd0rwqlo9p6bz906xl3.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Subsequently, the Map Local tool's window will pop-up so that we can start the mapping configuration.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F3i08cjbec2kkp7nc7kvv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F3i08cjbec2kkp7nc7kvv.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Modify Status Code
&lt;/h3&gt;

&lt;p&gt;Similar to &lt;a href="https://dev.to/meg_review/modifying-api-responses-with-proxyman-part-i-3ojj"&gt;modifying the body content of the origin Response&lt;/a&gt;, we are able to change the status code with our Editor. The File Path indicates the current location of the origin Response (normally, it stays at our Desktop). Click to open the file with our favorite Editor&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2adtl0knw1bdiv8e89dz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2adtl0knw1bdiv8e89dz.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;... then change the Status Code to &lt;strong&gt;404&lt;/strong&gt; to simulate that the device was able to communicate with the server, but the server could not find what was requested.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fhse5sjuwc8weaoehj3xb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fhse5sjuwc8weaoehj3xb.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Create Matching Rule
&lt;/h3&gt;

&lt;p&gt;The next step is to define rule so that Proxyman can capture our domain. This way, it would detect all API calls that match the rule and then serve the configured status code from our local file instead of from server. &lt;/p&gt;

&lt;p&gt;Type in the domain for mapping&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdq382nvhxuslkk35kut2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdq382nvhxuslkk35kut2.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;... then select the modified Response and hit &lt;strong&gt;Done&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fb0asjqp9gma91ukqt5qg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fb0asjqp9gma91ukqt5qg.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As soon as we make another call to that API, Proxyman would capture that request and map the response with the modified one on our local directory. Now if you click the Header of the received Response, there will be an extra row added to indicate that the Response is being served from our local file, not the server.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpgbhzddyjhxi3nzijvmz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpgbhzddyjhxi3nzijvmz.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And the Unsplash app shows a black screen instead of displaying images for our Search.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Feoq446mva41v91y8cvy7.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Feoq446mva41v91y8cvy7.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Faq3bolairnlehkpgdth5.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Faq3bolairnlehkpgdth5.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If we want to test UI for another backend error, we can simply change the status code again.&lt;/p&gt;




&lt;h3&gt;
  
  
  What's next?
&lt;/h3&gt;

&lt;p&gt;Modifying status code comes in handy when developing and testing mobile applications. Using the Map Local will allow developers or testers to easily simulate a front-end or back-end error and see how the app behaves in different scenarios without involving backend team.&lt;/p&gt;

&lt;p&gt;In the next blog post, we are going to discover how to use Map Remote feature in case you have a development version of a site and would like to be able to browse the production site with some of the requests being served from development. Stay tuned and see you in our next blog post!&lt;/p&gt;




&lt;p&gt;Proxyman is a high-performance macOS app, which enables developers to observe and manipulate HTTP/HTTPS requests/responses on your macOS, iOS devices, iOS Simulator and Android devices. Get it at &lt;a href="https://proxyman.io" rel="noopener noreferrer"&gt;https://proxyman.io&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>httpproxy</category>
      <category>ios</category>
      <category>android</category>
      <category>sslproxying</category>
    </item>
    <item>
      <title>Modifying API responses with Proxyman (Part I)</title>
      <dc:creator>Renée</dc:creator>
      <pubDate>Wed, 19 Feb 2020 04:02:14 +0000</pubDate>
      <link>https://dev.to/renee/modifying-api-responses-with-proxyman-part-i-3ojj</link>
      <guid>https://dev.to/renee/modifying-api-responses-with-proxyman-part-i-3ojj</guid>
      <description>&lt;p&gt;All applications these days seems to communicate over the internet. Most of the time, developers might not need paying much attention to such low level but sometimes, the app doesn't behave as we expect so we might want to use a proxy server like Wireshark, Fiddler, Charles or &lt;a href="https://proxyman.io/" rel="noopener noreferrer"&gt;Proxyman&lt;/a&gt; to view all HTTP and HTTPS traffic between the device and the internet. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fy5q26itneulm9y6ttjdw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fy5q26itneulm9y6ttjdw.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This blog post explores one of the most useful features of those debugging tools that used daily by both QAs and developers named &lt;strong&gt;Map Local&lt;/strong&gt;. It is powerful in debugging mobile and web applications as it allows developers and testers to change the response of the request, per the configured mappings, so that the response is transparently served from the new location locally as if that was the original request. &lt;/p&gt;




&lt;h3&gt;
  
  
  Get Started
&lt;/h3&gt;

&lt;p&gt;Normally, testers will need to go through complicated flows in the app in order to have the response properties updated accordingly. The Map Local tool comes in handy to help us to quickly modify the response and change the required parameter to what we need, so that we are able to test different use cases.&lt;/p&gt;

&lt;p&gt;Before we enable this feature, we first need to &lt;a href="https://dev.to/meg_review/web-debugging-proxy-for-macos-8gi"&gt;download and launch Proxyman&lt;/a&gt;. Then use &lt;strong&gt;Cmd + F&lt;/strong&gt; to search for a specific name and &lt;strong&gt;Pin&lt;/strong&gt; feature to isolate our wanted URL for later modification.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fc9xdnc9vkb6fzufosvn2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fc9xdnc9vkb6fzufosvn2.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we could easily double click the URL to see the content of both Request and Response &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0b88drgfv8z6fsjotd43.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0b88drgfv8z6fsjotd43.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this time, we can choose one among three ways to enable the Map Local tool&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Right click the URL --&amp;gt; select Tools --&amp;gt; Map Local &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffte7kwe41c404vsmhjhy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffte7kwe41c404vsmhjhy.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click Menu bar --&amp;gt; select Tools --&amp;gt; Map Local &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2nmyqrvenpoygfcgl1gb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2nmyqrvenpoygfcgl1gb.png" alt="Alt Text"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use hotkey Option + Cmd +L&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Modify the Response
&lt;/h3&gt;

&lt;p&gt;As soon as the Map Local is enabled, a new window would pop-up to help us monitor upcoming API calls. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fg3q6yqr67piyz02bui2l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fg3q6yqr67piyz02bui2l.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Because I have right-clicked an URL to enable Map Local, we can see that Proxyman auto-saves the origin Response of that URL and allows me to open it with my preferred Editor for modification. Thus, we can easily change those parameters for different testing purpose&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Faxqhjufkrdmf1gdbf50m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Faxqhjufkrdmf1gdbf50m.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Create Matching Rules
&lt;/h3&gt;

&lt;p&gt;The next step is to define rules for upcoming Requests. This way, if Proxyman detect any API calls that match our rule, it will replace the content of the Response with our modified one in the local directory. &lt;/p&gt;

&lt;p&gt;Although Proxyman has pre-filled domain, we can type in any other domain name for mapping. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjv18865ku3pcftlpqa87.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjv18865ku3pcftlpqa87.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tips:&lt;/strong&gt; Check/uncheck the box to allow Proxyman to catch its sub-domains. For example, &lt;code&gt;/v1/posts&lt;/code&gt; with &lt;strong&gt;checked-box&lt;/strong&gt; will map all sub-URLs such as &lt;code&gt;/v1/posts?days_ago=0&lt;/code&gt;. Meanwhile, &lt;code&gt;/v1/posts&lt;/code&gt; with &lt;strong&gt;unchecked-box&lt;/strong&gt; will only map the exact name &lt;code&gt;/v1.posts&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fc0uhvuoyel1agzaamhmr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fc0uhvuoyel1agzaamhmr.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After we select the previously modified Response and hit &lt;strong&gt;Done&lt;/strong&gt;, a new rule will be created. As a result, any API calls that satisfy the rule will have the Response served from the local file&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fl8e95mefvywphfuilkve.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fl8e95mefvywphfuilkve.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgi1sg0875vcfijgxug3p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgi1sg0875vcfijgxug3p.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; we are able to select a different content format for mapping, for example&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxq6yojva6yl2ytqhpmqd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxq6yojva6yl2ytqhpmqd.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;... and the content might appear as follow&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Faorq8qc2tld01nzuk2i2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Faorq8qc2tld01nzuk2i2.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As it might be a system vulnerability so be sure with your intended format of Response when testing in .production environment &lt;/p&gt;

&lt;h3&gt;
  
  
  What's next?
&lt;/h3&gt;

&lt;p&gt;Modifying responses is very useful when it comes to developing and testing mobile applications. Using the "Map Local" will allow developers or testers to simulate responses from each request then put on the 'hacker hat' and try to debug or break the app. &lt;/p&gt;

&lt;p&gt;In the next blog post, we will discover how to use Proxyman's Map Local tool for mapping a whole directories instead of mapping individual files. It is an easy and convenient way when you need to test complicated response content including css, swf or image. Stay tuned and see you in our next blog post!&lt;/p&gt;




&lt;p&gt;Proxyman is a high-performance macOS app, which enables developers to view HTTP/HTTPS requests from apps and domains on iOS device, iOS Simulator and Android devices. Get it at &lt;a href="https://proxyman.io" rel="noopener noreferrer"&gt;https://proxyman.io&lt;/a&gt;&lt;/p&gt;

</description>
      <category>httpproxy</category>
      <category>ios</category>
      <category>android</category>
      <category>sslproxying</category>
    </item>
    <item>
      <title>Web debugging proxy for macOS</title>
      <dc:creator>Renée</dc:creator>
      <pubDate>Mon, 09 Dec 2019 08:20:12 +0000</pubDate>
      <link>https://dev.to/renee/web-debugging-proxy-for-macos-8gi</link>
      <guid>https://dev.to/renee/web-debugging-proxy-for-macos-8gi</guid>
      <description>&lt;p&gt;All applications these days seems to communicate over the internet. Most of the time, developers might not need paying much attention to such low level but sometimes, the app doesn't behave as we expect so we might want to take a look into network packages to see how it worked. &lt;/p&gt;

&lt;p&gt;In such case, what developers need might be a proxy server like Wireshark, Fiddler, Charles or Proxyman which sits between the app and computer's network connections to capture all of its requests/responses. In this blog, let's see how an app like &lt;a href="https://proxyman.io/" rel="noopener noreferrer"&gt;Proxyman&lt;/a&gt; can help us to test an application. &lt;/p&gt;

&lt;p&gt;To start, we first need to download the latest version of Proxyman at &lt;a href="https://proxyman.io/" rel="noopener noreferrer"&gt;https://proxyman.io/&lt;/a&gt;. Double-click the .dmg file and drag its icon to your Applications folder to install it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F1j7eqkv2bils0opw3xlg.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F1j7eqkv2bils0opw3xlg.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Inspect requests/responses
&lt;/h3&gt;

&lt;p&gt;When first time you launch the app, Proxyman would ask for permission to automatically configure your network settings. Click &lt;strong&gt;Grant Privileges&lt;/strong&gt; and enter your password if prompted. This allows Proxyman to change your network configuration to route all traffic through it to inspect all network events to and from your computer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F7r8tx6jck0gudte3nlzr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F7r8tx6jck0gudte3nlzr.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As soon as Proxyman is launched, you can see events popping into the left panel. Those recorded network requests are categorized by Apps and Domains and  listed down in the main panel along with their detailed information. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fan8j5du8t8epyb3u4bui.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fan8j5du8t8epyb3u4bui.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To search for specific requests, we can use Command + F to filter all URLs by protocols (HTTP/HTTPs/Web socket), content type (JSON, XML, CSS, Images,…) or text contained in URL, header, status code,…&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fhz5ykfvbus24h4sttvbg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fhz5ykfvbus24h4sttvbg.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then using the &lt;strong&gt;Pin&lt;/strong&gt; feature to isolate those URLs for testing without distraction&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F22cb4xpm7uy56qdcta5a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F22cb4xpm7uy56qdcta5a.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  SSL Proxying
&lt;/h3&gt;

&lt;p&gt;Although Proxyman can inspect all network events to and from your computer, if you double click to select a request, you should expect to see no content response of that request yet. The reason is that HTTPs protocol use SSL/TLS to encrypt sensitive request and response information and  prevent proxy servers and other middleware from eavesdropping.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F8shrt9wsqn9ajw0i7we5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F8shrt9wsqn9ajw0i7we5.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So how Proxyman can  decrypt those SSL messages so that we can snoop on and debug them? Magically (:), Proxyman (and other man-in-the-middle apps) can generate its own self-signed certificate, which we can install on our Mac and iOS devices for SSL/TLS encryption. However, as this certificate isn't issued by a trusted certificate issuer, we'll need to tell our devices to explicitly trust it. Please bear in mind that there are some cases where Proxyman won't work such as when an app uses SSL pinning to verify network connections for extra security. In this case, the app can reject communication if they find any mismatch between the pre-pinned certificates and your newly trusted certificate.&lt;/p&gt;

&lt;p&gt;With that being said, most of the time, you could enable SSL by clicking the button on the Proxyman's right panel.  Once enabled, Proxyman will be able to decrypt SSL events! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fsc65vcvoit660qux2ykp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fsc65vcvoit660qux2ykp.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is how the workspace looks like once you enable SSL Proxying&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fi14c5ix834bf6sngcna4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fi14c5ix834bf6sngcna4.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Modifying requests/responses
&lt;/h3&gt;

&lt;p&gt;In addition to logging data, developers can also use a "Breakpoint" to edit API requests/responses or even decide whether to block it or allow it to proceed. When you enable &lt;strong&gt;Breakpoint&lt;/strong&gt; for request, Proxyman will stop the request before it goes to your server. If you enable &lt;strong&gt;Breakpoint&lt;/strong&gt; for response, it will stop the response before it goes to your app. Thus, you can modify such requests/ responses to test UI errors or certain back end functionalities (including security vulnerabilities)&lt;/p&gt;

&lt;h4&gt;
  
  
  Enable Breakpoint
&lt;/h4&gt;

&lt;p&gt;To enable this tool → &lt;strong&gt;Right Click&lt;/strong&gt; the URL → select &lt;strong&gt;Tools&lt;/strong&gt; → select &lt;strong&gt;Breakpoint&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fh9jnn33cp0myvyuda7vq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fh9jnn33cp0myvyuda7vq.png" alt="Right click URL → Select Tools → Select Breakpoint"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Add Matching Rule
&lt;/h4&gt;

&lt;p&gt;A &lt;strong&gt;Breakpoint Rule Window&lt;/strong&gt; will then pop-up to allow us to define our matching conditions. As the app auto-use the selected endpoint as the condition, we would see the endpoint &lt;a href="https://api.producthunt.com/v1%E2%80%A6" rel="noopener noreferrer"&gt;https://api.producthunt.com/v1…&lt;/a&gt; is auto-filled. Here we want to change the status code only so let’s uncheck the Request box&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F8m87z6wsq8hsgo0s9cs2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F8m87z6wsq8hsgo0s9cs2.png" alt="Uncheck Request box for modifying Response only"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After hitting &lt;strong&gt;Done&lt;/strong&gt;, a new rule has been added up to the Breakpoint rules window&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F780mwjdmtm30j7ymd0q5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F780mwjdmtm30j7ymd0q5.png" alt="New Matching Rules is added after hitting Done button"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With that all set up, it’s time to modify the status code to see how the app behaves&lt;/p&gt;

&lt;h4&gt;
  
  
  Change Status code
&lt;/h4&gt;

&lt;p&gt;As soon as we re-send the request, that API call would be captured so that we can edit our queries on the fly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fpdq9mu5hquczuy6p246c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fpdq9mu5hquczuy6p246c.png" alt="Go to tab Other → change the status code as we want"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, after changing the status code into &lt;strong&gt;400&lt;/strong&gt; and hit &lt;strong&gt;Execute&lt;/strong&gt;, the response is now updated with signal &lt;strong&gt;Error 400&lt;/strong&gt; in the main window&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fhbif3ce68ujzq79iriy2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fhbif3ce68ujzq79iriy2.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In case you want to manipulate the content of requests/ responses, you can find the detailed blog at &lt;a href="https://proxyman.io/blog/2019/09/Use-Breakpoint-to-intercept-and-edit-request-response-on-iOS-app.html" rel="noopener noreferrer"&gt;https://proxyman.io/blog/2019/09/Use-Breakpoint-to-intercept-and-edit-request-response-on-iOS-app.html&lt;/a&gt;. &lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;In a nutshell, a man-in-the-middle app like Fiddler, Charles, or Proxyman can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure our network settings to route all traffic through it so that it can inspect all network events to and from our computer.&lt;/li&gt;
&lt;li&gt;Generate and use its own self-singed certificate to decrypt SSL events (which is encrypted by HTTPS).&lt;/li&gt;
&lt;li&gt;Act as a proxy server to help you modify requests/responses on-the-fly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fxmvy4llifyz29kmp5ei2.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fxmvy4llifyz29kmp5ei2.jpeg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That’s how we can use &lt;a href="https://proxyman.io/" rel="noopener noreferrer"&gt;Proxyman&lt;/a&gt; for debugging an app. Hope that you would find it helpful to incorporate with your working habit and boost your productivity :)&lt;/p&gt;




&lt;p&gt;Proxyman is a high-performance macOS app, which enables developers to view HTTP/HTTPS requests from apps and domains on iOS device, iOS Simulator and Android devices. Get it at &lt;a href="https://proxyman.io" rel="noopener noreferrer"&gt;https://proxyman.io&lt;/a&gt;&lt;/p&gt;

</description>
      <category>developertool</category>
      <category>ios</category>
      <category>android</category>
      <category>sslproxying</category>
    </item>
    <item>
      <title>Can we change the status code of a HTTP request?</title>
      <dc:creator>Renée</dc:creator>
      <pubDate>Sat, 16 Nov 2019 10:25:30 +0000</pubDate>
      <link>https://dev.to/renee/can-we-change-the-status-code-of-a-http-request-3jco</link>
      <guid>https://dev.to/renee/can-we-change-the-status-code-of-a-http-request-3jco</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fansf6j1g9eiy3z2rpfpd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fansf6j1g9eiy3z2rpfpd.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Apart from using Breakpoint to edit content of requests/responses on the fly, this mini blog demonstrates how developers can use &lt;a href="https://proxyman.io/" rel="noopener noreferrer"&gt;Proxyman&lt;/a&gt; Breakpoint to change the status code to test different cases of HTTP responses such as client error or server error.&lt;/p&gt;




&lt;h3&gt;
  
  
  Enable Breakpoint
&lt;/h3&gt;

&lt;p&gt;After you have downloaded Proxyman and enable SSL Proxying for our testing domains, those requests/responses would be captured. Moreover, we can even use Breakpoint tool to manipulate those API calls as our testing purposes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fn89bbc9e790yxkezvqbx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fn89bbc9e790yxkezvqbx.png" alt="Enable SSL Proxying for testing domains"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To enable this tool → &lt;strong&gt;Right Click&lt;/strong&gt; the URL → select &lt;strong&gt;Tools&lt;/strong&gt; → select &lt;strong&gt;Breakpoint&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fh9jnn33cp0myvyuda7vq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fh9jnn33cp0myvyuda7vq.png" alt="Right click URL → Select Tools → Select Breakpoint"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Add Matching Rule
&lt;/h3&gt;

&lt;p&gt;Then a &lt;strong&gt;Breakpoint Rule Window&lt;/strong&gt; will pop-up so that we can define all matching conditions there. As &lt;a href="https://proxyman.io/" rel="noopener noreferrer"&gt;Proxyman&lt;/a&gt; auto-use the selected endpoint as the condition, you would see the endpoint &lt;a href="https://api.producthunt.com/v1%E2%80%A6" rel="noopener noreferrer"&gt;https://api.producthunt.com/v1…&lt;/a&gt; is auto-filled. Here we want to change the status code only so let’s uncheck the Request box&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F8m87z6wsq8hsgo0s9cs2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F8m87z6wsq8hsgo0s9cs2.png" alt="Uncheck Request box for modifying Response only"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After hitting &lt;strong&gt;Done&lt;/strong&gt;, we can see that new rule has been added up to the Breakpoint rules window&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F780mwjdmtm30j7ymd0q5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F780mwjdmtm30j7ymd0q5.png" alt="New Matching Rules is added after hitting Done button"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With that all set up, it’s time to modify the status code to see how our app behaves&lt;/p&gt;

&lt;h3&gt;
  
  
  Change Status code
&lt;/h3&gt;

&lt;p&gt;As soon as we re-send the request, that API call would be captured and a Breakpoints window would pop-up so that we can edit our queries on the fly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fpdq9mu5hquczuy6p246c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fpdq9mu5hquczuy6p246c.png" alt="Go to tab Other → change the status code as we want"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The status code is separated into tab Other so you can go there and change as you want. As you can see, after changing the status code into &lt;strong&gt;400&lt;/strong&gt; and hit &lt;strong&gt;Execute&lt;/strong&gt;, the response is now updated with signal &lt;strong&gt;Error 400&lt;/strong&gt; in the main window&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fhbif3ce68ujzq79iriy2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fhbif3ce68ujzq79iriy2.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What’s next?
&lt;/h3&gt;

&lt;p&gt;That’s how easy to use &lt;strong&gt;Breakpoint&lt;/strong&gt; to modify status codes for testing purposes. We can also use this tool to &lt;a href="https://proxyman.io/blog/2019/09/Use-Breakpoint-to-intercept-and-edit-request-response-on-iOS-app.html" rel="noopener noreferrer"&gt;manipulate the content of requests/ responses&lt;/a&gt;. Hope that you would find it helpful to boost productivity :)&lt;/p&gt;




&lt;p&gt;Proxyman is a high-performance macOS app, which enables developers to view HTTP/HTTPS requests from apps and domains on iOS device, iOS Simulator and Android devices. Get it at &lt;a href="https://proxyman.io" rel="noopener noreferrer"&gt;https://proxyman.io&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ios</category>
      <category>android</category>
      <category>sslproxying</category>
      <category>debuggingtools</category>
    </item>
    <item>
      <title>Use Breakpoint to intercept and edit HTTP requests/responses</title>
      <dc:creator>Renée</dc:creator>
      <pubDate>Tue, 17 Sep 2019 08:12:45 +0000</pubDate>
      <link>https://dev.to/renee/use-breakpoint-to-intercept-and-edit-requests-responses-2dp4</link>
      <guid>https://dev.to/renee/use-breakpoint-to-intercept-and-edit-requests-responses-2dp4</guid>
      <description>&lt;p&gt;In software development, a breakpoint is known as “an intentional stopping or pausing place” where you can examine, edit API requests or responses and even decide whether to block it or allow it to proceed. This blog demonstrates how I use Proxyman Breakpoint tool to manipulate those API calls for debugging purposes.&lt;/p&gt;




&lt;h3&gt;
  
  
  When to use Breakpoint
&lt;/h3&gt;

&lt;p&gt;Basically, if you enable Breakpoint for request, &lt;a href="https://proxyman.io/"&gt;Proxyman&lt;/a&gt; will stop the request before it goes to your server. If you enable Breakpoint for response, it will stop the response before it goes to your app. Thus, you can modify such requests/ responses to test UI errors or certain back end functionalities (including security vulnerabilities). In this blog, just take 2 simple examples to see how Breakpoint works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Example 1: Change user’s search query to see how the app behaves (Modify request)&lt;/li&gt;
&lt;li&gt;Example 2: Change user name and avatar in the Response to see if the UI can handle long messages (Modify response)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Install Proxyman Certificate on remote device
&lt;/h3&gt;

&lt;p&gt;Before we start, let’s &lt;a href="https://proxyman.io/blog/2019/06/How-I-use-Proxyman-to-see-HTTP-requests-responses-on-my-iPhone.html"&gt;install Proxyman Certificate on my iOS device&lt;/a&gt; so that we are able to see HTTPs content&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8q29cf0_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/0zo0swwujd41s2187bed.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8q29cf0_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/0zo0swwujd41s2187bed.png" alt="Requests coming from my remote device&amp;lt;br&amp;gt;
"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To be more focused, let’s use &lt;a href="https://proxyman.io/blog/2019/06/How-I-use-Proxyman-to-see-HTTP-requests-responses-on-my-iPhone.html"&gt;Pin&lt;/a&gt; to isolate two endpoints &lt;strong&gt;“api.unsplash.com/me”&lt;/strong&gt; &amp;amp; &lt;strong&gt;“api.unsplash.com/search”&lt;/strong&gt; for our testing scenarios&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--swKtv-gc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/sfdojwj7db64ozbdmkda.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--swKtv-gc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/sfdojwj7db64ozbdmkda.png" alt="Use Pin to isolate endpoints"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Define Matching Rules with Endpoints
&lt;/h3&gt;

&lt;p&gt;Now it’s time for us to define how Breakpoint captures &lt;em&gt;out-going&lt;/em&gt; requests and &lt;em&gt;in-coming&lt;/em&gt; responses. Basically, these conditions can be setup by two ways:&lt;/p&gt;

&lt;h4&gt;
  
  
  Option 1: Menu bar
&lt;/h4&gt;

&lt;p&gt;From &lt;strong&gt;Menu bar&lt;/strong&gt; -&amp;gt; select &lt;strong&gt;Tools&lt;/strong&gt; -&amp;gt; select &lt;strong&gt;Breakpoint&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Rules&lt;/strong&gt;. Then a Breakpoint rules window will pop-up so that we can define matching conditions&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zNZgi8Pv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/izufvre3x71g2cp5ztla.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zNZgi8Pv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/izufvre3x71g2cp5ztla.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To add new rule, you can click the &lt;strong&gt;“+”&lt;/strong&gt; button at the bottom left corner of the window&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tAVJH6QQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/qi35uxfp6gfojm7bg35j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tAVJH6QQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/qi35uxfp6gfojm7bg35j.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As we only want to change the search query for the first scenario, let’s type in the endpoint &lt;strong&gt;“api.unsplash.com/search”&lt;/strong&gt; and select “Request” only&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2uD-pASc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/juqat029aqh57pg0cae9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2uD-pASc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/juqat029aqh57pg0cae9.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After hitting &lt;strong&gt;“Add”&lt;/strong&gt; button, we know that any out-going requests to that endpoint would be stopped by the Breakpoint from now on :)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oKqBos_Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/4yiauhybjnnsibmy0x2z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oKqBos_Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/4yiauhybjnnsibmy0x2z.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Option 2: Right click
&lt;/h4&gt;

&lt;p&gt;Another option to define matching rule is to &lt;strong&gt;Right Click&lt;/strong&gt; the selected URL (endpoint) -&amp;gt; select &lt;strong&gt;Tools&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Breakpoint&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Tl4zGLRc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/qd3i289mk3wea7x00ct4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Tl4zGLRc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/qd3i289mk3wea7x00ct4.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As Proxyman auto-use the selected endpoint as the condition, we should see the endpoint &lt;strong&gt;“api.unsplash.com/me”&lt;/strong&gt; is auto-filled as below&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Z9UrK4i---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/wfc4xsmus1tzvjks0qx6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Z9UrK4i---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/wfc4xsmus1tzvjks0qx6.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As we only want to change Response, let’s select “Response” for the second scenario. After hitting &lt;strong&gt;“Done”&lt;/strong&gt; button, that new rule has been added up to the Breakpoint rules window&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TUV25USx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/sz3ofrull9rhyd2eyv3f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TUV25USx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/sz3ofrull9rhyd2eyv3f.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With that all set up, it’s time to modify requests/responses to see how our app behaves :)&lt;/p&gt;

&lt;h3&gt;
  
  
  Modify requests with Breakpoint
&lt;/h3&gt;

&lt;p&gt;First, let’s run the Unsplash application; then from &lt;em&gt;Search box&lt;/em&gt;, type in the keyword &lt;em&gt;“eat clean”&lt;/em&gt; to navigate to the endpoint that triggers Breakpoint. As soon as the API call is captured, a &lt;strong&gt;Breakpoints window&lt;/strong&gt; would pop-up so that we can modify the query&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qncU7x0d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/di7agyht2rljvrlc99i4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qncU7x0d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/di7agyht2rljvrlc99i4.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s change our search query from &lt;em&gt;“eat clean”&lt;/em&gt; to &lt;em&gt;“mountain”&lt;/em&gt;…&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0xavU1ec--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ktrss4fqarrpgg38h4z8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0xavU1ec--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ktrss4fqarrpgg38h4z8.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;… and instead of showing &lt;em&gt;“eat clean”&lt;/em&gt; images as origin request (Left), the app render &lt;em&gt;“mountain”&lt;/em&gt; images (Right) as we expect :)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vIJA68_x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ryoiufv15ractbl1ghnx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vIJA68_x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ryoiufv15ractbl1ghnx.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Modify responses with Breakpoint
&lt;/h3&gt;

&lt;p&gt;Similarly to editing the request, we are able to edit the content of response also. Let’s just re-open the Unsplash app to call the endpoint &lt;strong&gt;“api.unsplash.com/me”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--O2v56_VW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/4axrmzamx22y8r25y7rp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--O2v56_VW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/4axrmzamx22y8r25y7rp.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the API response is captured, we could change the username and avatar to see how our app handles. Here I edit the user name to be longer and update the avatar&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9locrKeW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/8qrjg2176mn5pxzd3bgl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9locrKeW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/8qrjg2176mn5pxzd3bgl.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once hitting &lt;strong&gt;“Execute”&lt;/strong&gt;, the modified Profile shows up with new username and avatar instead of original ones :)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MpxY2qAV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/4ftfsu9npwubm9khvi81.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MpxY2qAV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/4ftfsu9npwubm9khvi81.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What’s next?
&lt;/h3&gt;

&lt;p&gt;With Breakpoint, it is possible for you to change any parts of the API request/response, but please bear in mind that it might misbehave or crash when it doesn’t get the correct format it’s expecting to receive. With that being said, do not hesitate to experience and boost your productivity with this tool. Happy debugging :)&lt;/p&gt;




&lt;p&gt;&lt;a href="https://proxyman.io/"&gt;Proxyman&lt;/a&gt; is a high-performance macOS app, which enables developers to view HTTP/HTTPS requests from apps and domains on iOS device, iOS Simulator and Android devices. Check it out at &lt;a href="https://proxyman.io/"&gt;https://proxyman.io/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ios</category>
      <category>android</category>
      <category>sslproxying</category>
      <category>debugtools</category>
    </item>
    <item>
      <title>How I use Proxyman to see HTTP requests/responses on my iPhone?</title>
      <dc:creator>Renée</dc:creator>
      <pubDate>Mon, 13 May 2019 14:58:44 +0000</pubDate>
      <link>https://dev.to/renee/how-i-use-proxyman-to-see-http-requests-responses-on-my-iphone-dpc</link>
      <guid>https://dev.to/renee/how-i-use-proxyman-to-see-http-requests-responses-on-my-iphone-dpc</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0fd75s7gphcc6igci156.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0fd75s7gphcc6igci156.png"&gt;&lt;/a&gt;&lt;br&gt;
Last month, I’ve found a newly developed application called Proxyman. It is a native macOS app and its features are so handy for debugging that I really want to share with others. In this post, I used the app to see Response content from Unsplash app on my device.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Configuration:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1.1/ Download the app&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I downloaded the newest version from its website &lt;a href="https://proxyman.io/" rel="noopener noreferrer"&gt;https://proxyman.io/&lt;/a&gt;&lt;br&gt;
The UI is pretty clean and I can see all the requests coming right after opening the app&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsjlflmlxky452yragnsg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsjlflmlxky452yragnsg.png" alt="This is the main screen with all captured requests when I open the app"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.2/ Setup Certificate for my iPhone&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Then go to Certificate -&amp;gt; Install Certificate on iPhone Device. There would be an instruction to guide you how to configure certificate on iPhone/ iOS Simulator&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Ftvv0aloq1208jkyy6xkb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Ftvv0aloq1208jkyy6xkb.png" alt="Click Certificate -&amp;gt; Install Certificate on iPhone Device"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.3/ Config Wifi pointing to Proxyman&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go to Setting -&amp;gt; Wifi -&amp;gt; (Select current Wifi) -&amp;gt; Configure Proxy -&amp;gt; Manual . Then I used the same Server and Port on Guideline to configure Proxy on my iPhone&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk53hzgx4oy22arnd74m6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk53hzgx4oy22arnd74m6.png"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fryelmzaw69agtxhshhgh.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fryelmzaw69agtxhshhgh.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.4/ Allow permission to install Proxyman&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At this step, I saw all requests coming from my device on Proxyman app. However, in order to see content of Responses, I will need to install Proxyman Certificate&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fge40mzitkr18a7b0ea7c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fge40mzitkr18a7b0ea7c.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On my iPhone, I go to Safari -&amp;gt; &lt;a href="http://proxyman.io/ssl" rel="noopener noreferrer"&gt;http://proxyman.io/ssl&lt;/a&gt; -&amp;gt; Accept permission for installing Proxyman Certificate&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.5/ Install Certificate from /ssl&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Then go to Setting -&amp;gt; General -&amp;gt; Profile -&amp;gt; Select Proxyman -&amp;gt; Install&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8aw41v49kps86khe84ai.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8aw41v49kps86khe84ai.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.6/ Trust Certificate on iPhone&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It is said that since the iOS 10.3+, we need to trust certificate manually. Thus, final step is go to Setting App -&amp;gt; General -&amp;gt; About -&amp;gt; Certificate Trust Settings -&amp;gt; Turn ON “Enable full trust for root certificates”&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk9u8o07p62jfc0vc5d2b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk9u8o07p62jfc0vc5d2b.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can see that all my iPhone’s requests showed up after I finished configuring proxy&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqqe5jxfrx8liltkayu7v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqqe5jxfrx8liltkayu7v.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Time to debug Unplash
&lt;/h3&gt;

&lt;p&gt;OK, enough config. It’s time to actually see HTTP requests/ responses coming from Unsplash app&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.1/ Search a domain&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I searched for app Unsplash with Command+Shift+F (You can also search the app using Search bar)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2z6y6nuquvalrf71yl7n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2z6y6nuquvalrf71yl7n.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.2/ Pin a domain&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhl6czp5x796woz9lplb2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhl6czp5x796woz9lplb2.png"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsft6dqiavrrlydsimze1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsft6dqiavrrlydsimze1.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is one of interesting features of this app. I can Drag, Drop a specific domain into Pin section. I find it pretty useful to organize and focus, especially when I have to work with several applications, domains.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.3/ See HTTP content&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you double click a request, you would see the Request and Response on the right panel. However, to see content of a Response, you will need to Enable domain and Reload the request.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft0t29fgr27bxe3l5u4r5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft0t29fgr27bxe3l5u4r5.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.4/ Open content with Editing tool&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd9mbsdta1w83b9gwff6o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd9mbsdta1w83b9gwff6o.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is a small button on the top right corner. When I click to that, the app reveals some Editing tools that I am currently using. I can open my Response content to edit, which I found pretty convenient.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fznx652peln5e2btzbupa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fznx652peln5e2btzbupa.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;## What going next?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you are a tester or front-end developer, the odds are that you have been familiar with debugging tools like Charles. It is a powerful debugging app, but somehow it doesn’t fit me. Meanwhile, Proxyman is not fully-developed yet, but it seems to have many potentials. On the next post, I’ll compare some key features between Charles’s and Proxyman’s and what I think about the pros and cons of these 2 apps. How about you? What do you think about Charles and Proxyman? &lt;/p&gt;

</description>
      <category>ios</category>
      <category>debugtool</category>
      <category>proxy</category>
    </item>
    <item>
      <title>iOS tips to boost my productivity</title>
      <dc:creator>Renée</dc:creator>
      <pubDate>Sat, 04 May 2019 08:13:45 +0000</pubDate>
      <link>https://dev.to/renee/ios-tips-to-boost-my-productivity-4k9d</link>
      <guid>https://dev.to/renee/ios-tips-to-boost-my-productivity-4k9d</guid>
      <description>&lt;p&gt;It's the first time I've written this technical blog on Dev.to. &lt;/p&gt;

&lt;p&gt;This tip will list all useful libraries and tools, which my team and I use every day.&lt;/p&gt;

&lt;p&gt;Hopefully, this tip can increase your productivity during iOS development 😍&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://github.com/Moya/Moya"&gt;Moya&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Moya is a convenient library to help me to categorize the networking route easily. Rather than introducing big Networking class, I define the &lt;code&gt;AppEndpoint&lt;/code&gt; enum and introduce all route here.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;enum&lt;/span&gt; &lt;span class="kt"&gt;AppEndpoint&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nf"&gt;login&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;LoginParam&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nf"&gt;signup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;SignupParam&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nf"&gt;fetchUserInfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;UserParam&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;provider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;MoyaProvider&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;AppEndpoint&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;provider&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;login&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;param&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
    &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;success&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;moyaResponse&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;// Handle data&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;failure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
       &lt;span class="c1"&gt;// Error&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Abstract the Networking Layer&lt;/li&gt;
&lt;li&gt;Hide the Business logic &lt;/li&gt;
&lt;li&gt;Easily categorize the API route&lt;/li&gt;
&lt;li&gt;Beautiful Result.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://github.com/roberthein/TinyConstraints"&gt;TinyConstraints&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;One of the lightweight class to help me overcome the pain in my ass when working with NSConstraintLayout.&lt;/p&gt;

&lt;p&gt;It's just a one-line code to attach the subview to fill out the parent ;D&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;edgesToSuperView&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;a href="https://revealapp.com/"&gt;Reveal&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Reveal is one of the important apps for me to implement pixel perfect. Most of the time I inspect the view layers, the Xcode tool isn't sufficient for me since I have to calculate the off pixel. Reveal is my rescuer. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--F7VYQsxG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/3vsrg46bm8ba4q9nc3k1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--F7VYQsxG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/3vsrg46bm8ba4q9nc3k1.png" alt="Reveal"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Easily inspect the complex view hierarchy&lt;/li&gt;
&lt;li&gt;Don't need to debug directly from Xcode&lt;/li&gt;
&lt;li&gt;Native app&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://proxyman.io/"&gt;Proxyman&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Proxyman is one of must-use tool for the QA and iOS team in my company.&lt;/p&gt;

&lt;p&gt;It helps me to see the HTTPS response and easier to catch the bug. In the past, we used to use Charles, but my team prefers Proxyman since the UI is nicer&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6k3kP2eu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/qpl8mtn7hkejl4oh5yhr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6k3kP2eu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/qpl8mtn7hkejl4oh5yhr.jpg" alt="Proxyman"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The request and response content are so sweet&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GI8zy4pT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/2p0mmgjjwhfg4qefc483.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GI8zy4pT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/2p0mmgjjwhfg4qefc483.png" alt="Proxyman"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Easy to edit the bug request and try again with new param&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--il1YwJuZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/28qn2fwteuk20a8icrha.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--il1YwJuZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/28qn2fwteuk20a8icrha.png" alt="Repeat"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Able to export the session for QA team - it's great for reproducing the bug later&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8KfrAhlu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/bxkgvc9d280u3vr7w6fm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8KfrAhlu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/bxkgvc9d280u3vr7w6fm.png" alt="Debug"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Modern and native app&lt;/li&gt;
&lt;li&gt;Easily reproduce the bug from QA team&lt;/li&gt;
&lt;li&gt;Work with iOS simulator and iPhone too, which is awesome 😮&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Other
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/realm/SwiftLint"&gt;SwiftLint&lt;/a&gt; for enforcing the Syntax&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/danger/danger"&gt;Danger&lt;/a&gt;: It's accompanied with SwiftLint to inform my teammate automatically in Github.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/fastlane/fastlane"&gt;Fastlane&lt;/a&gt; and Bitrise for CI/CD&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://realm.io/"&gt;Realm&lt;/a&gt; is the best candidate for Database storage and lightweight &lt;a href="https://github.com/Tencent/MMKV"&gt;MMKV Key-Value storage&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Instagram/IGListKit"&gt;IGListKit&lt;/a&gt; for high-performance listing.&lt;/li&gt;
&lt;li&gt;Diff Algorithm for reloading huge UITableView efficiently.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you know any useful iOS libraries or tools, please share with me 👏&lt;/p&gt;

</description>
      <category>ios</category>
      <category>tip</category>
      <category>beginners</category>
      <category>debugging</category>
    </item>
  </channel>
</rss>
