~~ ====================================================================
~~ Licensed to the Apache Software Foundation (ASF) under one
~~ or more contributor license agreements.  See the NOTICE file
~~ distributed with this work for additional information
~~ regarding copyright ownership.  The ASF licenses this file
~~ to you under the Apache License, Version 2.0 (the
~~ "License"); you may not use this file except in compliance
~~ with the License.  You may obtain a copy of the License at
~~ 
~~   http://www.apache.org/licenses/LICENSE-2.0
~~ 
~~ Unless required by applicable law or agreed to in writing,
~~ software distributed under the License is distributed on an
~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
~~ KIND, either express or implied.  See the License for the
~~ specific language governing permissions and limitations
~~ under the License.
~~ ====================================================================
~~ 
~~ This software consists of voluntary contributions made by many
~~ individuals on behalf of the Apache Software Foundation.  For more
~~ information on the Apache Software Foundation, please see
~~ <http://www.apache.org/>.

    ----------
    HttpComponents HttpCore Examples
    ----------
    ----------
    ----------

Related projects

* HttpClient 5.0 migration guide

    {{{https://ok2c.github.io/httpclient-migration-guide/}HttpClient 5.0 migration guide}}
    is a third party resource with recommendations about the upgrade process and
    possible upgrade paths from Apache HttpClient 4.x to Apache HttpClient 5.0.

* Asynchronous JSON message processors

    {{{https://ok2c.github.io/httpcomponents-jackson/}Asynchronous JSON message processors}}
    library is a companion project for HttpClient 5.0 developed outside the Apache Software
    Foundation.

    The library provides a number of asynchronous message consumers and producers
    for efficient, reactive processing of HTTP messages with enclosed JSON content using
    {{{https://github.com/FasterXML/jackson}Jackson JSON processor}}.


* Android extensions

    {{{https://ok2c.github.io/httpclient-android-ext/}Android extensions for
    Apache HttpClient 5.0}} is a third party library that provides extra functionality
    simplifying application of Apache HttpClient on Google Android platform.
