~~ ====================================================================
~~ 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/>.

    ----------
    HttpAsyncClient Quick Start
    ----------
    ----------
    ----------

HttpAsyncClient Quick Start

    [[1]] Download 'Binary' package of the latest official release from the 
    {{{http://hc.apache.org/downloads.cgi} project download page}}. 
  
    There should be 8 jars in total (components marked with (*) include additional features and 
    are optional):
  
    * commons-logging-<x.x.x>.jar
  
    * commons-codec-<x.x.x>.jar
  
    * httpcore-<x.x.x>.jar
  
    * httpcore-nio-<x.x.x>.jar
  
    * httpclient-<x.x.x>.jar
  
    * httpasyncclient-<x.x.x>.jar
  
    * httpclient-cache-<x.x.x>.jar (*)

    * httpasyncclient-cache-<x.x.x>.jar (*)

   []

    [[2]] Take a look at the {{{../httpcomponents-core-ga/tutorial/html/index.html}HttpCore 
    tutorial}} for introduction to fundamentals of asynchronous HTTP communication with
    HttpComponents.
    
    [[3]] Another good way of getting started with HttpClient is by seeing it in action. Take 
    a look at the samples shipped with the release package or available {{{./examples.html}online}}.
    

