<?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: Jakub Roztocil</title>
    <description>The latest articles on DEV Community by Jakub Roztocil (@jkbrzt).</description>
    <link>https://dev.to/jkbrzt</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%2F5198%2F6d8bd7e6-c099-44d4-843d-a37b8c6e73ed.png</url>
      <title>DEV Community: Jakub Roztocil</title>
      <link>https://dev.to/jkbrzt</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jkbrzt"/>
    <language>en</language>
    <item>
      <title>HTTPie AI assistant</title>
      <dc:creator>Jakub Roztocil</dc:creator>
      <pubDate>Wed, 04 Jan 2023 12:24:56 +0000</pubDate>
      <link>https://dev.to/pie/httpie-ai-assistant-4pmg</link>
      <guid>https://dev.to/pie/httpie-ai-assistant-4pmg</guid>
      <description>&lt;p&gt;Today we’re launching HTTPie AI, a new way to interact with APIs ✨&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhttpie.io%2FImages%2FBlog%2Fai.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhttpie.io%2FImages%2FBlog%2Fai.gif" alt="HTTPie AI in action" width="560" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;HTTPie AI assistant, built into HTTPie for &lt;a href="https://httpie.io/app" rel="noopener noreferrer"&gt;Web&lt;/a&gt; &amp;amp; &lt;a href="https://httpie.io/product" rel="noopener noreferrer"&gt;Desktop&lt;/a&gt;, uses state-of-the-art artificial intelligence to increase your productivity when testing and talking to APIs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Free product preview
&lt;/h2&gt;

&lt;p&gt;This initial release allows you to create requests using human language.  While in preview, you can use HTTPie AI for free with an HTTPie account. Gradually, AI capabilities will expand throughout the platform.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fpzdinwvwh2ljdi7fivix.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fpzdinwvwh2ljdi7fivix.png" width="800" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Let’s say you want to fetch the details of the &lt;a href="https://github.com/httpie/dekstop" rel="noopener noreferrer"&gt;httpie/desktop&lt;/a&gt; repo from the GitHub API. This requires translating the intent to the corresponding HTTP request and entering it into the client’s UI. You need to have some degree of understanding of the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How the API or server works (e.g., hostname, endpoints, auth)&lt;/li&gt;
&lt;li&gt;How HTTP works (e.g., headers, methods, body)&lt;/li&gt;
&lt;li&gt;How to instruct the client to send the exact request&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What if instead of creating requests manually, we could tell HTTPie to “fetch repo details of httpie/desktop”? Or even in another language like Spanish, «obtén los detalles del repositorio httpie/desktop»?&lt;/p&gt;

&lt;p&gt;Well, now you can!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fhfbzrcxxxxtiv073tdel.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fhfbzrcxxxxtiv073tdel.png" width="800" height="484"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Craft requests using human language
&lt;/h2&gt;

&lt;p&gt;You can type your prompt directly in HTTPie’s URL field. It’s similar to typing a search query in your browser’s address bar instead of the exact URL.&lt;/p&gt;

&lt;p&gt;Alternatively, you can open the HTTPie AI dialog from the “+” menu in the library. In the desktop app, you can also use ⌘I. There’s a difference in that when you start in the URL field, accepting the generated request will update the one in the current tab instead of creating a new one.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fn2shh79cfm6uu6q7mrbi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fn2shh79cfm6uu6q7mrbi.png" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then hit “Generate” to get a suggestion.&lt;/p&gt;

&lt;p&gt;If you like the request, save it. The saved request automatically gets a short name generated by the AI. If you don’t like it, you can hit “Generate” again, which often produces a different result. You can also try editing the prompt.  If the request includes any placeholders or obvious errors, you can modify it straight from the dialog before saving it (or you can do that after).&lt;/p&gt;

&lt;p&gt;There are two strategies for writing HTTPie prompts: &lt;em&gt;describing the request&lt;/em&gt; and &lt;em&gt;describing the intent&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Describing the request
&lt;/h3&gt;

&lt;p&gt;You can ask the AI to generate an HTTP request by describing its low-level components like the URL, headers, and body:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Generate an array of 3 blog posts with title, author, and summary and post it to localhost 3000 api as user agent HTTPie AI
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.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%2F37pxl0ok3nbgnndjdaie.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F37pxl0ok3nbgnndjdaie.png" width="800" height="983"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Describing the intent
&lt;/h3&gt;

&lt;p&gt;For actions involving public APIs of popular services, you can describe the high-level tasks you want to accomplish:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;List GitHub users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.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%2Fycg2brhtgim40la6bxsf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fycg2brhtgim40la6bxsf.png" width="800" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is another example, where the model picks up that we mean a GitHub repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fetch last release details of httpie/desktop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.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%2Fcu6gn1p923pudubzd98a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fcu6gn1p923pudubzd98a.png" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Feedback and accuracy
&lt;/h3&gt;

&lt;p&gt;Like many generative AI applications, the accuracy of the outcome may vary depending on the prompt and other factors. Review the generated request and iterate on the prompt as needed. Higher specificity often leads to better results. You can quickly correct errors directly in the dialog before saving the request. As you use HTTPie AI, please provide quick feedback on the suggestions via the thumb-down and thumb-up buttons to help us fine-tune accuracy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Entering the era of AI copilots
&lt;/h2&gt;

&lt;p&gt;As large language models (LLMs) gain robust generative capabilities, creative tools are evolving toward AI-powered experiences.&lt;/p&gt;

&lt;p&gt;HTTPie is now becoming the first API development platform with AI assistance, and we’d love your feedback!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F3hapsg66uanrg2qncjoi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F3hapsg66uanrg2qncjoi.png" alt="AI copilots: GitHub Copilot, Replit Ghostwriter, Canva Magic Write, Notion AI, HTTPie AI" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How we built it
&lt;/h2&gt;

&lt;p&gt;We built this initial feature preview using OpenAI’s GPT-3 models. &lt;/p&gt;

&lt;p&gt;In the process, we refactored the &lt;a href="https://github.com/openai/openai-python" rel="noopener noreferrer"&gt;openai/openai-python&lt;/a&gt; library to make the default installation size &lt;a href="https://github.com/openai/openai-python/pull/153" rel="noopener noreferrer"&gt;~7⨉ smaller&lt;/a&gt; (167M → 23M). Now it’s much more manageable to deploy OpenAI-powered applications using this library in environments with code size constraints, such as AWS Lambda.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s next
&lt;/h2&gt;

&lt;p&gt;We’ll continue improving the assistant’s accuracy and adding more capabilities throughout the HTTPie platform.&lt;/p&gt;

&lt;p&gt;Jump into the &lt;a href="https://httpie.io/app" rel="noopener noreferrer"&gt;Web&lt;/a&gt; app or download the &lt;a href="https://httpie.io/product" rel="noopener noreferrer"&gt;Desktop&lt;/a&gt; app and check it out!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✉️ Thoughts? Questions? Shoot us an email at &lt;a href="mailto:feedback@httpie.io"&gt;feedback@httpie.io&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;📋 You can also help us improve by completing a &lt;a href="https://httpie.io/survey" rel="noopener noreferrer"&gt;quick survey&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;👉 Follow &lt;a href="https://twitter.com/httpie" rel="noopener noreferrer"&gt;@httpie&lt;/a&gt; and join our &lt;a href="https://httpie.io/discord" rel="noopener noreferrer"&gt;Discord community&lt;/a&gt; to stay up to date.&lt;/li&gt;
&lt;li&gt;👩‍💻 We’re looking for new colleagues in &lt;a href="https://httpie.io/jobs" rel="noopener noreferrer"&gt;engineering and other roles&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PS: We’re looking for a more personable name for our assistant 💡&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://httpie.io/blog/ai" rel="noopener noreferrer"&gt;https://httpie.io/blog/ai&lt;/a&gt;&lt;/p&gt;

</description>
      <category>httpie</category>
      <category>ai</category>
      <category>api</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Changelog #0022 — 🪄 HTTPie AI assistant, methods in tabs, and more</title>
      <dc:creator>Jakub Roztocil</dc:creator>
      <pubDate>Wed, 04 Jan 2023 12:20:25 +0000</pubDate>
      <link>https://dev.to/pie/changelog-0022-httpie-ai-assistant-methods-in-tabs-and-more-20ec</link>
      <guid>https://dev.to/pie/changelog-0022-httpie-ai-assistant-methods-in-tabs-and-more-20ec</guid>
      <description>&lt;p&gt;Happy &lt;a href="https://twitter.com/httpie/status/1609345468529577991" rel="noopener noreferrer"&gt;new year&lt;/a&gt;! 🥳 Let’s start it with a new release of HTTPie for &lt;a href="https://httpie.io/app" rel="noopener noreferrer"&gt;Web&lt;/a&gt; &amp;amp; &lt;a href="https://httpie.io/product" rel="noopener noreferrer"&gt;Desktop&lt;/a&gt;. Check out what we shipped &lt;a href="https://github.com/httpie/desktop/releases/tag/v2023.1.0" rel="noopener noreferrer"&gt;v2023.1.0&lt;/a&gt; 👇&lt;/p&gt;

&lt;h2&gt;
  
  
  🔖 Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🪄 HTTPie AI assistant –&lt;/strong&gt; Introducing a new way to interact with APIs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🗂️ Methods in tabs –&lt;/strong&gt; Easier navigation with HTTP methods in tabs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📚 Library context menu —&lt;/strong&gt; New context menu for quick library actions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🌊 cURL as URL —&lt;/strong&gt; Type a cURL command in the address field.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;✨ Other improvements —&lt;/strong&gt; Tweaks and fixes for improved API testing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🪄 Introducing HTTPie AI
&lt;/h2&gt;

&lt;p&gt;Today we’re launching HTTPie AI, a new way to interact with APIs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fntd2dy8l6z5jcjbd9vo7.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fntd2dy8l6z5jcjbd9vo7.gif" alt="HTTPie AI in action" width="560" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;HTTPie AI assistant uses artificial intelligence to increase your productivity when testing and talking to APIs. This free feature preview allows you to create requests using human language.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://httpie.io/blog/ai" rel="noopener noreferrer"&gt;Read the full announcement&lt;/a&gt; →&lt;/p&gt;

&lt;h2&gt;
  
  
  🗂️ See methods in tabs
&lt;/h2&gt;

&lt;p&gt;HTTPie now shows the HTTP method next to the request name in the request tabs:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F7qq3ns3w6wbsvhal2jgp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F7qq3ns3w6wbsvhal2jgp.png" alt="HTTP methods shown in tabs" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This way, you can easily distinguish between tabs for requests using different methods but with the same name or URL. The &lt;code&gt;&amp;lt;method&amp;gt; &amp;lt;name&amp;gt;&lt;/code&gt; pair works nicely as a &lt;code&gt;&amp;lt;verb&amp;gt; &amp;lt;noun&amp;gt;&lt;/code&gt; sentence — a request identification system we already use in the library.&lt;/p&gt;

&lt;h2&gt;
  
  
  📚️ Quick library actions with new context menu
&lt;/h2&gt;

&lt;p&gt;There’s a lot of action behind the innocently looking “+” button in the library. To make it more accessible, you can now invoke a similar menu through a right-click anywhere in the empty space in the sidebar:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fryfs8s2qqhlkszlod17e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fryfs8s2qqhlkszlod17e.png" alt="Right-click an empty area in the sidebar to open Library context menu" width="800" height="566"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🌊 Type a cURL command in the address field
&lt;/h2&gt;

&lt;p&gt;You can &lt;a href="https://httpie.io/blog/changelog-0017#curl-import" rel="noopener noreferrer"&gt;paste a cURL command into the URL field&lt;/a&gt; for quick import. In this release, we added the ability to type an &lt;a href="https://httpie.io/blog/ai" rel="noopener noreferrer"&gt;AI prompt&lt;/a&gt; into the address field, and at the same time, we extended it to support typing cURL commands.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Ff9zvbs9m8a888k2lahal.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Ff9zvbs9m8a888k2lahal.png" alt="cURL command in the URL field" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Support for HTTPie CLI commands is coming soon.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✨ Other improvements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Added numerous on-import clean-ups like detecting GraphQL requests based on the body to import them with the GraphQL body type or moving Bearer tokens from &lt;code&gt;Authorization: Bearer …&lt;/code&gt; headers to the auth tab.&lt;/li&gt;
&lt;li&gt;Added more robust &lt;a href="https://httpie.io/blog/changelog-0018#navigate-apis-faster-with-interactive-urls" rel="noopener noreferrer"&gt;interactive URL&lt;/a&gt; matching. HTTPie will now add interactivity to links containing an IP address, port number, or pointing to &lt;code&gt;localhost&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Added RSS feeds to this blog; grab one for your feed reader to stay up-to-date: ⚡️&lt;a href="https://httpie.io/api/feed/atom" rel="noopener noreferrer"&gt;Atom 1.0&lt;/a&gt;, ⚡️&lt;a href="https://httpie.io/api/feed/rss" rel="noopener noreferrer"&gt;RSS 2.0&lt;/a&gt;, ⚡️&lt;a href="https://httpie.io/api/feed/json" rel="noopener noreferrer"&gt;JSON Feed 1.1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Fixed the auto-update system not to bother you once you choose “Install on next launch.” (&lt;a href="https://github.com/httpie/desktop/issues/55" rel="noopener noreferrer"&gt;#55&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🤩 Happy API testing, and see you again soon!
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✉️ Thoughts? Questions? Shoot us an email at &lt;a href="mailto:feedback@httpie.io"&gt;feedback@httpie.io&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;📋 You can also help us improve by completing a &lt;a href="https://httpie.io/survey" rel="noopener noreferrer"&gt;quick survey&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;👥 We’re working on collaboration features, and you can &lt;a href="https://httpie.io/blog/changelog-0019#help-wanted-teams-and-collaboration" rel="noopener noreferrer"&gt;help us out&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;👉 Follow &lt;a href="https://twitter.com/httpie" rel="noopener noreferrer"&gt;@httpie&lt;/a&gt; and join our &lt;a href="https://httpie.io/discord" rel="noopener noreferrer"&gt;Discord community&lt;/a&gt; to stay up to date.&lt;/li&gt;
&lt;li&gt;👩‍💻 We’re looking for new colleagues in &lt;a href="https://httpie.io/jobs" rel="noopener noreferrer"&gt;engineering and other roles&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Originally published on &lt;a href="https://httpie.io/blog/changelog-0022" rel="noopener noreferrer"&gt;https://httpie.io/blog/changelog-0022&lt;/a&gt;&lt;/p&gt;

</description>
      <category>httpie</category>
      <category>ai</category>
      <category>api</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Changelog #0021 — 📯 Advanced import, GraphQL schema support, and more</title>
      <dc:creator>Jakub Roztocil</dc:creator>
      <pubDate>Thu, 08 Dec 2022 12:25:00 +0000</pubDate>
      <link>https://dev.to/pie/changelog-0021-advanced-import-graphql-schema-support-and-more-5apc</link>
      <guid>https://dev.to/pie/changelog-0021-advanced-import-graphql-schema-support-and-more-5apc</guid>
      <description>&lt;p&gt;Hello, API World! Check out what we shipped in &lt;a href="https://github.com/httpie/desktop/releases/tag/v2022.16.0" rel="noopener noreferrer"&gt;v2022.16.0&lt;/a&gt;&lt;br&gt;
of HTTPie for &lt;a href="https://httpie.io/app" rel="noopener noreferrer"&gt;Web&lt;/a&gt; &amp;amp; &lt;a href="https://httpie.io/product" rel="noopener noreferrer"&gt;Desktop&lt;/a&gt; 👇&lt;/p&gt;

&lt;h2&gt;
  
  
  🔖 Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;📯 Advanced import –&lt;/strong&gt; Migrate your data from Postman and Insomnia.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🪄 GraphQL schema support –&lt;/strong&gt; Auto-complete, validation, and more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;✨ Other improvements —&lt;/strong&gt; Tweaks and fixes for improved API testing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📯 Import your Postman and Insomnia data to HTTPie
&lt;/h2&gt;

&lt;p&gt;Since our &lt;a href="https://httpie.io/blog/changelog-0017" rel="noopener noreferrer"&gt;public beta launch&lt;/a&gt; a few months ago, the adoption of HTTPie for Web &amp;amp; Desktop has been growing. Many of our new users have migrated from other API testing clients like Postman and Insomnia, and they’ve been asking for a smoother migration path.&lt;/p&gt;

&lt;p&gt;So in this release, we focused on streamlining the migration process, and—in addition to the existing &lt;a href="https://httpie.io/blog/changelog-0017#curl-import" rel="noopener noreferrer"&gt;cURL import&lt;/a&gt;—you can now import entire collections, environments and data dump zips from Postman and Insomnia.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fflnm8j51uj922ksmq5m1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fflnm8j51uj922ksmq5m1.png" alt="A graph showing the steep growth of active usage of HTTPie for Web &amp;amp; Desktop" width="800" height="488"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 Migrate to HTTPie in a few simple steps
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Export&lt;/strong&gt; your data &lt;a href="https://httpie.io/r/docs/app/export-from-postman" rel="noopener noreferrer"&gt;from Postman&lt;/a&gt; or &lt;a href="https://httpie.io/r/docs/app/export-from-insomnia" rel="noopener noreferrer"&gt;from Insomnia&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Open the import dialog (Library → “+” → “Import…”).&lt;/li&gt;
&lt;li&gt;Drag &amp;amp; drop the exported file and click “Next…”.&lt;/li&gt;
&lt;li&gt;Select the target space and click “Import.”&lt;/li&gt;
&lt;li&gt;Done! Welcome to HTTPie 🤗&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F3h8c1jm90jlao3hvua4c.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F3h8c1jm90jlao3hvua4c.gif" alt="A video of importing a zipped data dump from Postman" width="720" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💡 Tip: Create a new space during the import to keep things tidy.&lt;/p&gt;

&lt;h3&gt;
  
  
  🛂 Import compatibility
&lt;/h3&gt;

&lt;p&gt;Here’s an overview of what elements HTTPie currently imports from Postman and Insomnia and how. As we gradually add new features to HTTPie, we’ll continue to improve the import as well.&lt;/p&gt;

&lt;h4&gt;
  
  
  🛫️ Importing requests
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Request element&lt;/th&gt;
&lt;th&gt;Imported?&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;HTTP Requests&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GraphQL requests&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gRPC requests&lt;/td&gt;
&lt;td&gt;✘&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WebSockets&lt;/td&gt;
&lt;td&gt;✘&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Request method&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;Including custom ones.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Request URL&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;URL parameters&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Headers&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;Basic, bearer, API key, and inherited auth.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Body&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;Text, raw, JSON, and form request bodies.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Body files&lt;/td&gt;
&lt;td&gt;✘&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  🍱️ Importing containers
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Container&lt;/th&gt;
&lt;th&gt;Imported?&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Collections&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;See collection variables below.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sub-folders&lt;/td&gt;
&lt;td&gt;✘&lt;/td&gt;
&lt;td&gt;Folder hierarchy is preserved as breadcrumbs in request names.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  🖼️️ Importing environments &amp;amp; variables
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Element&lt;/th&gt;
&lt;th&gt;Imported?&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Environments&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default variables&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Collection variables&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;We move non-global variables to the space level and refactor names and references to ensure uniqueness.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  💧 Importing other elements
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Other element&lt;/th&gt;
&lt;th&gt;Imported?&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Scripting&lt;/td&gt;
&lt;td&gt;✘&lt;/td&gt;
&lt;td&gt;Pre-request scripts, tests, and dynamic tags.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Meta data&lt;/td&gt;
&lt;td&gt;✘&lt;/td&gt;
&lt;td&gt;Schemas, documentation, field descriptions, and response examples.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom settings&lt;/td&gt;
&lt;td&gt;✘&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cookies&lt;/td&gt;
&lt;td&gt;✘&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  🪄 Easier GraphQL APIs testing with schema support
&lt;/h2&gt;

&lt;p&gt;When talking to &lt;a href="https://httpie.io/blog/changelog-0018#support-for-graphql-apis" rel="noopener noreferrer"&gt;GraphQL APIs&lt;/a&gt;, HTTPie will automatically fetch the schema from the server. That means the app is now aware of all the available queries, mutations, and the hierarchy of types, which allows us to boost your productivity with auto-complete and validation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F8c66wv79tqspkzibq71a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F8c66wv79tqspkzibq71a.png" alt="GraphQL auto-complete and validation in action" width="800" height="586"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See auto-complete suggestions as you type, and to invoke the menu manually, press ⌃Space.&lt;/p&gt;

&lt;p&gt;HTTPie auto-fetches the schema using the current request’s URL and authentication. To refresh the schema, select “Update from server” from the new “Schema” menu. And to disable schema for a particular tab, uncheck “Auto-apply schema.”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fve7un6tr9idnrztdts36.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fve7un6tr9idnrztdts36.png" alt="GraphQL schema loading menu" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In addition to schema support, the GraphQL client now comes with code folding and other quality-of-life improvements.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✨ Other improvements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Improved cURL import with support for &lt;a href="https://www.gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html" rel="noopener noreferrer"&gt;ANSI-C quoting shell syntax&lt;/a&gt; (e.g., &lt;code&gt;$'string'&lt;/code&gt;). This syntax is used by Chrome DevTools when exporting a request that includes a body as cURL, among others.&lt;/li&gt;
&lt;li&gt;HTTPie for Desktop now remembers the window's position. This way, you don't have to move it every time you launch it.&lt;/li&gt;
&lt;li&gt;On HTTPie for Windows, the title bar color now respects the system.&lt;/li&gt;
&lt;li&gt;The request definition tables no longer jump when switching tabs.&lt;/li&gt;
&lt;li&gt;We’ve added error boundaries to tabs and other components for more robust exception handling and recovery.&lt;/li&gt;
&lt;li&gt;The text search had some issues with very long lines. Now it’s fixed.&lt;/li&gt;
&lt;li&gt;Spelling and autocorrect in the filter field is now disabled.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🤩 Happy API testing, and see you again soon!
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✉️ Thoughts? Questions? Shoot us an email at &lt;a href="mailto:feedback@httpie.io"&gt;feedback@httpie.io&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;📋 You can also help us improve by completing a &lt;a href="https://httpie.io/survey" rel="noopener noreferrer"&gt;quick survey&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;👥 We’re working on collaboration features, and you can &lt;a href="https://httpie.io/blog/changelog-0019#help-wanted-teams-and-collaboration" rel="noopener noreferrer"&gt;help us out&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;👉 Follow &lt;a href="https://twitter.com/httpie" rel="noopener noreferrer"&gt;@httpie&lt;/a&gt; and join our &lt;a href="https://httpie.io/discord" rel="noopener noreferrer"&gt;Discord community&lt;/a&gt; to stay up to date.&lt;/li&gt;
&lt;li&gt;👩‍💻 We’re looking for new colleagues in &lt;a href="https://httpie.io/jobs" rel="noopener noreferrer"&gt;engineering and other roles&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Originally published on &lt;a href="https://httpie.io/blog/changelog-0021" rel="noopener noreferrer"&gt;HTTPie blog&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>httpie</category>
      <category>graphql</category>
      <category>postman</category>
      <category>insomnia</category>
    </item>
    <item>
      <title>Changelog #0017 — ☁️ Sync, variables, incognito, more features, and public beta!</title>
      <dc:creator>Jakub Roztocil</dc:creator>
      <pubDate>Fri, 05 Aug 2022 22:06:22 +0000</pubDate>
      <link>https://dev.to/pie/changelog-0017-sync-variables-incognito-more-features-and-public-beta-4hko</link>
      <guid>https://dev.to/pie/changelog-0017-sync-variables-incognito-more-features-and-public-beta-4hko</guid>
      <description>&lt;p&gt;HTTPie is on a mission to make APIs simple and intuitive for all those building the tools of our time. And today, we’re thrilled to announce the biggest release yet and a large step in that direction. Check out what’s new 👇&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🔓 Public beta —&lt;/strong&gt; HTTPie Web &amp;amp; Desktop is now publicly available 🎉&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🕵️‍♀️ Incognito mode —&lt;/strong&gt; You can now use the app without an account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;☁️ Real-time sync —&lt;/strong&gt; Your data is now real-time synchronized across devices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;⬆️ Auto-updates —&lt;/strong&gt; A reworked, more transparent system for updates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;💲 Variables —&lt;/strong&gt; Work smarter and don’t repeat yourself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🏞️ Environments —&lt;/strong&gt; A quick way to swap between contexts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🌊 cURL import —&lt;/strong&gt; A humble but efficient start of our import system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔒 SSL verification —&lt;/strong&gt; You can now turn off certificate validation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📱 Mobile —&lt;/strong&gt; Now it’s easier than ever to work on touch devices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;✨ Other improvements —&lt;/strong&gt; Various changes to improve your experience.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🪲 Bug fixes —&lt;/strong&gt; Hopefully, we caught them before you noticed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔮 What’s next? —&lt;/strong&gt; A glimpse into the future.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔓 Public beta
&lt;/h2&gt;

&lt;p&gt;After months of development, testing, and collecting feedback in private beta, we’re opening HTTPie for Web &amp;amp; Desktop to everyone today 🚀&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fqvxd0x2qmj8gtijoljt9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fqvxd0x2qmj8gtijoljt9.png" alt="Public beta — you can use HTTPie for Web &amp;amp; Desktop today" width="800" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can &lt;a href="https://httpie.io/app" rel="noopener noreferrer"&gt;go to the Web app&lt;/a&gt; or &lt;a href="https://httpie.io/download" rel="noopener noreferrer"&gt;download the Desktop app&lt;/a&gt; and start using it right away.&lt;/p&gt;

&lt;h3&gt;
  
  
  💌 Thanks to our community and private beta users
&lt;/h3&gt;

&lt;p&gt;Since the launch of the Terminal app ten years ago, an enthusiastic community has been forming around HTTPie. When we announced HTTPie for Web &amp;amp; Desktop, the interest exceeded our expectations, and our waitlist started to fill up. We opened up a private beta program and invited thousands of beta users to whom we couldn’t be more grateful.&lt;/p&gt;

&lt;p&gt;We were submerged in hundreds of thoughtfully answered surveys, messages in our growing &lt;a href="https://httpie.io/discord" rel="noopener noreferrer"&gt;Discord community&lt;/a&gt;, emails, GitHub issues, and Twitter DMs, and we appreciated every single one!&lt;/p&gt;

&lt;p&gt;All that feedback has translated into improvements and features, like the ones included in this release and many more on our roadmap.&lt;/p&gt;

&lt;p&gt;In return, HTTPie swag has found its way all around the world 💫&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F4g5wtdqpclb8abse21vp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F4g5wtdqpclb8abse21vp.png" alt="swag" width="800" height="661"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🕵️‍♀️ Incognito mode
&lt;/h2&gt;

&lt;p&gt;Now that the private beta fence no longer exists, the account-required wall can be torn down too. And that’s exactly what we’ve done.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F1yidazagwpg8736hwl9d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F1yidazagwpg8736hwl9d.png" alt="Incognito mode — you can use HTTPie for Web &amp;amp; Desktop without an account" width="800" height="566"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can now use the app without an account. When you are not logged in—when you’re &lt;em&gt;incognito&lt;/em&gt;—you still have access to all features apart from sync and creating new spaces. When you decide to log in or sign up, we sync your incognito space into your account, and you can continue to work uninterrupted. Easy!&lt;/p&gt;

&lt;h2&gt;
  
  
  ☁️ Real-time sync
&lt;/h2&gt;

&lt;p&gt;Sync is finally here. As long as you are not incognito, your data is backed up to our secure cloud and synchronized across your devices. When you change something, it’s instantly updated on your other clients.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fk36cr7i9tf4bj2rlhk61.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fk36cr7i9tf4bj2rlhk61.png" alt="Real-time sync — HTTPie for Web&amp;amp;Desktop now has real-time sync" width="800" height="566"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Start working in the Web app, switch to the Desktop app, and check some request details on your phone later. And you don’t have to worry about hitting save because we continuously auto-save your work.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fb0j8m04siq7p9nhtvcrz.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fb0j8m04siq7p9nhtvcrz.gif" alt="Real-time sync — HTTPie for Web&amp;amp;Desktop now has real-time sync" width="745" height="470"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You might be wondering the most important question of all, can I still test my local API on a plane trip if I need to? Sure thing! HTTPie works offline-first. When your computer is offline (or our cloud is temporarily down), you can continue to work as usual. We’ll simply resume syncing once the connection has been restored. To see the current sync status, check out your account menu:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fxrgze2wbpjsp9zd39wmd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fxrgze2wbpjsp9zd39wmd.png" alt="Real-time sync status is shown in the account menu" width="800" height="566"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Data security
&lt;/h3&gt;

&lt;p&gt;All synced data is encrypted at transit between the HTTPie cloud and clients (SSL) and at rest in a backed-up AWS RDS storage with redundancy (AES). All sensitive data—your requests, auth credentials, variables, etc.—are additionally encrypted at the server-side before storage and decrypted on client access (AES).&lt;/p&gt;

&lt;h2&gt;
  
  
  ⬆️ Auto-updates
&lt;/h2&gt;

&lt;p&gt;You can now check for updates and see the app update status straight in the account menu. This makes it easy for you to have the greatest and latest version of HTTPie always installed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F8s2oosr64yk1rmt0dnoq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F8s2oosr64yk1rmt0dnoq.png" alt="Auto-update functionality integrated into the profile menu" width="800" height="566"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We continuously improve the app and release frequent updates with new features and bug fixes. The desktop app downloads new versions automatically, even though you don’t have to install them right away.&lt;/p&gt;

&lt;p&gt;The auto-update system is integrated with sync, and the update status in the menu will tell you when an update is required to maintain compatibility with the HTTPie cloud.&lt;/p&gt;

&lt;h2&gt;
  
  
  💲Variables
&lt;/h2&gt;

&lt;p&gt;Variables were among the most requested features by our private beta users. And we agree. When it comes to building requests in a clean, don’t-repeat-yourself way, variables are a game-changer. So here they are!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fcld3hjbblt9i8k5320jq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fcld3hjbblt9i8k5320jq.png" alt="Variables feature in HTTPie" width="800" height="665"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Define variables inside the current space’s detail tab. Then you can reference them from any request or collection within the space via &lt;code&gt;{{NAME}}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It’s often helpful to review the full HTTP request with variables already substituted before sending it. To do that, keep the Preview panel open.&lt;/p&gt;

&lt;p&gt;If you reference a variable that doesn’t exist, we mark the reference red and prevent the request from being sent until the variable is declared. This way, you never have to deal with confusing results.&lt;/p&gt;

&lt;h3&gt;
  
  
  🤫 Secret variables
&lt;/h3&gt;

&lt;p&gt;Mark a variable as secret, and we’ll mask its values in the variable list so that you don’t accidentally share them on a Zoom call, for example.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fu63zr9umbvdum9v82c11.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fu63zr9umbvdum9v82c11.png" alt="Secret variables in HTTPie" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See local-only environments below for other advanced ways to deal with sensitive variables.&lt;/p&gt;

&lt;h2&gt;
  
  
  🏞️ Environments
&lt;/h2&gt;

&lt;p&gt;Environments allow you to quickly swap between different contexts. A common practice is to have an API running in different environments—on your local machine, in staging, in production, etc.&lt;/p&gt;

&lt;p&gt;Imagine you need to talk to the same API in production but also in a staging environment. The requests are the same, but the root URL and auth, for example, differ. You can turn those values into variables, so it’s easier to change them. And with environments, you can instantly toggle between different values for those variables:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fun8wezcl1uwhrntgoeo7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fun8wezcl1uwhrntgoeo7.png" alt="Environments feature in HTTPie" width="800" height="586"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can create as many environments as you like and switch between them using the menu at the top right of the app.&lt;/p&gt;

&lt;p&gt;An environment is a named set of variable values. In the table, rows represent variables, columns represent environments, and inner cells are specific values for a variable in a specific environment. So once you declare a variable, it exists in every environment in the space (possibly with differing or empty values).&lt;/p&gt;

&lt;p&gt;Every space starts with an empty environment called “Defaults.” It works as a regular environment, and for simple use-cases, you can just use it exclusively.&lt;/p&gt;

&lt;p&gt;When you create additional environments, they use values from Defaults for variables where you don’t explicitly specify a custom value. If you don’t need a default value for a variable, you can simply leave its value in Defaults empty.&lt;/p&gt;

&lt;h3&gt;
  
  
  📍Local-only environments
&lt;/h3&gt;

&lt;p&gt;If you want to prevent some data from syncing to the HTTPie cloud and across your devices, you can store it as values in a local-only environment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fkyhq6yll0sblv7nxxbj8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fkyhq6yll0sblv7nxxbj8.png" alt="Local-only environments in HTTPie" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When creating an environment, select the option to create a local-only one, and its values will never leave your device.&lt;/p&gt;

&lt;h3&gt;
  
  
  🚫 No environment
&lt;/h3&gt;

&lt;p&gt;In some situations, you might want to temporarily prevent requests from accessing your variables altogether. By selecting the “No environment” option, you can achieve just that:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fwya0fui3rimjchtqmhnk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fwya0fui3rimjchtqmhnk.png" alt="You can temporarily turn off variables in HTTPie" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Currently, this option is most useful when it comes to debugging your requests. But because variables can contain sensitive data, the importance of this feature will grow as we continue to add various import and sharing mechanisms.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌊 cURL import
&lt;/h2&gt;

&lt;p&gt;We are working on a robust import mechanism, which will eventually support many advanced import sources. But already today, you can import cURL commands as requests into your HTTPie library:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fodynodz4dhisk1vs6rx0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fodynodz4dhisk1vs6rx0.png" alt="HTTPie now supports cURL command import" width="800" height="717"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This allows you to quickly import cURL calls from scripts or import requests from Chrome DevTools. Find the “Import…” option under the &lt;code&gt;+&lt;/code&gt; menu in your space library.&lt;/p&gt;

&lt;h3&gt;
  
  
  🪄 cURL import shortcut
&lt;/h3&gt;

&lt;p&gt;There’s also a quick hidden shortcut for importing cURL. Can you guess where?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Ffsf209vvl3zb63kj2k7o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Ffsf209vvl3zb63kj2k7o.png" alt="Import cURL command into HTTPie simply by pasting it into the URL bar" width="800" height="515"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just paste a cURL command into the URL field and see what happens 👀&lt;/p&gt;

&lt;h2&gt;
  
  
  🔒 SSL verification
&lt;/h2&gt;

&lt;p&gt;This is a smaller feature, but many of our private beta users have been waiting for it, and we’re happy to finally ship it. By default, we verify the server SSL certificate and reject self-signed, expired, and non-matching certificates. Now you can disable this validation in the settings:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fs4qfw843cdnqv2ur51ai.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fs4qfw843cdnqv2ur51ai.png" alt="Turn off SSL verification in settings" width="800" height="754"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you run into an SSL error and wish to temporarily allow invalid certificates, you can do that straight from the response view:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fr625qrg4xqtowusa79zt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fr625qrg4xqtowusa79zt.png" alt="Turn off SSL verification in settings" width="800" height="645"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Turn it on again from the settings when you’re finished.&lt;/p&gt;

&lt;h2&gt;
  
  
  📱 Mobile
&lt;/h2&gt;

&lt;p&gt;We’ve also focused on streamlining our mobile experience. The app is 100% responsive (both Web and Desktop), and you can use all features on touch devices as well.&lt;/p&gt;

&lt;p&gt;Mobile-friendliness is one of those features that you don’t need most of the time. But when you need it, you &lt;em&gt;really&lt;/em&gt; need it. And with HTTPie, you can get work done comfortably from anywhere, anytime.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Foij55clma5bcut9y0lcx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Foij55clma5bcut9y0lcx.png" alt="HTTPie for Mobile" width="800" height="686"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The mobile experience of the URL bar component is much improved.&lt;/li&gt;
&lt;li&gt;You can now use the Preview &amp;amp; Export feature on small screens.&lt;/li&gt;
&lt;li&gt;Keyboards are now contextual.&lt;/li&gt;
&lt;li&gt;Spacing is more compact and comfortable on small devices.&lt;/li&gt;
&lt;li&gt;You can now access tooltips on touch devices.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ✨ Other improvements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The body type and auth type selectors now have icons. As they say, an icon is worth a thousand labels.&lt;/li&gt;
&lt;li&gt;Error badges are now more minimal, less clunky, and more on brand.&lt;/li&gt;
&lt;li&gt;It’s been a while since we expanded the icon set for spaces and collections. Now you have eight crisp new icons to choose from. Check them out!&lt;/li&gt;
&lt;li&gt;The light mode previously received less love than the dark one. So we improved it. What do you think? Can you spot all the differences?&lt;/li&gt;
&lt;li&gt;Placeholders now look more like placeholders.&lt;/li&gt;
&lt;li&gt;Now you see a loading indicator when the app is launching.&lt;/li&gt;
&lt;li&gt;The monospaced font now supports non-Latin characters.&lt;/li&gt;
&lt;li&gt;Text selection is now disabled for all UI elements while keeping content selectable.&lt;/li&gt;
&lt;li&gt;In the desktop app, you can maximize and un-maximize the window by double-clicking the title bar.&lt;/li&gt;
&lt;li&gt;You can also drag the window using the left toolbar, where your profile image resides.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🪲 Bug fixes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;When you renamed a draft, it would change its auth to inherited, as if it was added to a collection. Fixed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔮 What’s next?
&lt;/h2&gt;

&lt;p&gt;This release marks an important milestone on our journey to provide the best experience to anyone working with APIs.&lt;/p&gt;

&lt;p&gt;With HTTPie, you can work on APIs with or without an account. While you are online or offline. In a dedicated cross-platform desktop app, in the browser, in the terminal, and even on your phone. Your data is auto-saved and synchronized across devices. You can organize your work in spaces and collections, parametrize requests with variables and environments, work on many things simultaneously with our tabbed system, and preview requests before sending them. These and many other features are available today, wrapped in what we aim to be a delightful, human-centered interface.&lt;/p&gt;

&lt;p&gt;There’s still a lot of work to fully unlock the potential of APIs, and our roadmap is packed with ambitious milestones. Here’s a sample of the themes we’re focusing on next:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;👥 Team collaboration&lt;/li&gt;
&lt;li&gt;⚙️ Additional protocols and formats&lt;/li&gt;
&lt;li&gt;⚡ Automation and testing&lt;/li&gt;
&lt;li&gt;🔗 Full interoperability with HTTPie for Terminal&lt;/li&gt;
&lt;li&gt;🎹 Become a keyboard-first app&lt;/li&gt;
&lt;li&gt;🎉 Refreshed website&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Happy API testing, and see you again soon!
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📋 You can help us improve by completing a &lt;a href="https://httpie.io/survey" rel="noopener noreferrer"&gt;quick survey&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;💲 If you use environments, we have a &lt;a href="https://us16.list-manage.com/survey?u=99f5ce2d00a123af1593451c6&amp;amp;id=56bb113926&amp;amp;attribution=false" rel="noopener noreferrer"&gt;variables-specific survey&lt;/a&gt; as well.&lt;/li&gt;
&lt;li&gt;👉 Follow &lt;a href="https://twitter.com/httpie" rel="noopener noreferrer"&gt;@httpie&lt;/a&gt; and join our &lt;a href="https://httpie.io/discord" rel="noopener noreferrer"&gt;Discord community&lt;/a&gt; to stay up to date.&lt;/li&gt;
&lt;li&gt;👩‍💻 We’re looking for new colleagues in &lt;a href="https://httpie.io/jobs" rel="noopener noreferrer"&gt;engineering and design roles&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Originally published on &lt;a href="https://httpie.io/blog/changelog-0017" rel="noopener noreferrer"&gt;HTTPie blog&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>httpie</category>
      <category>devtool</category>
      <category>api</category>
    </item>
    <item>
      <title>What’s new in HTTPie for Terminal 3.2</title>
      <dc:creator>Jakub Roztocil</dc:creator>
      <pubDate>Tue, 17 May 2022 13:50:47 +0000</pubDate>
      <link>https://dev.to/pie/whats-new-in-httpie-for-terminal-32-3k84</link>
      <guid>https://dev.to/pie/whats-new-in-httpie-for-terminal-32-3k84</guid>
      <description>&lt;p&gt;HTTPie has always been about making interaction with APIs as human-friendly as possible. Part of that is ensuring our apps are ubiquitous and up-to-date. This release of HTTPie for Terminal brings many improvements in all these areas.&lt;/p&gt;

&lt;p&gt;Check out what’s new 👇&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;🤩 Refined UI —&lt;/strong&gt; Improved user experience and usability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📖 Man pages —&lt;/strong&gt; HTTPie is finally getting complete manuals available through &lt;code&gt;man httpie&lt;/code&gt;, &lt;code&gt;man http&lt;/code&gt;, and &lt;code&gt;man https&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📦 Single binary executables —&lt;/strong&gt; download HTTPie as a single binary file and run it without installation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🌀 Debian releases —&lt;/strong&gt; most recent releases will now be offered also through our custom Apt repo with new releases instantly available for Debian, Ubuntu, etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⬆️ Update warnings —&lt;/strong&gt; get notified about new versions as soon as they become available for your system straight in the terminal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚖️ Improved persistence for headers —&lt;/strong&gt; multiple headers with the same name are persisted in the sessions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🪲 Bug fixes —&lt;/strong&gt; multiple headers with the same name are persisted in the sessions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;♥️ Community contributions —&lt;/strong&gt; lots of amazing people who have contributed to this release.&lt;/p&gt;

&lt;h2&gt;
  
  
  🤩 Refined UI
&lt;/h2&gt;

&lt;p&gt;This release brings various UI and UX improvements. For example, here is HTTPie’s new progress bar:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fwbwksh82b4njhbcdts9c.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fwbwksh82b4njhbcdts9c.gif" alt="New Style Progress Bars" width="991" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Even though our original progress bar implementation was &lt;a href="https://codecatalog.org/articles/httpie-status-reporting/" rel="noopener noreferrer"&gt;simple and elegant&lt;/a&gt;, we’ve decided to adopt the powerful &lt;a href="https://github.com/Textualize/rich" rel="noopener noreferrer"&gt;Rich&lt;/a&gt; library for various parts of the UI.&lt;/p&gt;

&lt;p&gt;By the way, the example above uses the recently-added &lt;code&gt;--style=pie-dark&lt;/code&gt; style. We highly recommend making it your default style for the best experience and consistency with &lt;a href="https://httpie.io/product" rel="noopener noreferrer"&gt;HTTPie for Web &amp;amp; Desktop&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;📖 &lt;a href="https://httpie.io/docs/cli/colors-and-formatting" rel="noopener noreferrer"&gt;Colors &amp;amp; formatting docs →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📖 Man Pages
&lt;/h2&gt;

&lt;p&gt;The long-awaited man pages are here now. You can use &lt;code&gt;man http&lt;/code&gt; or &lt;code&gt;man https&lt;/code&gt; to have the full man page experience with colors and pager:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ man http
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We have also introduced a shorthand for this operation, &lt;code&gt;http --manual&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ http --manual
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the man pages are available (installed by your platform’s packager), it will automatically open you the HTTPie’s manual. When they are not, this command will open the regular manual but inside of a pager.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;httpie&lt;/code&gt; management command now has a man page as well:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ man httpie
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📖 &lt;a href="https://httpie.io/docs/cli/usage" rel="noopener noreferrer"&gt;Help &amp;amp; manual docs →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📦 Single binary executables
&lt;/h2&gt;

&lt;p&gt;For Linux systems, we now offer single binary executables which you can download and start using without installation. The new asset named &lt;code&gt;http&lt;/code&gt; now included in every &lt;a href="https://github.com/httpie/httpie/releases/latest" rel="noopener noreferrer"&gt;release of HTTPie on GitHub&lt;/a&gt; is all you need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ https -do http_standalone github.com/httpie/httpie/releases/download/3.2.1/http
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ chmod +x ./http_standalone
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ ./http_standalone --version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📖 &lt;a href="https://httpie.io/docs/cli/single-binary-executables" rel="noopener noreferrer"&gt;Single binary installation docs →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🌀 Debian releases
&lt;/h2&gt;

&lt;p&gt;We now host our own Debian Apt repository to provide instant updates with new features to users of Debian, Ubuntu, and other derived distros:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-SsL&lt;/span&gt; https://packages.httpie.io/deb/KEY.gpg | apt-key add -
&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-SsL&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /etc/apt/sources.list.d/httpie.list https://packages.httpie.io/deb/httpie.list
&lt;span class="nv"&gt;$ &lt;/span&gt;apt update
&lt;span class="nv"&gt;$ &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;httpie
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📖 &lt;a href="https://httpie.io/docs/cli/debian-and-ubuntu" rel="noopener noreferrer"&gt;Debian &amp;amp; Ubuntu installation docs →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ⬆️ Update warnings
&lt;/h2&gt;

&lt;p&gt;HTTPie for Terminal is now part of a broader platform, and we iterate quickly and deliver new features frequently. To keep existing users up-to-date, this version adds a gentle new warning:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;http pie.dev/get
http: info: A new HTTPie release &lt;span class="o"&gt;(&lt;/span&gt;3.3.0&lt;span class="o"&gt;)&lt;/span&gt; is available.
To see how you can update, please visit https://httpie.io/docs/cli/pypi

HTTP/1.1 200 OK
Content-Encoding: &lt;span class="nb"&gt;gzip
&lt;/span&gt;Content-Type: application/json

&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"args"&lt;/span&gt;: &lt;span class="o"&gt;{}&lt;/span&gt;,
    &lt;span class="s2"&gt;"headers"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"Accept"&lt;/span&gt;: &lt;span class="s2"&gt;"*/*"&lt;/span&gt;,
        &lt;span class="s2"&gt;"Accept-Encoding"&lt;/span&gt;: &lt;span class="s2"&gt;"gzip"&lt;/span&gt;,
        &lt;span class="s2"&gt;"Cdn-Loop"&lt;/span&gt;: &lt;span class="s2"&gt;"cloudflare"&lt;/span&gt;,
    &lt;span class="o"&gt;}&lt;/span&gt;,
    &lt;span class="s2"&gt;"url"&lt;/span&gt;: &lt;span class="s2"&gt;"http://pie.dev/get"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also check the latest release by manually running &lt;code&gt;check-updates&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ httpie cli check-updates
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📖 &lt;a href="https://httpie.io/docs/cli/update-warnings" rel="noopener noreferrer"&gt;Update warning docs →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚖️ Improved persistence for headers
&lt;/h2&gt;

&lt;p&gt;Multiple headers with the same name are now correctly persisted inside sessions. E.g.:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ http --session test pie.dev/headers X-Foo:bar X-Foo:baz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ http --session test pie.dev/headers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For upgrading your old sessions, you can use &lt;code&gt;httpie cli sessions upgrade&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ httpie cli sessions upgrade pie.dev test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To upgrade all named sessions in one go, you can try &lt;code&gt;httpie cli sessions upgrade-all&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ httpie cli sessions upgrade-all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📖 &lt;a href="https://httpie.io/docs/cli/upgrading-sessions" rel="noopener noreferrer"&gt;Session upgrade docs →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ✨ Other improvements
&lt;/h2&gt;

&lt;p&gt;Moved &lt;code&gt;httpie plugins *&lt;/code&gt; command to the new &lt;code&gt;httpie cli plugins&lt;/code&gt; namespace. This provides a more scalable namespacing of the management subcommands. The original &lt;code&gt;httpie plugins *&lt;/code&gt; commands are now hidden aliases.&lt;/p&gt;

&lt;h2&gt;
  
  
  🪲 Bug fixes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Removed the redundant addition of &lt;code&gt;Content-Length: 0&lt;/code&gt; header to body-less &lt;code&gt;OPTIONS&lt;/code&gt; requests.&lt;/li&gt;
&lt;li&gt;The thread observing standard input to provide a warning when no data arrives is now properly terminated when HTTPie itself exists.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🐙 &lt;a href="https://github.com/httpie/httpie/blob/master/CHANGELOG.md#320-2022-05-05" rel="noopener noreferrer"&gt;Full changelog →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ♥️ Community contributions
&lt;/h2&gt;

&lt;p&gt;Last but not least, we’d like to thank the amazing people who’ve contributed to this release of HTTPie: &lt;a href="https://github.com/ethanmills" rel="noopener noreferrer"&gt;Ethan Mills&lt;/a&gt;, &lt;a href="https://github.com/blyxxyz" rel="noopener noreferrer"&gt;Jan Verbeek&lt;/a&gt;, &lt;a href="https://github.com/ducaale" rel="noopener noreferrer"&gt;Mohamed Daahir&lt;/a&gt;, &lt;a href="https://github.com/ansman" rel="noopener noreferrer"&gt;Nicklas Ansman Giertz&lt;/a&gt;,  &lt;a href="https://github.com/Oliver-Fish" rel="noopener noreferrer"&gt;Oliver Fish&lt;/a&gt;, &lt;a href="https://github.com/robertolopezlopez" rel="noopener noreferrer"&gt;Roberto López López&lt;/a&gt;, &lt;a href="https://github.com/luzpaz" rel="noopener noreferrer"&gt;luzpaz&lt;/a&gt;, and &lt;a href="https://github.com/zhaohanqing95" rel="noopener noreferrer"&gt;zhaohanqing95&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;🐙 &lt;a href="https://github.com/httpie/httpie/blob/master/CONTRIBUTING.md" rel="noopener noreferrer"&gt;How to contribute →&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How we lost 54k GitHub stars</title>
      <dc:creator>Jakub Roztocil</dc:creator>
      <pubDate>Fri, 15 Apr 2022 15:43:49 +0000</pubDate>
      <link>https://dev.to/pie/how-we-lost-54k-github-stars-28aj</link>
      <guid>https://dev.to/pie/how-we-lost-54k-github-stars-28aj</guid>
      <description>&lt;h2&gt;
  
  
  Gaining 54k GitHub stars
&lt;/h2&gt;

&lt;p&gt;HTTPie for Terminal is celebrating &lt;a href="https://github.com/httpie/httpie/commit/b966efa17" rel="noopener noreferrer"&gt;10 years since the first commit&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you’re unfamiliar with the project, it’s an open-source CLI HTTP client. What makes HTTPie different is that we build it from the ground up to make API interaction from the terminal as human-friendly as possible.&lt;/p&gt;

&lt;p&gt;Starting with the first public release, published on the 25th of February 2012 from a rainy Copenhagen, we’ve hosted the project on GitHub.&lt;/p&gt;

&lt;p&gt;I’ve been a GitHub fan ever since I became a member a couple of years earlier (the type that wears Octocat-decorated t-shirts, no less). It was back in the day when GitHub’s &lt;a href="https://web.archive.org/web/20120202143615/https://github.com/about" rel="noopener noreferrer"&gt;about page&lt;/a&gt; proudly proclaimed they took $0.00 in VC funding and informed you about the number of delicious beers on tap in their  SF office.&lt;/p&gt;

&lt;p&gt;So GitHub was an obvious choice when I realized that the result of scratching my own API testing itch might be of interest to the wider developer community. And of interest it was.&lt;/p&gt;

&lt;p&gt;I remember the rush of HTTPie becoming the top link on Hacker News for the first time and seeing the GitHub community build up. Over the years as we continued to improve the project it kept attracting widespread adoption. It became the most popular API tool on the platform, and the GitHub community grew to 54k stargazers and 1k+ watchers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhttpie.io%2F_next%2Fimage%3Furl%3D%252FBlog%252Fstardust%252Fstars-SU4GFB7G.png%26w%3D3840%26q%3D95" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhttpie.io%2F_next%2Fimage%3Furl%3D%252FBlog%252Fstardust%252Fstars-SU4GFB7G.png%26w%3D3840%26q%3D95" alt="stars" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are &lt;a href="https://github.com/search" rel="noopener noreferrer"&gt;289M public repos&lt;/a&gt; so HTTPie was among the top 80 most popular public repos on GitHub overall; in the 99.99997203 percentile. In short, It was incredible to see this humble tool attract a community of that magnitude. And GitHub played an important role in that.&lt;/p&gt;

&lt;p&gt;In the same way that we benefited from GitHub’s “social coding” features, GitHub benefited from our hosting this popular project on their platform. Over the past decade, possibly millions of developers visited our GitHub page. That’s helped reinforce GitHub (Microsoft) as a company that cares about open source and community. It was a symbiotic relationship.&lt;/p&gt;

&lt;h2&gt;
  
  
  Losing 54k GitHub stars
&lt;/h2&gt;

&lt;p&gt;However, if you are one of our 55k stargazers and watchers, as of a few weeks ago you no longer are 💔&lt;/p&gt;

&lt;h3&gt;
  
  
  What happened?
&lt;/h3&gt;

&lt;p&gt;Due to an unfortunate sequence of events, I accidentally made the project’s repository private for a moment. And GitHub cascade-deleted our community that took 10 years to build.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhttpie.io%2F_next%2Fimage%3Furl%3D%252FBlog%252Fstardust%252Fstars2-547OUVWE.png%26w%3D2048%26q%3D95" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhttpie.io%2F_next%2Fimage%3Furl%3D%252FBlog%252Fstardust%252Fstars2-547OUVWE.png%26w%3D2048%26q%3D95" alt="stars2" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What does it mean?
&lt;/h3&gt;

&lt;p&gt;If you’re a downstream maintainer or anyone previously watching &lt;a href="https://github.com/httpie/httpie" rel="noopener noreferrer"&gt;httpie/httpie&lt;/a&gt; for notifications, for example, you’ll need to re-watch the repo. Incidentally, we’ve recently published &lt;a href="https://httpie.io/blog/httpie-3.1.0" rel="noopener noreferrer"&gt;a security release&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The same goes for stars. If you’re one of those 54K people who’ve starred the repo any time in the past decade, the repo is no longer among your starred projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why did you make the repo private‽
&lt;/h3&gt;

&lt;p&gt;It’s a peculiarity of GitHub, to put it mildly, that making a repo private permanently deletes all watchers and stars. I was even aware of this, and I obviously had no intention to make &lt;code&gt;httpie/httpie&lt;/code&gt; private. So, why then?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhttpie.io%2F_next%2Fimage%3Furl%3D%252FBlog%252Fstardust%252Fvisibility-LF722YS3.png%26w%3D2048%26q%3D95" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhttpie.io%2F_next%2Fimage%3Furl%3D%252FBlog%252Fstardust%252Fvisibility-LF722YS3.png%26w%3D2048%26q%3D95" alt="visibility" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The proximate cause was that I thought I was inside a different repo; one with no content and zero stars. What I actually intended to do was to hide the &lt;a href="https://github.com/httpie" rel="noopener noreferrer"&gt;HTTPie organization’s&lt;/a&gt; profile README, which I had created the week before but had no opportunity to populate.&lt;/p&gt;

&lt;p&gt;What put me on the wrong path was an otherwise completely unrelated action: I had just done the same (i.e., hidden an empty README) on my personal profile by making &lt;code&gt;jakubroztocil/jakubroztocil&lt;/code&gt; private.&lt;/p&gt;

&lt;p&gt;GitHub’s conceptual model treats users and organizations as very similar entities when it comes to profiles and repos. In this context, and since I just wanted to repeat the same benign action on our organization’s profile, my brain switched to auto-pilot mode.&lt;/p&gt;

&lt;p&gt;I didn’t realize at the moment there’s an inconsistency in the naming of this special repo containing profile READMEs and that it differs for users and organizations: &lt;code&gt;name/name&lt;/code&gt; vs.  &lt;code&gt;name/.github&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That’s why I proceeded to make &lt;code&gt;httpie/httpie&lt;/code&gt; private instead of &lt;code&gt;httpie/.github&lt;/code&gt; without realizing my mistake.&lt;/p&gt;

&lt;h3&gt;
  
  
  But there’s a confirmation, right‽
&lt;/h3&gt;

&lt;p&gt;There’s a confirmation box. It’s designed to stop users in a situation like mine from doing something stupid. It tells you that &lt;em&gt;“You will permanently lose all stars and watchers of this repository.”&lt;/em&gt; That’s pretty scary.&lt;/p&gt;

&lt;p&gt;The problem is that the box looks exactly the same for repos with no commits and stars and for repos with a decade-long history and 55k stargazers and watchers. And it says &lt;em&gt;“Warning: this is a &lt;strong&gt;potentially destructive&lt;/strong&gt; action.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To paraphrase, the box tells you &lt;em&gt;“You’re about to demolish a house. &lt;strong&gt;If&lt;/strong&gt; there are any people inside, they will all die”&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;But it doesn’t include anything specific to break you out of your auto-pilot mode if you’ve confused the address and think you’re looking at an empty house.&lt;/p&gt;

&lt;p&gt;A 54k-star question: Which one of these two dialogs is safe to confirm and which one deletes a 10-year-old community?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhttpie.io%2F_next%2Fimage%3Furl%3D%252FBlog%252Fstardust%252Fconfirm-B3X7QRNG.jpg%26w%3D2048%26q%3D95" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhttpie.io%2F_next%2Fimage%3Furl%3D%252FBlog%252Fstardust%252Fconfirm-B3X7QRNG.jpg%26w%3D2048%26q%3D95" alt="confirm" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The dialog should be more contextual and, paraphrasing again, it should say &lt;em&gt;“You’re about to kill 55,000 people.”&lt;/em&gt; That would’ve certainly made me pause.&lt;/p&gt;

&lt;h3&gt;
  
  
  So you made it private, just flip the switch!
&lt;/h3&gt;

&lt;p&gt;You can imagine my confusion when I went back to the organization page and not only could I still see the empty README but our most popular repo was nowhere to be found. After a moment I realized what happened. So I went back to the repo’s settings to flip the switch. But GitHub didn’t allow me to do that—for an entire half an hour.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhttpie.io%2F_next%2Fimage%3Furl%3D%252FBlog%252Fstardust%252Fdelete-RNZFEG64.jpg%26w%3D2048%26q%3D95" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhttpie.io%2F_next%2Fimage%3Furl%3D%252FBlog%252Fstardust%252Fdelete-RNZFEG64.jpg%26w%3D2048%26q%3D95" alt="delete" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’re wondering why so long, it’s because 🥁 that’s how long it took GitHub to cascade-delete our decade of stargazers and watchers. And there was no way to stop the process. All I could do was start writing to GitHub support, refresh the page and wait for the number of stars to reach zero before I could make it public again.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why doesn’t GitHub restore it‽
&lt;/h3&gt;

&lt;p&gt;GitHub obviously has backups. And it is indeed possible to undo the damage done by accidentally making a repo private. The GitHub team themselves accidentally made the &lt;a href="https://github.com/desktop/desktop" rel="noopener noreferrer"&gt;GitHub Desktop app repo&lt;/a&gt; private once. And they restored everything for themselves within hours. Here’s the former GitHub CEO &lt;a href="https://twitter.com/natfriedman/status/1328410589291446274" rel="noopener noreferrer"&gt;explaining the situation&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhttpie.io%2F_next%2Fimage%3Furl%3D%252FBlog%252Fstardust%252Ftweet-WPCZB2KO.png%26w%3D2048%26q%3D95" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhttpie.io%2F_next%2Fimage%3Furl%3D%252FBlog%252Fstardust%252Ftweet-WPCZB2KO.png%26w%3D2048%26q%3D95" alt="tweet" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In our case, however, they refuse to do that, citing undesirable side effects and the cost of resources. We even offered GitHub financial compensation for any resources required. But, sadly, they declined. They have other priorities than resurrecting the community of one of the oldest and most popular community projects on their platform.&lt;/p&gt;

&lt;p&gt;So the answer to the question is, unfortunately, the following: GitHub will restore a repo damaged by making it private. But only if it’s one of their own projects, not a community one. The latter gets a &lt;a href="https://twitter.com/github/status/1493329046708670475" rel="noopener noreferrer"&gt;tweet&lt;/a&gt;, at best.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons learned
&lt;/h2&gt;

&lt;p&gt;One should never let a good crisis go to waste. Our options are limited, but there are at least a few lessons learned that might be valuable to share.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lesson #1: UI/UX design
&lt;/h3&gt;

&lt;p&gt;Show, don’t tell. Design confirmation dialogs in a don’t-make-me-think fashion. When the user is about to destroy something, don’t describe that as a potential scenario in abstract words that the user needs to convert to mental images and put values on. Especially when cascade-deleting as a side effect of the primary action. For example, here’s how we approach that in &lt;a href="https://httpie.io/product" rel="noopener noreferrer"&gt;HTTPie for Desktop&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhttpie.io%2F_next%2Fimage%3Furl%3D%252FBlog%252Fstardust%252Fdelete2-C3DJBD5P.png%26w%3D2048%26q%3D95" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhttpie.io%2F_next%2Fimage%3Furl%3D%252FBlog%252Fstardust%252Fdelete2-C3DJBD5P.png%26w%3D2048%26q%3D95" alt="delete2" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And, of course, the dialog should reflect the severity of the side-effect. It should be quiet when there are no side effects at all. Otherwise, we risk desensitizing the user by wasting their limited attention capital:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhttpie.io%2F_next%2Fimage%3Furl%3D%252FBlog%252Fstardust%252Fdelete3-3O3SFNRQ.png%26w%3D2048%26q%3D95" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhttpie.io%2F_next%2Fimage%3Furl%3D%252FBlog%252Fstardust%252Fdelete3-3O3SFNRQ.png%26w%3D2048%26q%3D95" alt="delete3" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Lesson #2: Database design
&lt;/h3&gt;

&lt;p&gt;Use soft-deletes. People are human and they make mistakes. For hard-deletes, delay the process.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhttpie.io%2F_next%2Fimage%3Furl%3D%252FBlog%252Fstardust%252Fsoft-CGNTQOSG.jpg%26w%3D2048%26q%3D95" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhttpie.io%2F_next%2Fimage%3Furl%3D%252FBlog%252Fstardust%252Fsoft-CGNTQOSG.jpg%26w%3D2048%26q%3D95" alt="soft" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Lesson #3: Relationship with GitHub
&lt;/h3&gt;

&lt;p&gt;It was a human error on our side and GitHub made it clear they’re not legally obliged to help us. The tone of our decade-long mutually-beneficial relationship is set by GitHub’s Terms of Service. Thinking there was more to it was naive.&lt;/p&gt;

&lt;p&gt;After all, GitHub has a history of taking &lt;a href="https://news.ycombinator.com/item?id=24872911" rel="noopener noreferrer"&gt;controversial actions&lt;/a&gt; that go against the spirit of open source and community and then &lt;a href="https://github.blog/2020-11-16-standing-up-for-developers-youtube-dl-is-back/" rel="noopener noreferrer"&gt;reverting them&lt;/a&gt; only based on public outrage. And Microsoft (which now owns GitHub), despite its newly-found affection for open source, has not always had exactly a &lt;a href="https://www.reddit.com/r/OutOfTheLoop/comments/2v4ses/why_is_microsoft_so_widely_considered_evil/" rel="noopener noreferrer"&gt;great&lt;/a&gt; &lt;a href="https://en.wikipedia.org/wiki/Embrace,_extend,_and_extinguish" rel="noopener noreferrer"&gt;reputation&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;We continue to hope GitHub/Microsoft change their machine-like attitude and restore the project’s community one day. They still have all the data and the means to do that. We also hope they improve the UI and database design to prevent this from happening to &lt;a href="https://twitter.com/sourcegraph/status/1070201585102274561" rel="noopener noreferrer"&gt;other teams&lt;/a&gt; in the future.&lt;/p&gt;

&lt;p&gt;In the meantime, you can help us by sharing this story and &lt;a href="https://github.com/httpie/httpie" rel="noopener noreferrer"&gt;re-watching/starring the repo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As for me, I will probably take a break from wearing Octocat-decorated t-shirts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Epilogue
&lt;/h2&gt;

&lt;p&gt;Despite our GitHub stars turning into dust, HTTPie has never been doing better. What started as a side project has recently become a company and our team is growing HTTPie into an API development platform (one as delightful as you’d expect from HTTPie). The private beta of &lt;a href="https://httpie.io/product" rel="noopener noreferrer"&gt;HTTPie for Web &amp;amp; Desktop&lt;/a&gt; has been receiving great feedback, and we cannot wait to launch it to the public in the upcoming weeks.&lt;/p&gt;

&lt;p&gt;If you’d like to stay up-to-date, you can join our &lt;a href="https://httpie.io/discord" rel="noopener noreferrer"&gt;Discord community&lt;/a&gt; or follow &lt;a href="https://twitter.com/httpie" rel="noopener noreferrer"&gt;@httpie&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✏️ Update after four months
&lt;/h2&gt;

&lt;p&gt;The interest in this story blew us away. As of August ’22, the post has been read by more than a hundred thousand people and has been &lt;a href="https://twitter.com/search?q=https%3A%2F%2Fhttpie.io%2Fblog%2Fstardust&amp;amp;src=typed_query" rel="noopener noreferrer"&gt;shared&lt;/a&gt; thousands of times on Twitter and elsewhere, and was the &lt;a href="https://news.ycombinator.com/item?id=31033758" rel="noopener noreferrer"&gt;top post&lt;/a&gt; on Hacker News for days.&lt;/p&gt;

&lt;p&gt;We’ve also received a ton of empathy and public calls for support from the open source community, and we couldn’t be more grateful. As a result, HTTPie for Terminal has regained an incredible 23k stargazers within a few months.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F4wipw4ji16k2vp7748bn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F4wipw4ji16k2vp7748bn.png" alt="Regaining GitHub stars" width="800" height="545"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We never heard from GitHub. But at least they’ve quietly improved the UI of the destructive “Change repository visibility” dialog shortly after this post went out.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fbxh59qh5r5gxpfy78b8p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fbxh59qh5r5gxpfy78b8p.png" alt="Update confirmation dialog" width="800" height="580"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ✏️ Update II.
&lt;/h2&gt;

&lt;p&gt;Since the last update, a person from Microsoft who led the acquisition of GitHub has personally reached out to me on Twitter. He even claims to have found our stars!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F4brsapu9qk04yot83lue.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F4brsapu9qk04yot83lue.png" alt="Our stars have been supposedly found" width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sadly enough, however, we haven’t heard from him since. But we’re happy for T3, whose deleted repo GitHub successfully &lt;a href="https://twitter.com/t3dotgg/status/1556009443548094465" rel="noopener noreferrer"&gt;restored&lt;/a&gt; including all forks and stars.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F6h7388legvcmzcrhlpsw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F6h7388legvcmzcrhlpsw.png" alt="GitHub restored T3 repo" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another proof that complete restoration is indeed possible.&lt;/p&gt;

&lt;p&gt;We’ll keep you and this post updated.&lt;/p&gt;




&lt;p&gt;Originally published on &lt;a href="https://httpie.io/blog/stardust" rel="noopener noreferrer"&gt;HTTPie blog&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>httpie</category>
      <category>github</category>
    </item>
    <item>
      <title>What’s new in HTTPie for Terminal 3.1</title>
      <dc:creator>Jakub Roztocil</dc:creator>
      <pubDate>Tue, 15 Mar 2022 00:00:00 +0000</pubDate>
      <link>https://dev.to/pie/whats-new-in-httpie-for-terminal-31-4kgk</link>
      <guid>https://dev.to/pie/whats-new-in-httpie-for-terminal-31-4kgk</guid>
      <description>&lt;p&gt;We released &lt;a href="https://dev.to/pie/whats-new-in-httpie-for-terminal-30-4dpp"&gt;HTTPie for Terminal 3.0&lt;/a&gt; about a month ago. Today we’re announcing 3.1.0 that comes with a bunch of enhancements and a security-related fix.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;🍪 Improved cookie management —&lt;/strong&gt; improved security with host-bound cookies, and more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚙️ Session management —&lt;/strong&gt; automatic upgrades of sessions files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧩 CLI parser schema export —&lt;/strong&gt; a new &lt;code&gt;httpie cli export-args&lt;/code&gt; command with machine-readable arguments description.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🌲 Nested JSON enhancements —&lt;/strong&gt; formalization of the top-level array syntax, and a fix for escaping of multiple backslahses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✨ Simplified usage —&lt;/strong&gt;  HTTPie now has an intelligent compact help.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🪲 Bug fixes —&lt;/strong&gt; extinguished and regression-test-covered.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;♥️ Community contributions —&lt;/strong&gt; lots of amazing people who have contributed to this release.&lt;/p&gt;

&lt;h3&gt;
  
  
  🍪 Improved cookie management
&lt;/h3&gt;

&lt;p&gt;Before 3.1.0, HTTPie didn‘t bind cookies to the host that set them. This behavior resulted in the exposure of some cookies when there are redirects originating from the actual host to a third party website, e.g:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;http &lt;span class="nt"&gt;--follow&lt;/span&gt; &lt;span class="nt"&gt;--session&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;jar &lt;span class="se"&gt;\&lt;/span&gt;
  pie.dev/redirect-to &lt;span class="nv"&gt;url&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;https://httpbin.org/cookies
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prior to 3.1:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cookies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"x"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"y"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Starting with 3.1:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cookies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This behavior has been corrected in this release (with taking&lt;br&gt;
&lt;a href="https://datatracker.ietf.org/doc/html/rfc6265" rel="noopener noreferrer"&gt;RFC 6265 — HTTP State Management Mechanism&lt;/a&gt;&lt;br&gt;
into the consideration).&lt;/p&gt;
&lt;h4&gt;
  
  
  Security advisory
&lt;/h4&gt;

&lt;p&gt;The old host-unbound handling of cookies in sessions represents a low-severity security vulnerability. We’d like to thank &lt;a href="https://github.com/glyph" rel="noopener noreferrer"&gt;@glyph&lt;/a&gt; for responsibly &lt;a href="https://huntr.dev/bounties/dafb2e4f-c6b6-4768-8ef5-b396cd6a801f/" rel="noopener noreferrer"&gt;disclosing&lt;/a&gt; the issue. It has been assigned the CVE ID &lt;code&gt;CVE-2022-24737&lt;/code&gt; (and &lt;code&gt;CVE-2022-0430&lt;/code&gt;, which is a duplicate), and you can read more about it in &lt;a href="https://github.com/httpie/httpie/security/advisories/GHSA-9w4w-cpc8-h2fq" rel="noopener noreferrer"&gt;the advisory&lt;/a&gt; published on GitHub.&lt;/p&gt;

&lt;p&gt;📖 &lt;a href="https://httpie.io/docs/cli/host-based-cookie-policy" rel="noopener noreferrer"&gt;Host-based cookie policy docs →&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  ⚙️ Automated session upgrades
&lt;/h3&gt;

&lt;p&gt;The change in HTTPie’s handling of cookies triggered the need to also change the sessions file format. When you use a session file in the old format, HTTPie will ask you to upgrade it first. There are two new commands to help you upgrade your sessions:&lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;code&gt;httpie cli sessions upgrade&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;With this command, you can upgrade a single session file.&lt;/p&gt;

&lt;p&gt;Upgrade an &lt;a href="https://httpie.io/docs/cli/anonymous-sessions" rel="noopener noreferrer"&gt;anonymous session&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;httpie cli sessions upgrade pie.dev ./jar.json
Upgraded &lt;span class="s1"&gt;'jar'&lt;/span&gt; @ &lt;span class="s1"&gt;'pie.dev'&lt;/span&gt; to v3.1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Upgrade a &lt;a href="https://httpie.io/docs/cli/named-sessions" rel="noopener noreferrer"&gt;named session&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;httpie cli sessions upgrade &lt;span class="nt"&gt;--bind-cookies&lt;/span&gt; pie.dev api-auth
Upgraded &lt;span class="s1"&gt;'api-auth'&lt;/span&gt; @ &lt;span class="s1"&gt;'pie.dev'&lt;/span&gt; to v3.1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;code&gt;httpie cli sessions upgrade-all&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;This command allows you to upgrade all your named sessions in one go:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;httpie cli sessions upgrade-all
Upgraded &lt;span class="s1"&gt;'jar'&lt;/span&gt; @ &lt;span class="s1"&gt;'pie.dev'&lt;/span&gt; to v3.1.0.
Upgraded &lt;span class="s1"&gt;'api-auth'&lt;/span&gt; @ &lt;span class="s1"&gt;'pie.dev'&lt;/span&gt; to v3.1.0.
Upgraded &lt;span class="s1"&gt;'api-auth'&lt;/span&gt; @ &lt;span class="s1"&gt;'api.myhost.com'&lt;/span&gt; to v3.1.0.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📖 &lt;a href="https://httpie.io/docs/cli/upgrading-sessions" rel="noopener noreferrer"&gt;Session upgrade docs →&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🧩 Exporting CLI’s parser schema
&lt;/h3&gt;

&lt;p&gt;We’ve added a new command called &lt;code&gt;httpie cli export-args&lt;/code&gt;. The idea is to improve interoperability by exposing our CLI definition to third-party tools in a machine-readable format (not unlike an API description). This makes it easier for developers to generate auto-completion for different shells and utilities, power playgrounds, cheatsheets, etc.&lt;/p&gt;

&lt;p&gt;HTTPie users will also benefit from the internal CLI-definition-as-data refactorings directly as they allow us to implement a more user-friendly and contextual help output, finally generate a proper man page, and more (coming very soon)!&lt;/p&gt;

&lt;p&gt;For a very simple example, we can use &lt;code&gt;export-args&lt;/code&gt; to list the first ten options:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ httpie cli export-args --format=json | jq '.spec.groups[].args[].options[0]' | head
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"METHOD"
"URL"
"REQUEST_ITEM"
"--json"
"--form"
"--multipart"
"--boundary"
"--raw"
"--compress"
"--pretty"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📖 &lt;a href="https://httpie.io/docs/cli/httpie-cli-export-args" rel="noopener noreferrer"&gt;&lt;code&gt;httpie cli export-args&lt;/code&gt; docs →&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🌲 Nested JSON enhancements
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Top-Level arrays
&lt;/h4&gt;

&lt;p&gt;If you want to use an array (instead of an object) as the top-level encapsulator on your generated JSON data, we have now formalized a syntax for it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ http --offline --print=B pie.dev/post \
    []:='httpie.io' \
    []:='pie.dev' \
    []:='pie.co'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"httpie.io"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"pie.dev"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"pie.co"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📖 &lt;a href="https://httpie.io/docs/cli/top-level-arrays" rel="noopener noreferrer"&gt;Top-level array docs →&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Escaping of multiple backslashes
&lt;/h4&gt;

&lt;p&gt;This release has also fixed a bug related to escaping of multiple backslashes inside a single key group.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ http pie.dev/post 'data[\\key]=value'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"json"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"\\key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📖 &lt;a href="https://httpie.io/docs/cli/escaping-behavior" rel="noopener noreferrer"&gt;Nested JSON escaping docs →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ✨ Simplified usage
&lt;/h2&gt;

&lt;p&gt;HTTPie for Terminal grew a lot in the past decade, so did the usage section in the help messages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;http
usage: http
    &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--json&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--form&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--multipart&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--boundary&lt;/span&gt; BOUNDARY]
    &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--raw&lt;/span&gt; RAW] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--compress&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
    &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--pretty&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;all,colors,format,none&lt;span class="o"&gt;}]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--style&lt;/span&gt; STYLE]
    &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--unsorted&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--sorted&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--response-charset&lt;/span&gt; ENCODING]
    &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--response-mime&lt;/span&gt; MIME_TYPE]
    &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--format-options&lt;/span&gt; FORMAT_OPTIONS] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--print&lt;/span&gt; WHAT]
    &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--headers&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--meta&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--body&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--verbose&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--all&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
    &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--history-print&lt;/span&gt; WHAT] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--stream&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--output&lt;/span&gt; FILE]
    &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--download&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--continue&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--quiet&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
    &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--session&lt;/span&gt; SESSION_NAME_OR_PATH |
    &lt;span class="nt"&gt;--session-read-only&lt;/span&gt; SESSION_NAME_OR_PATH]
    &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--auth&lt;/span&gt; USER[:PASS] | TOKEN]
    &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--auth-type&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;basic,bearer,digest,edgegrid&lt;span class="o"&gt;}]&lt;/span&gt;
    &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--ignore-netrc&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--offline&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
    &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--proxy&lt;/span&gt; PROTOCOL:PROXY_URL]
    &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--follow&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--max-redirects&lt;/span&gt; MAX_REDIRECTS]
    &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--max-headers&lt;/span&gt; MAX_HEADERS] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--timeout&lt;/span&gt; SECONDS]
    &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--check-status&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--path-as-is&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--chunked&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
    &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--verify&lt;/span&gt; VERIFY] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--ssl&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;ssl2.3,tls1,tls1.1,tls1.2&lt;span class="o"&gt;}]&lt;/span&gt;
    &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--ciphers&lt;/span&gt; CIPHERS] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--cert&lt;/span&gt; CERT] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--cert-key&lt;/span&gt; CERT_KEY]
    &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--ignore-stdin&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--help&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--version&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--traceback&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
    &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--default-scheme&lt;/span&gt; DEFAULT_SCHEME] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--debug&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
    &lt;span class="o"&gt;[&lt;/span&gt;METHOD] URL &lt;span class="o"&gt;[&lt;/span&gt;REQUEST_ITEM ...]
http: error: the following arguments are required: URL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We redesigned this output to be more simple, so it reveals what you really care about:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;http
usage:
    http &lt;span class="o"&gt;[&lt;/span&gt;METHOD] URL &lt;span class="o"&gt;[&lt;/span&gt;REQUEST_ITEM ...]

error:
    the following arguments are required: URL

For more information try &lt;span class="s1"&gt;'http --help'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It can also contextually highlight the usage of specific options. In the example below, it adds &lt;code&gt;--pretty {all, colors, ...}&lt;/code&gt; to the output becuase it’s used incorrectly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;http &lt;span class="nt"&gt;--pretty&lt;/span&gt;

usage:
    http &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--pretty&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;all,colors,format,none&lt;span class="o"&gt;}]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;METHOD] URL &lt;span class="o"&gt;[&lt;/span&gt;REQUEST_ITEM ...]

error:
    argument &lt;span class="nt"&gt;--pretty&lt;/span&gt;: expected one argument

For more information try &lt;span class="s1"&gt;'http --help'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🪲 Bug fixes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Responses without a reason phrase in the Status-Line, e.g. &lt;code&gt;HTTP/1.1 200&lt;/code&gt; as opposed to &lt;code&gt;HTTP/1.1 200 OK&lt;/code&gt;, failed to render correctly with the Pie themes. This is now fixed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fixed redundant issuance of stdin detection warnings on some rare cases.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;-qq&lt;/code&gt; or &lt;code&gt;--quiet --quiet&lt;/code&gt; now correctly suppresses warnings.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🐙 &lt;a href="https://github.com/httpie/httpie/blob/master/CHANGELOG.md#310-2022-03-08" rel="noopener noreferrer"&gt;Full changelog →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ♥️ Community contributions
&lt;/h2&gt;

&lt;p&gt;Last but not least we’d like to thank the amazing people who’ve contributed to this phenomenal release of HTTPie:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Glyph" rel="noopener noreferrer"&gt;Glyph&lt;/a&gt;,&lt;br&gt;
&lt;a href="https://github.com/pjalsGit" rel="noopener noreferrer"&gt;Daniel&lt;/a&gt;,&lt;br&gt;
&lt;a href="https://github.com/igoracmelo" rel="noopener noreferrer"&gt;Igor Melo&lt;/a&gt;,&lt;br&gt;
&lt;a href="https://github.com/marcoschicote" rel="noopener noreferrer"&gt;Marcos Chicote&lt;/a&gt;,&lt;br&gt;
&lt;a href="https://github.com/mkmoisen" rel="noopener noreferrer"&gt;Matthew Moisen&lt;/a&gt;,&lt;br&gt;
&lt;a href="https://github.com/ducaale" rel="noopener noreferrer"&gt;Mohamed Daahir&lt;/a&gt;,&lt;br&gt;
&lt;a href="https://github.com/nilushancosta" rel="noopener noreferrer"&gt;Nilushan Costa&lt;/a&gt;,&lt;br&gt;
&lt;a href="https://github.com/ptrcnull" rel="noopener noreferrer"&gt;Patrycja&lt;/a&gt;,&lt;br&gt;
&lt;a href="https://github.com/binbjz" rel="noopener noreferrer"&gt;binbjz&lt;/a&gt;,&lt;br&gt;
&lt;a href="https://github.com/daurnimator" rel="noopener noreferrer"&gt;daurnimator&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>What’s new in HTTPie for Terminal 3.0</title>
      <dc:creator>Jakub Roztocil</dc:creator>
      <pubDate>Wed, 26 Jan 2022 19:20:16 +0000</pubDate>
      <link>https://dev.to/pie/whats-new-in-httpie-for-terminal-30-4dpp</link>
      <guid>https://dev.to/pie/whats-new-in-httpie-for-terminal-30-4dpp</guid>
      <description>&lt;p&gt;It’s hard to believe it’s been almost ten years since HTTPie for Terminal’s &lt;a href="https://github.com/httpie/httpie/commit/b966efa17d837dc62c23d5f8064e184e22b14c2e" rel="noopener noreferrer"&gt;initial commit&lt;/a&gt;. Seeing the result of &lt;a href="https://httpie.io/about" rel="noopener noreferrer"&gt;scratching our own API itch&lt;/a&gt; getting adopted by developers across the world and becoming the most popular API tool GitHub with 50K+ stars has been an incredible experience.&lt;/p&gt;

&lt;p&gt;Since then, we have been working enthusiastically to provide the best user experience for anyone working with APIs and, as of recently, growing HTTPie into a comprehensive API development platform accessible from Terminal, &lt;a href="https://httpie.io/product" rel="noopener noreferrer"&gt;Web &amp;amp; Desktop&lt;/a&gt;, and Mobile. Today, we are thrilled to announce the 3.0 release of HTTPie for Terminal.&lt;/p&gt;

&lt;p&gt;Our fantastic community has been providing thoughtful feedback over the years. And for 3.0, we focused on some of the most requested features of all time. Let us take you on a tour of the new features 👇&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;🌲 Nested JSON —&lt;/strong&gt; HTTPie language extended for crafting complex JSON structures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔌 Plugin manager —&lt;/strong&gt; robust handling of plugin installation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⏱️ Response metadata —&lt;/strong&gt; a new built-in way to display response metrics.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🚀 Speed-ups —&lt;/strong&gt; 30–250% speed-ups over different areas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🎨 Improved UI/UX —&lt;/strong&gt; unified Pie theme, improved stdin handling, and better errors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✨ Other features —&lt;/strong&gt; bearer auth, repeated headers, prompted session passwords, headers &amp;amp; params from files, effortless URL-to-command conversion, JSON types with forms, and auto-streaming.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🪲 Bug fixes —&lt;/strong&gt; extinguished and regression-test-covered.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;❤️ Community contributions —&lt;/strong&gt; dozens of amazing people have contributed to making this the best HTTPie release ever.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌲 Nested JSON
&lt;/h2&gt;

&lt;p&gt;Have you ever wondered whether the simplicity of the existing &lt;a href="https://httpie.io/docs/cli/request-items" rel="noopener noreferrer"&gt;HTTPie request language&lt;/a&gt; could meet with the power of nesting? This was a long journey, but ultimately, we embedded our mini path nesting format into the request language.&lt;/p&gt;

&lt;p&gt;We designed it to offer the highest functionality with the best user experience possible. For that, we took an existing format (namely, &lt;a href="https://www.w3.org/TR/html-json-forms/" rel="noopener noreferrer"&gt;HTML JSON form&lt;/a&gt;), and built our specification on top of it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ http pie.dev/post \
  platform[name]=HTTPie \
  platform[mission]='Make APIs simple and intuitive' \
  platform[homepage]=httpie.io \
  platform[stars]:=54000 \
  platform[apps][]=Terminal \
  platform[apps][]=Desktop \
  platform[apps][]=Web \
  platform[apps][]=Mobile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"platform"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HTTPie"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"mission"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Make APIs simple and intuitive"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"homepage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"httpie.io"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"stars"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;54000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"apps"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"Terminal"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"Desktop"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"Web"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"Mobile"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We focused on keeping the experience pleasant even when the user makes errors, which made us treat this as a complete language and implement small productivity boosters all around.&lt;/p&gt;

&lt;p&gt;For example, when typing all these structures on the terminal, if you happen to make a typo, not only do we show you where it occurs, but we also tell you how to possibly fix it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ http pie.dev/post data[foo][baar]]baz[:=2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;HTTPie Syntax Error: Expecting '['
data[foo][baar]]baz[
               ^
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another time-saver is object-level type safety, which prevents you from implicitly creating an ill-formatted JSON object:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ http pie.dev/post data[foo][bar]=object data[0][baz]="not an array"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;HTTPie Type Error: Can't perform 'index' based access on 'data' which has a type of 'object' but this operation requires a type of 'array'.
data[0][baz]
    ^^^
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(If you happen to be a Python developer and these error messages look familiar, it’s because we took inspiration from &lt;a href="https://docs.python.org/dev/whatsnew/3.11.html#enhanced-error-locations-in-tracebacks" rel="noopener noreferrer"&gt;improved errors in Python 3.10 / 3.11&lt;/a&gt;, that our very own &lt;a href="https://github.com/isidentical" rel="noopener noreferrer"&gt;@isidentical&lt;/a&gt; helped bring to life.)&lt;/p&gt;

&lt;p&gt;There is a lot more to learn about this feature. We recommend taking a minute familiarizing yourself with it so that your API interactions become more enjoyable than ever.&lt;/p&gt;

&lt;p&gt;📖 &lt;a href="https://httpie.io/docs/cli/nested-json" rel="noopener noreferrer"&gt;Nested JSON docs →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🔌 Plugin manager
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fu4iia7lxbwxkro9xg8kf.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fu4iia7lxbwxkro9xg8kf.jpg" alt="Plugin manager" width="800" height="566"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;HTTPie shines with plugins, and, even though we never publicized &lt;a href="https://github.com/httpie/httpie/blob/master/httpie/plugins/base.py" rel="noopener noreferrer"&gt;the plugin API&lt;/a&gt;, developers and companies have written and open-sourced dozens of them.&lt;/p&gt;

&lt;p&gt;Their functionality ranges from adding support for different authentication methods to changing how responses are displayed on the terminal; they serve various purposes and offer infinite possibilities to expand HTTPie itself.&lt;/p&gt;

&lt;p&gt;For example, &lt;a href="https://github.com/guardian/httpie-hmac-auth" rel="noopener noreferrer"&gt;guardian/httpie-hmac-auth&lt;/a&gt; and &lt;a href="https://github.com/akamai/httpie-edgegrid" rel="noopener noreferrer"&gt;akamai/httpie-edgegrid&lt;/a&gt; add custom auth protocols to HTTPie, which are then available to you through the &lt;code&gt;--auth-type&lt;/code&gt; option:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;http &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--auth-type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;edgegrid &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;default: &lt;span class="se"&gt;\&lt;/span&gt;
  :/diagnostic-tools/v2/ghost-locations/available
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the past, however, it was impossible to reliably install plugins for some distribution methods of HTTPie that come with a bundled Python interpreter (e.g., brew and snap).&lt;/p&gt;

&lt;p&gt;With 3.0, we make plugins first-class citizens. It is now possible to manage plugins directly by using the new &lt;code&gt;httpie&lt;/code&gt; management command and its &lt;code&gt;httpie plugins&lt;/code&gt; subcommands. This interface unifies plugin installation no matter how you installed HTTPie itself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;httpie plugins &lt;span class="nb"&gt;install &lt;/span&gt;your-favorite-plugin
Installing your-favorite-plugin...
&lt;span class="o"&gt;[&lt;/span&gt;snip]
Installed your-favorite-plugin&lt;span class="o"&gt;==&lt;/span&gt;1.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;httpie plugins list
httpie-edgegrid &lt;span class="o"&gt;(&lt;/span&gt;1.0.6&lt;span class="o"&gt;)&lt;/span&gt;
  httpie_oauth1 &lt;span class="o"&gt;(&lt;/span&gt;httpie.plugins.auth.v1&lt;span class="o"&gt;)&lt;/span&gt;
httpie-image &lt;span class="o"&gt;(&lt;/span&gt;1.0.0&lt;span class="o"&gt;)&lt;/span&gt;
  httpie_image &lt;span class="o"&gt;(&lt;/span&gt;httpie.plugins.converter.v1&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you’re curious what kind of plugins exist, you can &lt;a href="https://pypi.org/search/?q=httpie-" rel="noopener noreferrer"&gt;find most of them on PyPI&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;📖 &lt;a href="https://httpie.io/docs/cli/plugin-manager" rel="noopener noreferrer"&gt;Plugin manager docs →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ⏱️ Response metadata
&lt;/h2&gt;

&lt;p&gt;We created a new &lt;code&gt;meta&lt;/code&gt; section in our universal request/response display format.&lt;/p&gt;

&lt;p&gt;The section currently includes the total time elapsed. It’s the number of seconds between opening the network connection and downloading the last byte of the response body.&lt;/p&gt;

&lt;p&gt;Surprisingly, this was one of the oldest and &lt;a href="https://github.com/httpie/httpie/issues/243" rel="noopener noreferrer"&gt;the most 👍’ed issue in our tracker&lt;/a&gt;, and we finally implemented it!&lt;/p&gt;

&lt;p&gt;You can use &lt;code&gt;-vv&lt;/code&gt; to display everything (whole request/response + meta section) or customize this display with our &lt;code&gt;--print=&lt;/code&gt; option.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ http --print=hm pie.dev/delay/0.5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt; &lt;span class="ne"&gt;OK&lt;/span&gt;
&lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;application/json&lt;/span&gt;

&lt;span class="err"&gt;Elapsed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;time:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.856867&lt;/span&gt;&lt;span class="err"&gt;s&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or only display the meta section with &lt;code&gt;--meta&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ http --meta pie.dev/delay/1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Elapsed time: 0.856867s
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🐰 By the way, if you use one of the new Pie theme styles (e.g., &lt;code&gt;--style=pie-dark&lt;/code&gt;), you’ll see the time information color-coded (green/yellow/orange/red) based on how long the exchange took:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Ft8837qvwznt9gwe3qwpo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Ft8837qvwznt9gwe3qwpo.png" alt="Colorful response time" width="800" height="566"&gt;&lt;/a&gt;&lt;br&gt;
📖 &lt;a href="https://httpie.io/docs/cli/response-meta" rel="noopener noreferrer"&gt;Response meta docs →&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  🚀 Speed-ups
&lt;/h2&gt;

&lt;p&gt;We believe that performance is a critical part of the overall user experience. And HTTPie is all about the user and how they feel when using our tools.&lt;/p&gt;

&lt;p&gt;HTTPie for Terminal is designed with interactive API communication in mind. In this context, the top priority has always been making active tasks requiring user cognition, such as defining requests and understanding responses, as fast as possible. The human brain’s I/O is a more precious resource than the computer’s one, and the number of brain cells doesn’t double every two years, regrettably.&lt;/p&gt;

&lt;p&gt;Having said that, we consider all forms of performance important and are working hard to reduce also the waiting time for developers, and this release includes multiple speed-ups over different areas:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fcfmhm9q540gmhh5t0eqa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fcfmhm9q540gmhh5t0eqa.png" alt="Speedups" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Startup time is now ~30-50% faster (depending on the environment).&lt;/li&gt;
&lt;li&gt;Decoding of streamed responses is ~30% faster.&lt;/li&gt;
&lt;li&gt;Downloads (i.e., when using &lt;code&gt;--download&lt;/code&gt;) are more than ~2.5× faster — for locally served files, the download speed went from ~320 MB/s to ~680 MB/s.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🐙 &lt;a href="https://github.com/httpie/httpie/tree/master/extras/profiling" rel="noopener noreferrer"&gt;Benchmarking code →&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  🎨 Improved UI/UX
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Pie theme
&lt;/h3&gt;

&lt;p&gt;While we are continuously improving HTTPie for Terminal, it is now part of a bigger platform that brings the beauty and simplicity of HTTPie to &lt;a href="https://httpie.io/product" rel="noopener noreferrer"&gt;Web &amp;amp; Desktop&lt;/a&gt;, and Mobile. Alongside consistent behavior, we work toward a unified style across these apps. This effort led us to create a new  set of styles called the Pie theme:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fvvxupgofi8vbxcksz49i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fvvxupgofi8vbxcksz49i.png" alt="Unified Pie theme" width="800" height="614"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The theme comes in three flavors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;pie-dark&lt;/code&gt; — for terminals with dark background&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pie-light&lt;/code&gt; — for terminals with light background&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pie&lt;/code&gt; — for both, but slightly compromises text legibility
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ http -vv --style=pie-dark pie.dev/post hello=world foo:=42
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;While &lt;code&gt;auto&lt;/code&gt; is still the default style (which takes colors from your shell environment), we highly recommend making &lt;code&gt;pie-dark&lt;/code&gt; your default style for the best experience:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ cat ~/.config/httpie/config.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"default_options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"--style=pie-dark"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🐰 Just like the dynamically colored timings, we color the HTTP method and status code to match with our apps across the platform. You can try the examples below:&lt;/p&gt;

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

&lt;p&gt;These colors are based on the degree of error/recoverability of each status class:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 1xx informational – blue
$ http -h pie.dev/status/101
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 2xx successful – green
$ http -h pie.dev/status/200
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 3xx redirection – yellow
$ http -h pie.dev/status/301
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 4xx client error – orange
$ http -h pie.dev/status/400
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 5xx server error – red
$ http -h pie.dev/status/500
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Method colors
&lt;/h4&gt;

&lt;p&gt;These colors are based on the potential severity of the impact of the request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# HEAD, GET – green
$ http --print=H GET pie.dev/get
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# POST – yellow
$ http --print=H POST pie.dev/post
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# PUT, PATCH – orange
$ http --print=H PATCH pie.dev/patch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# DELETE – red
$ http --print=H DELETE pie.dev/delete
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📖 &lt;a href="https://httpie.io/docs/cli/colors-and-formatting" rel="noopener noreferrer"&gt;Style docs →&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Improved stdin handling
&lt;/h3&gt;

&lt;p&gt;Something that will excite our users who like to use HTTPie for Terminal inside their scripts, workflow definitions, or cron jobs, are our new warnings about when there is no incoming data. If you happen to forget passing &lt;code&gt;--ignore-stdin&lt;/code&gt;, instead of waiting indefinitely for a stream that will never yield anything, HTTPie will now complain and let you know about this situation.&lt;/p&gt;

&lt;p&gt;📖 &lt;a href="https://httpie.io/docs/cli/scripting" rel="noopener noreferrer"&gt;Scripting docs →&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Better errors
&lt;/h3&gt;

&lt;p&gt;We also focused on improving error messages. A typical example is a mistyped hostname:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ http this.host.does.not.exist
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;http: error: gaierror: [Errno -2] Name or service not known
Couldn’t resolve the given hostname. Please check the URL and try again.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ✨ Various enhancements
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Bearer authentication
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;bearer&lt;/code&gt; is now a natively supported authentication type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ http -A bearer -a token pie.dev/bearer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📖 &lt;a href="https://httpie.io/docs/cli/bearer-auth" rel="noopener noreferrer"&gt;Bearer auth docs →&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Non-unique header names
&lt;/h3&gt;

&lt;p&gt;Sending and receiving multiple HTTP header lines with the same name is now fully supported. They’re now shown and sent exactly as specified, i.e., multiple headers lines as opposed to a single header with a comma-separated list of values:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ http --offline pie.dev/get X-Pie:Apple X-Pie:Pumpkin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="nf"&gt;GET&lt;/span&gt; &lt;span class="nn"&gt;/get&lt;/span&gt; &lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
&lt;span class="na"&gt;X-Pie&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Apple&lt;/span&gt;
&lt;span class="na"&gt;X-Pie&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Pumpkin&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📖 &lt;a href="https://httpie.io/docs/cli/multiple-header-values-with-the-same-name" rel="noopener noreferrer"&gt;Repeated headers docs →&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Prompted password in sessions
&lt;/h3&gt;

&lt;p&gt;Prompted passwords are now stored in local sessions. Try typing &lt;code&gt;123&lt;/code&gt; to the given prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ http -a user --session=./sess.json pie.dev/basic-auth/user/123
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And now try without passing the auth option:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ http --session=./sess.json pie.dev/basic-auth/user/123
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Shout out to &lt;a href="https://github.com/sebastianczech" rel="noopener noreferrer"&gt;Sebastian Czech&lt;/a&gt; for contributing this feature.&lt;/p&gt;

&lt;p&gt;📖 &lt;a href="https://httpie.io/docs/cli/password-prompt" rel="noopener noreferrer"&gt;Password prompt docs →&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Query params and headers from files
&lt;/h3&gt;

&lt;p&gt;There are two new operators for reading query parameters and headers from files — &lt;code&gt;==@&lt;/code&gt; and &lt;code&gt;:@&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ http --offline pie.dev/headers \
  Header-From-File:@files/text.txt \
  param-from-file==@files/text.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📖 &lt;a href="https://httpie.io/docs/cli/file-based-separators" rel="noopener noreferrer"&gt;File loading docs →&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Effortless URL-to-command conversion
&lt;/h3&gt;

&lt;p&gt;Keep &lt;code&gt;://&lt;/code&gt; in the URL argument if you want to. Pasting URLs into HTTPie calls has never been easier: just add a space after the protocol name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ https ://pie.dev
# =&amp;gt; https://pie.dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📖 &lt;a href="https://httpie.io/docs/cli/request-url" rel="noopener noreferrer"&gt;URL docs →&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  JSON types with forms
&lt;/h3&gt;

&lt;p&gt;We added support for basic JSON types with &lt;code&gt;--form&lt;/code&gt; and &lt;code&gt;--multipart&lt;/code&gt; when using the otherwise JSON-only operators &lt;code&gt;:=&lt;/code&gt; and &lt;code&gt;:=@&lt;/code&gt;, which allows you to quickly toggle between form and JSON requests. This change doesn’t alter the existing behavior, but it makes what was previously implicit/undefined/buggy explicitly supported:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ http --form pie.dev/post id:=10 'username:="httpie"'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📖 &lt;a href="https://httpie.io/docs/cli/forms" rel="noopener noreferrer"&gt;Forms docs →&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Auto-stream
&lt;/h3&gt;

&lt;p&gt;If the response headers include &lt;code&gt;Content-Type: text/event-stream&lt;/code&gt;, we now auto-stream the response body. So you no longer need to explicitly specify &lt;code&gt;--stream&lt;/code&gt; when reading event streams.&lt;/p&gt;

&lt;p&gt;📖 &lt;a href="https://httpie.io/docs/cli/streamed-responses" rel="noopener noreferrer"&gt;Streaming docs →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🪲 Bug fixes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;An XML declaration was auto-added to the beginning of each formatted XML response, but not anymore. Now you'll only see it if it's already present in the raw response.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Broken plugins would crash the whole application, yikes! They no longer do.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automatic syntax highlighting and formatting now works for complex &lt;code&gt;Content-Type&lt;/code&gt; headers (e.g., when charset is specified).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Using &lt;code&gt;--raw&lt;/code&gt; together with &lt;code&gt;--chunked&lt;/code&gt; is now fixed.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🐙 &lt;a href="https://github.com/httpie/httpie/blob/master/CHANGELOG.md" rel="noopener noreferrer"&gt;Full changelog →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ❤️ Community contributions
&lt;/h2&gt;

&lt;p&gt;Last but not least we’d like to thank the amazing people who’ve contributed to this phenomenal release of HTTPie:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/aaronhmiller" rel="noopener noreferrer"&gt;Aaron Miller&lt;/a&gt;, &lt;a href="https://github.com/ab-kily" rel="noopener noreferrer"&gt;Alexander Bogdanov&lt;/a&gt;, &lt;a href="https://github.com/andrascz" rel="noopener noreferrer"&gt;András Czigány&lt;/a&gt;, &lt;a href="https://github.com/isidentical" rel="noopener noreferrer"&gt;Batuhan Taskaya&lt;/a&gt;, &lt;a href="https://github.com/bac" rel="noopener noreferrer"&gt;Brad Crittenden&lt;/a&gt;, &lt;a href="https://github.com/cythrawll" rel="noopener noreferrer"&gt;Chad&lt;/a&gt;, &lt;a href="https://github.com/sym3tri" rel="noopener noreferrer"&gt;Ed Rooth&lt;/a&gt;, &lt;a href="https://github.com/gmelodie" rel="noopener noreferrer"&gt;Gabriel Cruz&lt;/a&gt;, &lt;a href="https://github.com/gkcs" rel="noopener noreferrer"&gt;Gaurav&lt;/a&gt;, &lt;a href="https://github.com/janbrasna" rel="noopener noreferrer"&gt;Jan Brašna&lt;/a&gt;, &lt;a href="https://github.com/blyxxyz" rel="noopener noreferrer"&gt;Jan Verbeek&lt;/a&gt;, &lt;a href="https://github.com/strindberg" rel="noopener noreferrer"&gt;Jesper Holmberg&lt;/a&gt;, &lt;a href="https://github.com/seguri" rel="noopener noreferrer"&gt;Marco Seguri&lt;/a&gt;, &lt;a href="https://github.com/markrosenbaum" rel="noopener noreferrer"&gt;Mark Rosenbaum&lt;/a&gt;, &lt;a href="https://github.com/BoboTiG" rel="noopener noreferrer"&gt;Mickaël Schoentgen&lt;/a&gt;, &lt;a href="https://github.com/mivade" rel="noopener noreferrer"&gt;Mike DePalatis&lt;/a&gt;, &lt;a href="https://github.com/hroncok" rel="noopener noreferrer"&gt;Miro Hrončok&lt;/a&gt;, &lt;a href="https://github.com/sevenc-nanashi" rel="noopener noreferrer"&gt;Nanashi.&lt;/a&gt;, &lt;a href="https://github.com/pmeister" rel="noopener noreferrer"&gt;Patrick Taylor&lt;/a&gt;, &lt;a href="https://github.com/paullaffitte" rel="noopener noreferrer"&gt;Paul Laffitte&lt;/a&gt;, &lt;a href="https://github.com/rshurts" rel="noopener noreferrer"&gt;Russell Shurts&lt;/a&gt;, &lt;a href="https://github.com/sebastianczech" rel="noopener noreferrer"&gt;Sebastian Czech&lt;/a&gt;, &lt;a href="https://github.com/doublevcodes" rel="noopener noreferrer"&gt;Vivaan Verma&lt;/a&gt;, &lt;a href="https://github.com/dair-targ" rel="noopener noreferrer"&gt;Vladimir Berkutov&lt;/a&gt;, &lt;a href="https://github.com/arloan" rel="noopener noreferrer"&gt;arloan&lt;/a&gt;, &lt;a href="https://github.com/blueray453" rel="noopener noreferrer"&gt;blueray453&lt;/a&gt;, &lt;a href="https://github.com/coldcoff" rel="noopener noreferrer"&gt;coldcoff&lt;/a&gt;, &lt;a href="https://github.com/hosseingt" rel="noopener noreferrer"&gt;hosseingt&lt;/a&gt;, &lt;a href="https://github.com/josephworks" rel="noopener noreferrer"&gt;josephworks&lt;/a&gt;, &lt;a href="https://github.com/peterpt" rel="noopener noreferrer"&gt;peterpt&lt;/a&gt;, &lt;a href="https://github.com/stonebig" rel="noopener noreferrer"&gt;stonebig&lt;/a&gt;, &lt;a href="https://github.com/whodidthis" rel="noopener noreferrer"&gt;whodidthis&lt;/a&gt;, &lt;a href="https://github.com/zoulja" rel="noopener noreferrer"&gt;zoulja&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;🐙 &lt;a href="https://github.com/httpie/httpie/blob/master/CONTRIBUTING.md" rel="noopener noreferrer"&gt;How to contribute →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Happy API testing, and see you again soon!
&lt;/h2&gt;

&lt;p&gt;But in the meantime…&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🎉 &lt;a href="https://httpie.io/docs/cli/installation" rel="noopener noreferrer"&gt;Install the latest version&lt;/a&gt; of HTTPie for Terminal.&lt;/li&gt;
&lt;li&gt;💬 Please &lt;a href="https://github.com/httpie/httpie/issues" rel="noopener noreferrer"&gt;report any bugs&lt;/a&gt; and share your feedback on 3.0.&lt;/li&gt;
&lt;li&gt;🐙️ &lt;a href="https://github.com/httpie/httpie" rel="noopener noreferrer"&gt;Star &amp;amp; watch the GitHub repo&lt;/a&gt; to learn about new releases.&lt;/li&gt;
&lt;li&gt;👉 Join our &lt;a href="https://httpie.io/discord" rel="noopener noreferrer"&gt;Discord community&lt;/a&gt; and follow &lt;a href="https://twitter.com/httpie" rel="noopener noreferrer"&gt;@httpie&lt;/a&gt; to stay up-to-date.&lt;/li&gt;
&lt;li&gt;💁🏻‍♀️ &lt;a href="https://httpie.io/beta" rel="noopener noreferrer"&gt;Join the private beta&lt;/a&gt; of &lt;a href="https://httpie.io/product" rel="noopener noreferrer"&gt;HTTPie for Web &amp;amp; Desktop&lt;/a&gt;, if you haven’t yet.&lt;/li&gt;
&lt;li&gt;👩‍💻 We’re also looking for new colleagues in &lt;a href="https://httpie.io/jobs" rel="noopener noreferrer"&gt;engineering and design roles&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>httpie</category>
      <category>api</category>
      <category>testing</category>
      <category>cli</category>
    </item>
    <item>
      <title>What’s new in HTTPie 2.6.0</title>
      <dc:creator>Jakub Roztocil</dc:creator>
      <pubDate>Sat, 23 Oct 2021 15:58:02 +0000</pubDate>
      <link>https://dev.to/pie/whats-new-in-httpie-260-131g</link>
      <guid>https://dev.to/pie/whats-new-in-httpie-260-131g</guid>
      <description>&lt;p&gt;This version of &lt;a href="https://httpie.io/" rel="noopener noreferrer"&gt;HTTPie&lt;/a&gt; introduces numerous improvements to data display and formatting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Body charset detection
&lt;/h2&gt;

&lt;p&gt;If a message’s &lt;code&gt;Content-Type&lt;/code&gt; header doesn’t specify &lt;code&gt;charset&lt;/code&gt;, HTTPie now auto-detects it from the body content, and then uses this information to correctly display the text on the terminal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Preview a Big5-encoded request w/o charset in Content-Type:&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;  &lt;span class="s1"&gt;'維基大典維基大典維基大典維基大典'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    | iconv &lt;span class="nt"&gt;-f&lt;/span&gt; utf8 &lt;span class="nt"&gt;-t&lt;/span&gt; big5 &lt;span class="se"&gt;\&lt;/span&gt;
    | http &lt;span class="nt"&gt;--offline&lt;/span&gt; pie.dev Content-Type:text/plain
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prior to HTTPie 2.6.0:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="nf"&gt;POST&lt;/span&gt; &lt;span class="nn"&gt;/&lt;/span&gt; &lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
&lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;text/plain&lt;/span&gt;

����j�����j�����j�����j��
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With 2.6.0:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="nf"&gt;POST&lt;/span&gt; &lt;span class="nn"&gt;/&lt;/span&gt; &lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
&lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;text/plain&lt;/span&gt;

維基大典維基大典維基大典維基大典
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can &lt;a href="https://httpie.iohttps://httpie.io/docs#display-encoding" rel="noopener noreferrer"&gt;learn more about displaying encoding&lt;/a&gt; in the docs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Response charset overwrite
&lt;/h2&gt;

&lt;p&gt;When the server includes an incorrect &lt;code&gt;charset&lt;/code&gt; in &lt;code&gt;Content-Type&lt;/code&gt;, you can now overwrite that value for display purposes.&lt;/p&gt;

&lt;p&gt;For example, the following response incorrectly specifies &lt;code&gt;charset=utf-8&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;http &lt;span class="nt"&gt;-F&lt;/span&gt; https://git.io/JiOaA
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt; &lt;span class="ne"&gt;OK&lt;/span&gt;
&lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;text/plain; charset=utf-8&lt;/span&gt;

����j��]Wikipedia�
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can now fix that with &lt;code&gt;--response-charset&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;http &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="nt"&gt;--response-charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;big5 https://git.io/JiOaA
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt; &lt;span class="ne"&gt;OK&lt;/span&gt;
&lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;text/plain; charset=utf-8&lt;/span&gt;

維基大典（Wikipedia)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Response MIME overwrite
&lt;/h2&gt;

&lt;p&gt;HTTPie looks at &lt;code&gt;Content-Type&lt;/code&gt; to select the right &lt;a href="https://httpie.io/docs#colors-and-formatting" rel="noopener noreferrer"&gt;syntax highlighter and formatter&lt;/a&gt; for each message body. If that fails (e.g., the server provides the wrong type), or you prefer a different treatment, you can now manually overwrite the mime type for the response with &lt;code&gt;--response-mime&lt;/code&gt;. For example, here we’re formatting and colorizing a JSON response as if it were YAML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;http &lt;span class="nt"&gt;--response-mime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;text/yaml pie.dev/get
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  XSSI prefixes no longer break JSON formatting
&lt;/h2&gt;

&lt;p&gt;HTTPie can now handle extraneous data preceding a JSON body.&lt;br&gt;
For example, when an API uses an XSSI prefix.&lt;/p&gt;

&lt;p&gt;Prior to HTTPie 2.6.0:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;for(;;){"status": -1, "error":"The resource requires authentication."}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With 2.6.0, we highlight the non-JSON prefix, and then correctly format and color the rest:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;for(;;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The resource requires authentication."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;-1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Duplicate JSON keys are now preserved
&lt;/h2&gt;

&lt;p&gt;JSON doesn’t disallow repeated keys. However, before HTTPie 2.6.0, we’d incorrectly show only the last occurrence as a result of formatting the JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;http &lt;span class="nt"&gt;--print&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;B &lt;span class="nt"&gt;--offline&lt;/span&gt; &lt;span class="nt"&gt;--raw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'{"A": 1,"A":2}'&lt;/span&gt; pie.dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prior to HTTPie 2.6.0:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"A"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Starting with HTTPie 2.6.0, we preserve all keys as shown below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"A"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"A"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Other improvements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Silence warnings through using &lt;code&gt;--quiet, -q&lt;/code&gt; twice (e.g. &lt;code&gt;-qq&lt;/code&gt;) (&lt;a href="https://github.com/httpie/httpie/issues/1175" rel="noopener noreferrer"&gt;#1175&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;List installed plugin list to &lt;code&gt;--debug&lt;/code&gt; output (&lt;a href="https://github.com/httpie/httpie/issues/1165" rel="noopener noreferrer"&gt;#1165&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Community contributions
&lt;/h2&gt;

&lt;p&gt;We’d like to thank these amazing people for their contributions to this release: &lt;a href="https://github.com/annettejanewilson" rel="noopener noreferrer"&gt;Annette Wilson&lt;/a&gt;, &lt;a href="https://github.com/davecheney" rel="noopener noreferrer"&gt;Dave&lt;/a&gt;, &lt;a href="https://github.com/peruzzof" rel="noopener noreferrer"&gt;Fabio Peruzzo&lt;/a&gt;, &lt;a href="https://github.com/hroncok" rel="noopener noreferrer"&gt;Miro Hrončok&lt;/a&gt;, &lt;a href="https://github.com/om26er" rel="noopener noreferrer"&gt;Omer Akram&lt;/a&gt;, &lt;a href="https://github.com/vovtz" rel="noopener noreferrer"&gt;Vincent van ’t Zand&lt;/a&gt;, &lt;a href="https://github.com/dkreeft" rel="noopener noreferrer"&gt;dkreeft&lt;/a&gt;, &lt;a href="https://github.com/rogerdehe" rel="noopener noreferrer"&gt;崔小二&lt;/a&gt;, and &lt;a href="https://github.com/hh-in-zhuzhou" rel="noopener noreferrer"&gt;黄海&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Originally published on &lt;a href="https://httpie.io/blog/httpie-2.6.0" rel="noopener noreferrer"&gt;HTTPie blog&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>httpie</category>
      <category>api</category>
      <category>testing</category>
      <category>cli</category>
    </item>
    <item>
      <title>How to navigate an API from the terminal</title>
      <dc:creator>Jakub Roztocil</dc:creator>
      <pubDate>Sat, 02 Oct 2021 12:16:56 +0000</pubDate>
      <link>https://dev.to/pie/how-to-navigate-an-api-from-the-terminal-3bmg</link>
      <guid>https://dev.to/pie/how-to-navigate-an-api-from-the-terminal-3bmg</guid>
      <description>&lt;p&gt;Today, we'll be diving into &lt;a href="https://themoviedb.org" rel="noopener noreferrer"&gt;The Movie Database&lt;/a&gt; and learning how to navigate its API efficiently with &lt;a href="https://httpie.io" rel="noopener noreferrer"&gt;HTTPie&lt;/a&gt;, &lt;a href="https://stedolan.github.io/jq/" rel="noopener noreferrer"&gt;jq&lt;/a&gt;, and &lt;a href="https://github.com/simeji/jid" rel="noopener noreferrer"&gt;jid&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;When it comes to movie and TV show data, the first thing that comes to mind is likely to be Amazon's IMDB service. IMDB lacks a public, supported REST API though. Historically people have used various URL scraping techniques and well-known paths to get data out of IMDB, but that is very fragile. The Movie Database, on the other hand, has a REST API for developers (with free access) and commercial licensing for money-making projects making it a useful resource.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dive preparation
&lt;/h2&gt;

&lt;p&gt;When you start from scratch working or playing with a new API, there are three important questions to answer up front:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Where's the documentation?
&lt;/h3&gt;

&lt;p&gt;The first question's answer is easy enough — &lt;code&gt;developers.themoviedb.org&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. What's the root endpoint?
&lt;/h3&gt;

&lt;p&gt;This should be answered by the documentation, but not always. The MovieDB docs don’t mention the root endpoint. Spoiler, the endpoint is &lt;code&gt;api.themoviedb.org&lt;/code&gt;. You'll only find that though after you have signed up as a user and requested an API key. It’s then that you are given an example URL with the API key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://api.themoviedb.org/3/movie/550?api_key=7e23cee5bfb742e781fccc26b9e9009f
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Is there authentication and how does it work?
&lt;/h3&gt;

&lt;p&gt;Yes, there is authentication in the form of an API key which is passed in the query parameter &lt;code&gt;api_key&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That's a fake API key we're showing so do remember to substitute it with your own API key if you are following along. You can obtain an API key by &lt;a href="https://www.themoviedb.org/signup" rel="noopener noreferrer"&gt;signing up for a TMDB account&lt;/a&gt; and &lt;a href="https://www.themoviedb.org/settings/api" rel="noopener noreferrer"&gt;requesting API access in the settings&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ready to HTTPie
&lt;/h2&gt;

&lt;p&gt;(If you haven’t already, now’s the time to &lt;a href="https://httpie.io/docs#installation" rel="noopener noreferrer"&gt;install HTTPie&lt;/a&gt; so that you can follow along.) Let's translate that URL to an HTTPie command first. We'll use the &lt;code&gt;https&lt;/code&gt; command to match the protocol from the URL. The first parameter, in the example and as defined in the API docs, is the endpoint and path like so. Let’s try just that, with no authentication:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;https api.themoviedb.org/3/movie/550
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you run that, you'll get:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt; &lt;span class="m"&gt;401&lt;/span&gt; &lt;span class="ne"&gt;Unauthorized&lt;/span&gt;
&lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;application/json&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"status_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"status_message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Invalid API key: You must be granted a valid key."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The HTTP status reflects an unauthorised access but there’s also a dump of response headers and the JSON error response. All because we didn't include the &lt;code&gt;api_key&lt;/code&gt; value to authorise the request. That was deliberate, because it's a good idea to see what the error responses look like early on. With this API we get both an HTTP status code for a type of error, an explicit error message and &lt;code&gt;”success”: false&lt;/code&gt; in the JSON body. The API’s own error codes are listed in the &lt;a href="https://www.themoviedb.org/documentation/api/status-codes" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we can add in our required authentication. With HTTPie, you can list headers and form values after the URL as name value pairs. What happens to them depends on the characters that separate them.&lt;/p&gt;

&lt;p&gt;If they are separated with a &lt;code&gt;:&lt;/code&gt; then they go into the HTTP request headers.&lt;/p&gt;

&lt;p&gt;If they are separated with an &lt;code&gt;=&lt;/code&gt; then they both go into a JSON body (and the request becomes a JSON body POST).&lt;/p&gt;

&lt;p&gt;And, this is the one we are interested in, if they are separated with an &lt;code&gt;==&lt;/code&gt; they get added to the query string parameters. This is what we want to do with the api_key.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;https api.themoviedb.org/3/movie/550 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;7e23cee5bfb742e781fccc26b9e9009f
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt; &lt;span class="ne"&gt;OK&lt;/span&gt;
&lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;application/json&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"adult"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"backdrop_path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/rr7E0NoGKxvbkb89eR1GwfoYjpA.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"belongs_to_collection"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"budget"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;63000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"genres"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Drama"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"homepage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://www.foxmovies.com/movies/fight-club"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;550&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"imdb_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tt0137523"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"original_language"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"en"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"original_title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Fight Club"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"overview"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A ticking-time-bomb insomniac and a slippery soap salesman channel primal male aggression into a shocking new form of therapy."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"popularity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;39.996&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"poster_path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/pB8BM7pdSp6B6Ih7QZ4DrQ3PmJK.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"production_companies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;711&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"logo_path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/tEiIH5QesdheJmDAqQwvtN60727.png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Fox 2000 Pictures"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"origin_country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"US"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"production_countries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"iso_3166_1"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"US"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"United States of America"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"release_date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1999-10-15"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"revenue"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100853753&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"runtime"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;139&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"spoken_languages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"english_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"English"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"iso_639_1"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"en"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"English"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Released"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tagline"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mischief. Mayhem. Soap."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Fight Club"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"video"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vote_average"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;8.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vote_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21654&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before we move on, a quick pro-tip: never forget that your command line shell can save you typing. Export the &lt;code&gt;api_key&lt;/code&gt; section as an environment variable like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"api_key==7e23cee5bfb742e781fccc26b9e9009f"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and then you can just do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;https api.themoviedb.org/3/movie/550 &lt;span class="nv"&gt;$API_KEY&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Working with responses
&lt;/h2&gt;

&lt;p&gt;There's a lot of JSON in the response we just got and, thanks to HTTPie, it is both formatted and syntax-coloured for easier reading. That formatted and coloured view is the default when HTTPie is outputting to a console. If you want to page through the results, you would usually pipe the output through the &lt;code&gt;more&lt;/code&gt; or &lt;code&gt;less&lt;/code&gt; commands.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;https api.themoviedb.org/3/movie/550 &lt;span class="nv"&gt;$API_KEY&lt;/span&gt; | less
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But if you do that, you'll see unformatted, colour-less output. That is because the HTTPie default for output to a pipe or anything that isn't a console is to leave the content untouched for other commands to consume.&lt;/p&gt;

&lt;p&gt;If you want to force formatted output, add &lt;code&gt;--pretty=format&lt;/code&gt; to the command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;https &lt;span class="nt"&gt;--pretty&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;format api.themoviedb.org/3/movie/550 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;$API_KEY&lt;/span&gt; | less
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you can read the formatted results at your own pace. If you want the colour back too, use &lt;code&gt;--pretty=all&lt;/code&gt; and the &lt;code&gt;-R&lt;/code&gt; flag of the &lt;code&gt;less&lt;/code&gt; command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;https &lt;span class="nt"&gt;--pretty&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;all api.themoviedb.org/3/movie/550 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;$API_KEY&lt;/span&gt; | less &lt;span class="nt"&gt;-R&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll now get formatted and colourised output you can page through.&lt;/p&gt;

&lt;p&gt;There is one other difference between the defaults for output to the console and redirected output. Headers are output to the console, but skipped when outputting to another program through a pipe. If you want only headers output to a pipe, use the &lt;code&gt;-h&lt;/code&gt; option.&lt;/p&gt;

&lt;p&gt;You can learn more about HTTPie's default options for terminal and redirected output in the &lt;a href="https://httpie.io/docs#terminal-output" rel="noopener noreferrer"&gt;Terminal Output&lt;/a&gt; section of the documentation. If you want to take direct control of what is output, check out the &lt;a href="https://httpie.io/docs#output-options" rel="noopener noreferrer"&gt;Output Options&lt;/a&gt;. They control which parts of the request/response exchange are output.&lt;/p&gt;

&lt;h2&gt;
  
  
  Digging into responses
&lt;/h2&gt;

&lt;p&gt;If you're trying to work out the structure and content of an API's JSON responses, you can keep paging through the documentation and the paged output of &lt;code&gt;less&lt;/code&gt; or you can reach for more precise JSON parsing tools such as, &lt;a href="https://stedolan.github.io/jq/" rel="noopener noreferrer"&gt;jq&lt;/a&gt; and &lt;a href="https://github.com/simeji/jid" rel="noopener noreferrer"&gt;jid&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;jq&lt;/code&gt;, a command line JSON processor, you can write expressions to extract and format data from JSON streams. &lt;code&gt;jid&lt;/code&gt; is an interactive JSON digger which lets you use some of jq's expressions and auto-completion to explore JSON files. For example, if we run&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;https api.themoviedb.org/3/movie/550 &lt;span class="nv"&gt;$API_KEY&lt;/span&gt; | jid
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Up comes a view of the JSON, formatted and colourised. Control-N and Control-P will let you page up and down through the returned data, but that's just the start.&lt;/p&gt;

&lt;p&gt;Say, for example, we are looking for which country the production occurred in. Start typing a name for a field like &lt;code&gt;pro&lt;/code&gt;, and you'll see &lt;code&gt;jid&lt;/code&gt; offers up &lt;code&gt;production_co&lt;/code&gt; as a potential autocomplete. Tap &lt;strong&gt;Tab&lt;/strong&gt; and you'll be able to alternate between &lt;code&gt;production_companies&lt;/code&gt; and &lt;code&gt;production_countries&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Hit return and &lt;code&gt;jid&lt;/code&gt; displays the contents of the production_companies array. Tap &lt;strong&gt;Tab&lt;/strong&gt; again and you'll be able to enter an array index &lt;code&gt;1&lt;/code&gt; and &lt;strong&gt;Tab&lt;/strong&gt; again to display just one entry from the array. Type &lt;code&gt;.&lt;/code&gt; and you can auto-complete through that entry’s field names. &lt;code&gt;jid&lt;/code&gt; is great for locating data in nested structures and the queries you use work in the command line with &lt;code&gt;jq&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Now with these two tools to hand, you're ready to explore more of the MovieDB API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding more about a movie
&lt;/h2&gt;

&lt;p&gt;While there are endpoints for every movie under the /movie/ path — they are located with an id — there are also subsections to each movie entry for release dates, keywords, ratings, credits, all with a path that comes after the id. So if you want to get the credits for a movie, you'd call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;https api.themoviedb.org/3/movie/550/credits &lt;span class="nv"&gt;$API_KEY&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This does seem to be a query for, potentially, just a small snippet of data. That's where &lt;code&gt;append_to_response&lt;/code&gt; in the &lt;a href="https://developers.themoviedb.org/3/getting-started/append-to-response" rel="noopener noreferrer"&gt;MovieDB API&lt;/a&gt; comes in. This lets you add, for particular endpoints like /movie, the various subsections. So, if we want a movie’s credits and images embedded into our response, we do this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;https api.themoviedb.org/3/movie/550 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;$API_KEY&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;append_to_response&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;credits,images
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It only costs us one request and merges all the data together into one JSON object.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding a movie
&lt;/h2&gt;

&lt;p&gt;What about finding a movie? For that, there's a search endpoint, &lt;code&gt;/search/movies&lt;/code&gt;. It takes a &lt;code&gt;query&lt;/code&gt; parameter which "must be URI-encoded". If your query value has a space in it, you can use quotes around the value and HTTPie will take care of URL-encoding the value for you. No hand-encoding spaces to &lt;code&gt;&amp;amp;20&lt;/code&gt; or similar. All we need to do is remember to put quotes around our value like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;https api.themoviedb.org/3/search/movie &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;$API_KEY&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;query&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="s2"&gt;"O.C. and Stiggs"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That'll return JSON data designed for paginated search results. If we wanted to look up more about the movie, we'd want the id from the first result. For that we can pipe the results to &lt;code&gt;jq ".results[0].id"&lt;/code&gt; and we'll get the movie id. From there, it's a call to the &lt;code&gt;/movie/{id}&lt;/code&gt; to get the movie details:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ MOVIE_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;
    https api.themoviedb.org/3/search/movie &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nv"&gt;$API_KEY&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nv"&gt;query&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="s1"&gt;'O.C. and Stiggs'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        | jq .results[0].id
&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;https api.themoviedb.org/3/movie/&lt;span class="nv"&gt;$MOVIE_ID&lt;/span&gt; &lt;span class="nv"&gt;$API_KEY&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or, if you want to pack it all into one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;https &lt;span class="si"&gt;$(&lt;/span&gt;
    https api.themoviedb.org/3/search/movie &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nv"&gt;$API_KEY&lt;/span&gt; &lt;span class="nv"&gt;query&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="s1"&gt;'O.C. and Stiggs'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.results[0] | "api.themoviedb.org/3/movie/\(.id)"'&lt;/span&gt;
&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;$API_KEY&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Discovering movies
&lt;/h2&gt;

&lt;p&gt;One of the richest API endpoints in The Movie DB API is /discover/movie. It lets you specify over thirty different properties for searching across films.&lt;/p&gt;

&lt;p&gt;So say you want the most popular science fiction movies on The Movie Database. Genres are represented in the API with an integer id so we need to look up what the id for “Science Fiction” is. The full genre list is available on another endpoint, &lt;code&gt;/genres/movie/list&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;https api.themoviedb.org/3/genre/movie/list &lt;span class="nv"&gt;$API_KEY&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt; &lt;span class="ne"&gt;OK&lt;/span&gt;
&lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;application/json&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"genres"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Action"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Adventure"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Animation"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;…&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can manually work your way through the list or use &lt;code&gt;jq&lt;/code&gt; to find the entry we are interested in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;https api.themoviedb.org/3/genre/movie/list &lt;span class="nv"&gt;$API_KEY&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    | jq &lt;span class="s1"&gt;'.genres[] | select(.name=="Science Fiction")'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;878&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Science Fiction"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So that tells us the genre id we are looking for is 878. Back at the /discover/movie endpoint, there’s a property called &lt;code&gt;with_genre&lt;/code&gt; which we’ll set to 878. Another property available on the endpoint is &lt;code&gt;sort_by&lt;/code&gt; which takes a field name and a sort order. We’ll set that to &lt;code&gt;popularity.desc&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;https api.themoviedb.org/3/discover/movie &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;with_genre&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;878 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;sort_by&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;popularity.desc &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;$API_KEY&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt; &lt;span class="ne"&gt;OK&lt;/span&gt;
&lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;application/json&lt;/span&gt;

&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"page"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"results"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"adult"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"backdrop_path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/9yBVqNruk6Ykrwc32qrK2TIE5xw.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"genre_ids"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="mi"&gt;878&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;460465&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"original_language"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"en"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"original_title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mortal Kombat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"overview"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Washed-up MMA fighter Cole Young, unaware of his heritage, and hunted by Emperor Shang Tsung's best warrior, Sub-Zero, seeks out and trains with Earth's greatest champions as he prepares to stand against the enemies of Outworld in a high stakes battle for the universe."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"popularity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;5817.001&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"poster_path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/xGuOF1T3WmPsAcQEQJfnG7Ud9f8.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"release_date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2021-04-07"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mortal Kombat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"video"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"vote_average"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;7.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"vote_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2266&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;…&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"total_pages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"total_results"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The results are paginated and this is page 1 with 20 results a page. If we want to compress this down to a simple list, we can use &lt;code&gt;jq&lt;/code&gt; again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;https api.themoviedb.org/3/discover/movie &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;with_genre&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;878 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;sort_by&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;popularity.desc &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;$API_KEY&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.results[] | "\(.title) \(.popularity)"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mortal Kombat 5817.001
Godzilla vs. Kong 3608.866
Tom Clancy's Without Remorse 4266.181
Nobody 2993.014
Vanquish 3156.355
Zack Snyder's Justice League 1992.158
…
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That snippet of jq just extracts and formats the title and popularity from the results array for each item. The &lt;code&gt;-r&lt;/code&gt; option just stops jq wrapping all its output in quotes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;Creating queries on The MovieDB API is quick thanks to HTTPie and with jq and jid, you can make sense of the results with the least amount of fuss.&lt;/p&gt;

&lt;p&gt;In the next part of this dive, we’ll look at how TMDB’s API now handles user-generated lists and how HTTPie makes it simpler to explore.&lt;/p&gt;




&lt;p&gt;Written by &lt;a href="https://twitter.com/codepope" rel="noopener noreferrer"&gt;Dj Walker-Morgan&lt;/a&gt; and originally published on &lt;a href="https://httpie.io/blog/cli-api-diving" rel="noopener noreferrer"&gt;HTTPie blog&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>api</category>
      <category>cli</category>
      <category>httpie</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Command-line API testing tricks</title>
      <dc:creator>Jakub Roztocil</dc:creator>
      <pubDate>Wed, 15 Sep 2021 11:16:31 +0000</pubDate>
      <link>https://dev.to/pie/command-line-api-tricks-with-httpie-20lk</link>
      <guid>https://dev.to/pie/command-line-api-tricks-with-httpie-20lk</guid>
      <description>&lt;p&gt;Whether building or consuming APIs, you're definitely testing out API calls. The command line is a developer's best friend for quick checks and iterative development. You can move even faster with &lt;a href="https://httpie.io/" rel="noopener noreferrer"&gt;HTTPie&lt;/a&gt;. HTTPie releases unintuitive command flags from your brain and removes repetitive parameters completely.&lt;/p&gt;

&lt;p&gt;This post will give some quick examples to make the most of your command line API development. Use these tips and tricks to ease your API headaches and bring some fun into your workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make JSON a first-class citizen
&lt;/h2&gt;

&lt;p&gt;For at least a decade, JSON has been the de facto standard response format for HTTP APIs. Strangely, a lot of tools give equal weight to other formats. HTTPie comes with sensible defaults, which assume data is expressed in JSON.&lt;/p&gt;

&lt;p&gt;After the &lt;a href="https://httpie.io/docs#installation" rel="noopener noreferrer"&gt;fast and easy installation&lt;/a&gt; you can retrieve JSON responses with a simple command line call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;http api.open-notify.org/astros.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you run this command you’ll get a list of the people currently in space, thanks to &lt;a href="http://open-notify.org/" rel="noopener noreferrer"&gt;Open Notify&lt;/a&gt;. By default, HTTPie makes your API responses readable. The results of this call are displayed in syntax-highlighted JSON. And no need to pipe to another formatting tool or ask the server to pretty print the results.&lt;/p&gt;

&lt;p&gt;Whether request or response data, HTTPie always looks for JSON first, unless told otherwise. That means that &lt;code&gt;Content-type&lt;/code&gt; and &lt;code&gt;Accept&lt;/code&gt; headers are set to &lt;code&gt;application/json&lt;/code&gt;. It will even attempt to find JSON within &lt;code&gt;text/plain&lt;/code&gt; or unknown content types.&lt;/p&gt;

&lt;p&gt;As much as developers love JSON, we don’t always enjoy writing it, especially on the command line. Use flexible command line parameters to construct your JSON without curly brackets, quotes, and a lifetime supply of backslashes.&lt;/p&gt;

&lt;p&gt;Here’s a sample call to send some basic JSON, without any of the obtrusive syntax:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;http POST pie.dev/post &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Jason year:&lt;span class="o"&gt;=&lt;/span&gt;2001
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you fire off that command, HTTPie interprets the &lt;code&gt;field=value&lt;/code&gt; pair as a string and &lt;code&gt;field:=value&lt;/code&gt; as a literal (in this case, a number). All of these parameter pairs turn into the JSON data POSTed to the URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Jason"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"year"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For more complex data, you can include external JSON or text files. But you can stop struggling with JSON syntax, escaped quotes, and the like, just to express simple request data. There’s a natural progression of complexity, allowing HTTPie to handle one advanced field (say, an array) while maintaining a simple command line syntax. Refer to the &lt;a href="https://httpie.io/docs#non-string-json-fields" rel="noopener noreferrer"&gt;JSON fields documentation&lt;/a&gt; for guidance on these approachable details.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use natural API-native commands
&lt;/h2&gt;

&lt;p&gt;Nothing against the other command line request tools, but they weren’t built for APIs. Some of these CLI relics have been around almost as long as the Web itself. In an effort to support every protocol, data format, and usage pattern, they can make it difficult to accomplish the everyday tasks of API developers. HTTPie was built alongside modern API development to be a natural extension of your work.&lt;/p&gt;

&lt;p&gt;JSON as a first-class citizen is certainly an API-native choice. In addition, HTTPie pays homage to the primary protocol used to access APIs—HTTP. The &lt;a href="https://httpie.io/docs#interface-design" rel="noopener noreferrer"&gt;interface design&lt;/a&gt; of many HTTPie commands mimic the underlying HTTP requests.&lt;/p&gt;

&lt;p&gt;For example, this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;http POST pie.dev/post &lt;span class="se"&gt;\&lt;/span&gt;
    X-API-Key:123 &lt;span class="se"&gt;\&lt;/span&gt;
    User-Agent:Bacon/1.0 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Jason year:&lt;span class="o"&gt;=&lt;/span&gt;2001
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Will be sent via HTTP as the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="nf"&gt;POST&lt;/span&gt; &lt;span class="nn"&gt;/post&lt;/span&gt; &lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
&lt;span class="na"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pie.dev&lt;/span&gt;
&lt;span class="na"&gt;X-API-Key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;123&lt;/span&gt;
&lt;span class="na"&gt;User-Agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Bacon/1.0&lt;/span&gt;
&lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;application/json&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Jason"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"year"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Request headers are communicated almost identically, without the need for special command flags. This simplicity is made possible by a &lt;a href="https://httpie.io/docs#request-items" rel="noopener noreferrer"&gt;minimal DSL for request items&lt;/a&gt; that flows naturally. The &lt;code&gt;:&lt;/code&gt; for headers comes from HTTP, as does &lt;code&gt;=&lt;/code&gt; for data. In fact, the power of the syntax is clear with a simple tweak to a commend: add a &lt;code&gt;-f&lt;/code&gt; flag and the exact same data fields will be sent form-encoded:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="nf"&gt;POST&lt;/span&gt; &lt;span class="nn"&gt;/post&lt;/span&gt; &lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
&lt;span class="na"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pie.dev&lt;/span&gt;
&lt;span class="na"&gt;X-API-Key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;123&lt;/span&gt;
&lt;span class="na"&gt;User-Agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Bacon/1.0&lt;/span&gt;
&lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;application/x-www-form-urlencoded&lt;/span&gt;

name=Jason&amp;amp;year=2001
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you want to see how these HTTP calls look without making live calls, you can &lt;a href="https://httpie.io/docs#offline-mode" rel="noopener noreferrer"&gt;enter &lt;code&gt;--offline&lt;/code&gt; mode&lt;/a&gt;. Rather than send a request to the host, HTTPie prints it to stdout.&lt;/p&gt;

&lt;p&gt;Offline mode is a great way to see some of the other implicit choices HTTPie makes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;POST is sent automatically when request data is present&lt;/li&gt;
&lt;li&gt;You can remove &lt;code&gt;http://&lt;/code&gt; and &lt;code&gt;https://&lt;/code&gt; from your &lt;a href="https://httpie.io/docs#request-url" rel="noopener noreferrer"&gt;request URLs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Or simply use &lt;code&gt;:&lt;/code&gt; to &lt;a href="https://httpie.io/docs#url-shortcuts-for-localhost" rel="noopener noreferrer"&gt;send requests to localhost&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The natural syntax keeps your head in your API development and your eyes out of man pages. That lets you focus on the bigger issues, like getting API authentication to work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don’t repeat your authentication
&lt;/h2&gt;

&lt;p&gt;You may be familiar with the DRY principle in software development. Meant to reduce repetition, DRY stands for Don’t Repeat Yourself. Typical code-level approaches include modularization and similar abstractions. By contrast, each API request stands on its own. Every time you make an API request you must include any authentication credentials, even if you sent them in a previous request. For example, if your API requests are to a cloud storage service, every request that accesses your account needs your credentials for that service. This is repetitive and inconvenient.&lt;/p&gt;

&lt;p&gt;As an API client, HTTPie must abide by the API server’s rules. While the server must receive credentials fresh each time, HTTPie can store them to send on your behalf.&lt;/p&gt;

&lt;p&gt;Use the &lt;a href="https://httpie.io/docs#sessions" rel="noopener noreferrer"&gt;session functionality&lt;/a&gt;, so you don’t repeat your authentication. Session functionality is convenient when you pass API tokens in headers or as part of a request URL. In either case, these get in the way of the rest of your API call.&lt;/p&gt;

&lt;p&gt;When you make your first call, include the authentication, headers, and whatever else you want to send with every call. Then use the &lt;code&gt;--session&lt;/code&gt; flag to give the session a name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;http &lt;span class="nt"&gt;--session&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dev &lt;span class="nt"&gt;-a&lt;/span&gt; :APIKEY pie.dev/get X-Random-Header:Included
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here we’ve included an API key via &lt;a href="https://httpie.io/docs#basic-auth" rel="noopener noreferrer"&gt;Basic Auth&lt;/a&gt; and a custom header. We also created a session named “dev.” Subsequent calls will only need to include the session flag to pass the authentication and header from the previous request.&lt;/p&gt;

&lt;p&gt;This command has the same results as the more verbose command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;http &lt;span class="nt"&gt;--session&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dev pie.dev/get
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The API key authentication was attached to the HTTP call, even though we did not explicitly include it in the command. Similarly, the &lt;code&gt;X-Random-Header&lt;/code&gt; that took up so much space is sent without being explicitly present.&lt;/p&gt;

&lt;p&gt;Sessions make for much cleaner commands, especially when you start sending query parameters or request data. Once you have the session flag in place, you &lt;em&gt;don’t repeat yourself&lt;/em&gt;. And you can be done with the copy-pasting or tedious command line editing that so often accompanies API tinkering.&lt;/p&gt;

&lt;p&gt;An alternative to named sessions is to store session details within local files. You can share these session files amongst your team, so you always get the same results. Then &lt;a href="https://httpie.io/docs#anonymous-sessions" rel="noopener noreferrer"&gt;call them up by file path&lt;/a&gt;, or use the trick in the next section—include them in your default configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create your own defaults
&lt;/h2&gt;

&lt;p&gt;It can be an adventure to watch someone develop on their own machine. You’ll notice seemingly random key combinations produce extraordinary results (but pure chaos when a Vim user mistakenly thinks they're in insert mode). These sorts of customizations can help you get the most out of any dev tool. You’ll appreciate the custom defaults you can add to HTTPie to make it your own.&lt;/p&gt;

&lt;p&gt;The latest &lt;a href="https://httpie.io/docs#config" rel="noopener noreferrer"&gt;configuration file options and location&lt;/a&gt; are in the HTTPie docs.&lt;/p&gt;

&lt;p&gt;For example, you can enable sessions by default, so credentials and custom headers from the previous sessions are automatically sent with each request to the same host. To do this, you include the &lt;code&gt;--session&lt;/code&gt; flag in &lt;code&gt;default_options&lt;/code&gt;. A unique session file will then be created for each host, which you can then modify. Your config file will look something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"default_options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"--session=default"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Whenever you need to overwrite the defaults, include another &lt;code&gt;session&lt;/code&gt; flag explicitly or use a &lt;code&gt;--no-session&lt;/code&gt; flag to ignore any existing session data.&lt;/p&gt;

&lt;p&gt;Your config defaults can include any flag options as an array, like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"default_options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"--session=default"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"--body"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"--style=colorful"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"--format-options=json.indent:2"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, we have the session flag as before, but we also have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;included &lt;code&gt;--body&lt;/code&gt; to display only the response body (no headers);&lt;/li&gt;
&lt;li&gt;set the syntax highlighting &lt;code&gt;--style&lt;/code&gt; to a defined color scheme;&lt;/li&gt;
&lt;li&gt;used &lt;code&gt;--format-options&lt;/code&gt; to set indentation equal to two spaces;&lt;/li&gt;
&lt;li&gt;and instructed HTTPie to &lt;code&gt;--follow&lt;/code&gt; redirects to a new location.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using defaults, all of these flags will be included every time you use the &lt;code&gt;http&lt;/code&gt; command, unless you specifically override them.&lt;/p&gt;

&lt;p&gt;You can find a categorized list of command flags, which include options for downloading data, using SSL, and employing proxies, with the following HTTPie call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;http &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Within the list, you’ll find a balance of intuitive defaults with the flexibility to make it your own.&lt;/p&gt;

&lt;p&gt;Please note that changing &lt;code&gt;default_options&lt;/code&gt; may lead to unexpected inconsistencies when sharing HTTPie commands with other developers. You can temporarily disable custom &lt;code&gt;default_options&lt;/code&gt; and verify HTTPie’s default behavior by setting &lt;code&gt;$HTTP_CONFIG_DIR&lt;/code&gt;, for example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ HTTPIE_CONFIG_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/tmp http pie.dev/get
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Get fewer API headaches
&lt;/h2&gt;

&lt;p&gt;HTTPie started in 2012 to eliminate our own pain when building and calling APIs. Thousands of developers add it to their command line and use it to perform effortless requests with beautiful responses.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://httpie.io/" rel="noopener noreferrer"&gt;Learn more about HTTPie&lt;/a&gt; and &lt;a href="https://twitter.com/httpie" rel="noopener noreferrer"&gt;follow us&lt;/a&gt; for more tips, news, and API tricks.&lt;/p&gt;




&lt;p&gt;Written by &lt;a href="https://twitter.com/adamd" rel="noopener noreferrer"&gt;Adam DuVander&lt;/a&gt; and originally published on &lt;a href="https://httpie.io/blog/cli-api-tricks" rel="noopener noreferrer"&gt;HTTPie blog&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>cli</category>
      <category>api</category>
      <category>testing</category>
      <category>httpie</category>
    </item>
  </channel>
</rss>
