<?xml version="1.0"?>
<!--

    Copyright (c) 2010, 2023 Oracle and/or its affiliates. All rights reserved.

    This program and the accompanying materials are made available under the
    terms of the Eclipse Public License v. 2.0, which is available at
    http://www.eclipse.org/legal/epl-2.0.

    This Source Code may also be made available under the following Secondary
    Licenses when the conditions for such availability set forth in the
    Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
    version 2 with the GNU Classpath Exception, which is available at
    https://www.gnu.org/software/classpath/license.html.

    SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0

-->

<!DOCTYPE chapter [<!ENTITY % ents SYSTEM "jersey.ent" > %ents;]>
<chapter xmlns="http://docbook.org/ns/docbook"
         version="5.0"
         xml:lang="en"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns:xlink="http://www.w3.org/1999/xlink"
         xsi:schemaLocation="http://docbook.org/ns/docbook http://docbook.org/xml/5.0/xsd/docbook.xsd
                             http://www.w3.org/1999/xlink http://www.w3.org/1999/xlink.xsd"
         xml:id="client">

    <title>Client API</title>

    <para>
        This section introduces the JAX-RS Client API, which is a fluent Java based API for communication with RESTful Web
        services. This standard API that is also part of Jakarta EE 9 is designed to make it very easy to consume a Web service
        exposed via HTTP protocol and enables developers to concisely and efficiently implement portable client-side solutions
        that leverage existing and well established client-side HTTP connector implementations.
    </para>
    <para>
        The JAX-RS client API can be utilized to consume any Web service exposed on top of a HTTP protocol or it's
        extension (e.g. WebDAV), and is not restricted to services implemented using JAX-RS. Yet, developers familiar with JAX-RS
        should find the client API complementary to their services, especially if the client API is utilized by those services
        themselves, or to test those services.
        The JAX-RS client API finds inspiration in the proprietary Jersey 1.x Client API and developers familiar with the Jersey
        1.x Client API should find it easy to understand all the concepts introduced in the new JAX-RS Client API.
    </para>

    <para>
        The goals of the client API are threefold:

        <orderedlist>
            <listitem>
                <para>
                    Encapsulate a key constraint of the REST architectural style, namely the Uniform Interface Constraint and
                    associated data elements, as client-side Java artifacts;
                </para>
            </listitem>
            <listitem>
                <para>
                    Make it as easy to consume RESTful Web services exposed over HTTP, same as the JAX-RS server-side API makes
                    it easy to develop RESTful Web services; and
                </para>
            </listitem>
            <listitem>
                <para>
                    Share common concepts and extensibility points of the JAX-RS API between the server and the client side
                    programming models.
                </para>
            </listitem>
        </orderedlist>

        As an extension to the standard JAX-RS Client API, the  Jersey Client API supports a pluggable architecture to enable the
        use of different underlying HTTP client &jersey.client.Connector; implementations. Several such implementations are
        currently provided with Jersey. We have a default client connector using <literal>Http(s)URLConnection</literal> supplied
        with the JDK as well as connector implementations based on Apache HTTP Client, Jetty HTTP client and Grizzly Asynchronous Client.
    </para>

    <section>
        <title>Uniform Interface Constraint</title>

        <para>
            The uniform interface constraint bounds the architecture of RESTful Web services so that a client, such
            as a browser, can utilize the same interface to communicate with any service. This is a very powerful concept
            in software engineering that makes Web-based search engines and service mash-ups possible. It induces properties
            such as:

            <orderedlist>
                <listitem>
                    <para>simplicity, the architecture is easier to understand and maintain; and</para>
                </listitem>
                <listitem>
                    <para>
                        evolvability or loose coupling, clients and services can evolve over time perhaps in new and
                        unexpected ways, while retaining backwards compatibility.
                    </para>
                </listitem>
            </orderedlist>

            Further constraints are required:

            <orderedlist>
                <listitem>
                    <para>every resource is identified by a URI;</para>
                </listitem>
                <listitem>
                    <para>
                        a client interacts with the resource via HTTP requests and responses using a fixed set of
                        HTTP methods;
                    </para>
                </listitem>
                <listitem>
                    <para>one or more representations can be returned and are identified by media types; and</para>
                </listitem>
                <listitem>
                    <para>the contents of which can link to further resources.</para>
                </listitem>
            </orderedlist>

            The above process repeated over and again should be familiar to anyone who has used a browser to fill
            in HTML forms and follow links. That same process is applicable to non-browser based clients.
        </para>

        <para>
            Many existing Java-based client APIs, such as the Apache HTTP client API or &lit.jdk6.HttpUrlConnection;
            supplied with the JDK place too much focus on the Client-Server constraint for the exchanges of request and
            responses rather than a resource, identified by a URI, and the use of a fixed set of HTTP methods.
        </para>
        <para>A resource in the JAX-RS client API is an instance of the Java class
            &jaxrs.client.WebTarget;.
            and encapsulates an URI. The fixed set of HTTP methods can be invoked based on the
            &lit.jaxrs.client.WebTarget;.
            The representations are Java types, instances of which, may contain links that new instances of
            &lit.jaxrs.client.WebTarget; may be created from.
        </para>
    </section>

    <section>
        <title>Ease of use and reusing JAX-RS artifacts</title>

        <para>
            Since a JAX-RS component is represented as an annotated Java type, it makes it easy to configure, pass around and
            inject in ways that are not so intuitive or possible with other client-side APIs.
            The Jersey Client API reuses many aspects of the JAX-RS and the Jersey implementation such as:
            <orderedlist>
                <listitem>
                    <para>
                        URI building using &jaxrs.core.UriBuilder; and &jersey.common.uri.UriTemplate; to safely build URIs;
                    </para>
                </listitem>
                <listitem>
                    <para>Built-in support for Java types of representations such as
                        <literal>byte[]</literal>,
                        <literal>String</literal>,
                        <literal>Number</literal>,
                        <literal>Boolean</literal>,
                        <literal>Character</literal>,
                        <literal>InputStream</literal>,
                        <literal>java.io.Reader</literal>,
                        <literal>File</literal>,
                        <literal>DataSource</literal>,
                        JAXB beans as well as additional Jersey-specific JSON and &jersey.media.multipart; support.
                    </para>
                </listitem>
                <listitem>
                    <para>Using the fluent builder-style API pattern to make it easier to construct requests.</para>
                </listitem>
            </orderedlist>
            Some APIs, like the Apache HTTP Client or &jdk6.HttpUrlConnection;
            can be rather hard to use and/or require too much code to do something relatively simple, especially when
            the client needs to understand different payload representations.
            This is why the Jersey implementation of JAX-RS Client API provides support for wrapping &lit.jdk6.HttpUrlConnection;
            and the Apache HTTP client. Thus it is possible to get the benefits of the established JAX-RS implementations and
            features while getting the ease of use benefit of the simple design of the JAX-RS client API.
            For example, with a low-level HTTP client library, sending a POST request with a bunch of typed HTML form parameters
            and receiving a response de-serialized into a JAXB bean is not straightforward at all. With the new JAX-RS Client API
            supported by Jersey this task is very easy:

            <example xml:id="client.ex.formpost">
                <title>POST request with form parameters</title>
                <programlisting language="java" linenumbering="numbered">Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://localhost:9998").path("resource");

Form form = new Form();
form.param("x", "foo");
form.param("y", "bar");

MyJAXBBean bean =
target.request(MediaType.APPLICATION_JSON_TYPE)
    .post(Entity.entity(form,MediaType.APPLICATION_FORM_URLENCODED_TYPE),
        MyJAXBBean.class);</programlisting>
            </example>

            In the <xref linkend="client.ex.formpost"/> a new &lit.jaxrs.client.WebTarget; instance is created using a new
            &jaxrs.client.Client; instance first, next a &jaxrs.core.Form; instance is created with two form parameters.
            Once ready, the &lit.jaxrs.core.Form; instance is &lit.http.POST;ed to the target resource.
            First, the acceptable media type is specified in the <literal>request(...)</literal> method. Then in the
            <literal>post(...)</literal> method, a call to a static method on JAX-RS &jaxrs.client.Entity; is made to construct
            the request entity instance and attach the proper content media type to the form entity that is being sent. The
            second parameter in the <literal>post(...)</literal> method specifies the Java type of the response entity that should
            be returned from the method in case of a successful response. In this case an instance of JAXB bean is requested to
            be returned on success. The Jersey client API takes care of selecting the proper &jaxrs.ext.MessageBodyWriter; for
            the serialization of the &lit.jaxrs.core.Form; instance, invoking the &lit.http.POST; request and producing and
            de-serialization of the response message payload into an instance of a JAXB bean using a proper
            &jaxrs.ext.MessageBodyReader;.
        </para>
        <para>If the code above had to be written using &lit.jdk6.HttpUrlConnection;, the developer would have to write custom
            code to serialize the form data that are sent within the POST request and de-serialize the response input stream
            into a JAXB bean. Additionally, more code would have to be written to make it easy to reuse the logic when
            communicating with the same resource <literal>“http://localhost:8080/resource”</literal> that is represented by
            the JAX-RS &lit.jaxrs.client.WebTarget; instance in our example.
        </para>
    </section>

    <section>
        <title>Overview of the Client API</title>

        <section>
            <title>Getting started with the client API</title>

            <para>
                Refer to the <link linkend="dependencies">dependencies</link> for details on the dependencies when using the
                Jersey JAX-RS Client support.
            </para>
            <para>
                You may also want to use a custom &jersey.client.Connector; implementation. In such case you would need to include
                additional dependencies on the module(s) containing the custom client connector that you want to use. See section
                <link xlink:href="#connectors">"Configuring custom Connectors"</link> about how to use and configure a custom
                Jersey client transport &lit.jersey.client.Connector;.</para>
        </section>

        <section>
            <title>
                Creating and configuring a Client instance
            </title>

            <para>
                JAX-RS Client API is designed to allow fluent programming model. This means, a construction of a
                &lit.jaxrs.client.Client; instance, from which a &lit.jaxrs.client.WebTarget; is created, from which a
                request &jaxrs.client.Invocation; is built and invoked can be chained in a single "flow" of invocations.
                The individual steps of the flow will be shown in the following sections.
                To utilize the client API it is first necessary to build an instance of a
                &jaxrs.client.Client; using one of the static &jaxrs.client.ClientBuilder; factory methods. Here's the most
                simple example:

                <programlisting language="java">Client client = ClientBuilder.newClient();</programlisting>

                The &lit.jaxrs.client.ClientBuilder; is a JAX-RS API used to create new instances of &lit.jaxrs.client.Client;.
                In a slightly more advanced scenarios, &lit.jaxrs.client.ClientBuilder; can be used to configure additional
                client instance properties, such as a SSL transport settings, if needed (see <xref linkend="ssl" />
                below).
            </para>
            <para>
                A &lit.jaxrs.client.Client; instance can be configured during creation by passing a &jersey.client.ClientConfig;
                to the <literal>newClient(Configurable)</literal> &lit.jaxrs.client.ClientBuilder; factory method.
                &jersey.client.ClientConfig; implements &jaxrs.core.Configurable; and therefore it offers methods to register
                providers (e.g. features or individual entity providers, filters or interceptors) and setup properties.
                The following code shows a registration of custom client filters:

                <programlisting language="java" linenumbering="numbered">ClientConfig clientConfig = new ClientConfig();
clientConfig.register(MyClientResponseFilter.class);
clientConfig.register(new AnotherClientFilter());
Client client = ClientBuilder.newClient(clientConfig);</programlisting>

                In the example, filters are registered using the <literal>ClientConfig.register(...)</literal> method. There are
                multiple overloaded versions of the method that support registration of feature and provider classes or instances.
                Once a &lit.jersey.client.ClientConfig; instance is configured, it can be passed to the
                &lit.jaxrs.client.ClientBuilder; to create a pre-configured &lit.jaxrs.client.Client; instance.
            </para>
            <para>
                Note that the Jersey &lit.jersey.client.ClientConfig; supports the fluent API model of &jaxrs.core.Configurable;.
                With that the code that configures a new client instance can be also written using a more compact style as shown
                below.

                <programlisting language="java" linenumbering="numbered">
Client client = ClientBuilder.newClient(new ClientConfig()
        .register(MyClientResponseFilter.class)
        .register(new AnotherClientFilter());</programlisting>

                The ability to leverage this compact pattern is inherent to all JAX-RS and Jersey Client API components.
            </para>
            <para>
                Since &lit.jaxrs.client.Client; implements &jaxrs.core.Configurable; interface too, it can be configured further
                even after it has been created. Important is to mention that any configuration change done on a
                &lit.jaxrs.client.Client; instance will not influence the &jersey.client.ClientConfig; instance that was used to
                provide the initial &lit.jaxrs.client.Client; instance configuration at the instance creation time.
                The next piece of code shows a configuration of an existing &lit.jaxrs.client.Client; instance.

                <programlisting
                        language="java" linenumbering="numbered">client.register(ThirdClientFilter.class);</programlisting>

                Similarly to earlier examples, since <literal>Client.register(...)</literal> method supports the fluent API style,
                multiple client instance configuration calls can be chained:
                <programlisting language="java" linenumbering="numbered">client.register(FilterA.class)
      .register(new FilterB())
      .property("my-property", true);</programlisting>

                To get the current configuration of the &lit.jaxrs.client.Client; instance a <literal>getConfiguration()</literal>
                method can be used.

                    <programlisting language="java" linenumbering="numbered">ClientConfig clientConfig = new ClientConfig();
clientConfig.register(MyClientResponseFilter.class);
clientConfig.register(new AnotherClientFilter());
Client client = ClientBuilder.newClient(clientConfig);
client.register(ThirdClientFilter.class);
Configuration newConfiguration = client.getConfiguration();</programlisting>

                In the code, an additional <literal>MyClientResponseFilter</literal> class and
                <literal>AnotherClientFilter</literal> instance are registered in the <literal>clientConfig</literal>. The
                <literal>clientConfig</literal> is then used to construct a new &lit.jaxrs.client.Client; instance. The
                <literal>ThirdClientFilter</literal> is added separately to the constructed &lit.jaxrs.client.Client; instance.
                This does not influence the configuration represented by the original <literal>clientConfig</literal>.
                In the last step a <literal>newConfiguration</literal> is retrieved from the <literal>client</literal>. This
                configuration contains all three registered filters while the original <literal>clientConfig</literal> instance
                still contains only two filters. Unlike <literal>clientConfig</literal> created separately, the
                <literal>newConfiguration</literal> retrieved from the <literal>client</literal> instance represents a live
                client configuration view. Any additional configuration changes made to the <literal>client</literal> instance
                are also reflected in the <literal>newConfiguration</literal>. So, <literal>newConfiguration</literal> is really
                a view of the <literal>client</literal> configuration and not a configuration state copy. These principles are
                important in the client API and will be used in the following sections too. For example, you can construct a
                common base configuration for all clients (in our case it would be <literal>clientConfig</literal>) and
                then reuse this common configuration instance to configure multiple <literal>client</literal> instances that can
                be further specialized. Similarly, you can use an existing <literal>client</literal> instance configuration to
                configure another client instance without having to worry about any side effects in the original
                <literal>client</literal> instance.
            </para>
        </section>

        <section>
            <title>Targeting a web resource</title>
            <para>
                Once you have a &lit.jaxrs.client.Client; instance you can create a &lit.jaxrs.client.WebTarget; from it.

                <programlisting linenumbering="numbered"
                                language="java">WebTarget webTarget = client.target("http://example.com/rest");</programlisting>

                A &lit.jaxrs.client.Client; contains several <literal>target(...)</literal> methods that allow for creation of
                &lit.jaxrs.client.WebTarget; instance. In this case we're using <literal>target(String uri)</literal> version.
                The <literal>uri</literal> passed to the method as a <literal>String</literal> is the URI of the targeted
                web resource. In more complex scenarios it could be the context root URI of the whole RESTful application, from
                which &lit.jaxrs.client.WebTarget; instances representing individual resource targets can be derived and
                individually configured. This is possible, because JAX-RS &lit.jaxrs.client.WebTarget; also implements
                &lit.jaxrs.core.Configurable;:

                <programlisting
                        language="java" linenumbering="numbered">WebTarget webTarget = client.target("http://example.com/rest");
webTarget.register(FilterForExampleCom.class);</programlisting>

                The configuration principles used in JAX-RS client API apply to &lit.jaxrs.client.WebTarget; as well. Each
                &lit.jaxrs.client.WebTarget; instance inherits a configuration from its parent (either a client or another
                web target) and can be further custom-configured without affecting the configuration of the parent component.
                In this case, the <literal>FilterForExampleCom</literal> will be registered only in the
                <literal>webTarget</literal> and not in <literal>client</literal>. So, the <literal>client</literal>
                can still be used to create new &lit.jaxrs.client.WebTarget; instances pointing at other URIs using just the
                common client configuration, which <literal>FilterForExampleCom</literal> filter is not part of.
            </para>
        </section>

        <section>
            <title>Identifying resource on WebTarget</title>
            <para>
                Let's assume we have a <literal>webTarget</literal> pointing at <literal>"http://example.com/rest"</literal> URI
                that represents a context root of a RESTful application and there is a resource exposed on the URI
                <literal>"http://example.com/rest/resource"</literal>. As already mentioned, a &lit.jaxrs.client.WebTarget;
                instance can be used to derive other web targets. Use the following code to define a path to the resource.
                <programlisting linenumbering="numbered"
                                language="java">WebTarget resourceWebTarget = webTarget.path("resource");</programlisting>

                The <literal>resourceWebTarget</literal> now points to the resource on URI
                <literal>"http://example.com/rest/resource"</literal>. Again if we configure the
                <literal>resourceWebTarget</literal> with a filter specific to the <literal>resource</literal>,
                it will not influence the original <literal>webTarget</literal> instance. However, the filter
                <literal>FilterForExampleCom</literal> registration will still be inherited by the
                <literal>resourceWebTarget</literal> as it has been created from <literal>webTarget</literal>. This mechanism
                allows you to share the common configuration of related resources (typically hosted under the same URI root,
                in our case represented by the <literal>webTarget</literal> instance), while allowing for further configuration
                specialization based on the specific requirements of each individual resource. The same configuration principles
                of inheritance (to allow common config propagation) and decoupling (to allow individual config customization)
                applies to all components in JAX-RS Client API discussed below.
            </para>
            <para>
                Let's say there is a sub resource on the path <literal>"http://example.com/rest/resource/helloworld"</literal>.
                You can derive a &lit.jaxrs.client.WebTarget; for this resource simply by:

                <programlisting linenumbering="numbered"
                                language="java">WebTarget helloworldWebTarget = resourceWebTarget.path("helloworld");</programlisting>

                Let's assume that the <literal>helloworld</literal> resource accepts a query param for <literal>GET</literal>
                requests which defines the greeting message. The next code snippet shows a code that creates
                a new &lit.jaxrs.client.WebTarget; with the query param defined.

                <programlisting language="java" linenumbering="numbered">WebTarget helloworldWebTargetWithQueryParam =
        helloworldWebTarget.queryParam("greeting", "Hi World!");</programlisting>

                Please note that apart from methods that can derive new &lit.jaxrs.client.WebTarget; instance based on a URI path
                or query parameters, the JAX-RS &lit.jaxrs.client.WebTarget; API contains also methods for working with matrix
                parameters too.
            </para>
        </section>

        <section>
            <title>Invoking a HTTP request</title>
            <para>
                Let's now focus on invoking a &lit.http.GET; HTTP request on the created web targets. To start building a new
                HTTP request invocation, we need to create a new &jaxrs.client.Invocation.Builder;.

                <programlisting language="java" linenumbering="numbered">Invocation.Builder invocationBuilder =
        helloworldWebTargetWithQueryParam.request(MediaType.TEXT_PLAIN_TYPE);
invocationBuilder.header("some-header", "true");</programlisting>

                A new invocation builder instance is created using one of the <literal>request(...)</literal> methods that are
                available on &lit.jaxrs.client.WebTarget;. A couple of these methods accept parameters that let you define
                the media type of the representation requested to be returned from the resource. Here we are saying that we
                request a <literal>"text/plain"</literal> type. This tells Jersey to add a <literal>Accept: text/plain</literal>
                HTTP header to our request.
            </para>
            <para>
                The <literal>invocationBuilder</literal> is used to setup request specific parameters. Here we can setup headers
                for the request or for example cookie parameters. In our example we set up a <literal>"some-header"</literal>
                header to value &lit.true;.
            </para>
            <para>
                Once finished with request customizations, it's time to invoke the request. We have two options now.
                We can use the &lit.jaxrs.client.Invocation.Builder; to build a generic &jaxrs.client.Invocation; instance
                that will be invoked some time later. Using &lit.jaxrs.client.Invocation; we will be able to e.g. set additional
                request properties which are properties in a batch of several requests and use the generic JAX-RS
                &lit.jaxrs.client.Invocation; API to invoke the batch of requests without actually knowing all the details
                (such as request HTTP method, configuration etc.). Any properties set on an invocation instance can be read
                during the request processing. For example, in a custom &jaxrs.client.ClientRequestFilter; you can call
                <literal>getProperty()</literal> method on the supplied &jaxrs.client.ClientRequestContext; to read a request
                property. Note that these request properties are different from the configuration properties set on
                &lit.jaxrs.core.Configurable;. As mentioned earlier, an &lit.jaxrs.client.Invocation; instance provides generic
                invocation API to invoke the HTTP request it represents either synchronously or asynchronously. See
                the <xref linkend="async" /> for more information on asynchronous invocations.
            </para>
            <para>
                In case you do not want to do any batch processing on your HTTP request invocations prior to invoking them, there
                is another, more convenient approach that you can use to invoke your requests directly from an
                &lit.jaxrs.client.Invocation.Builder; instance. This approach is demonstrated in the next Java code listing.
                <programlisting language="java"
                                linenumbering="numbered">Response response = invocationBuilder.get();</programlisting>

                While short, the code in the example performs multiple actions. First, it will build the the request from the
                <literal>invocationBuilder</literal>. The URI of request will be
                <literal>http://example.com/rest/resource/helloworld?greeting="Hi%20World!"</literal> and the request will contain
                <literal>some-header: true</literal> and <literal>Accept: text/plain</literal> headers. The request will then pass
                trough all configured request filters ( <literal>AnotherClientFilter</literal>,
                <literal>ThirdClientFilter</literal> and
                <literal>FilterForExampleCom</literal>). Once processed by the filters, the request will be sent to the remote
                resource. Let's say the resource then returns an HTTP 200 message with a plain text response content that contains
                the value sent in the request <literal>greeting</literal> query parameter. Now we can observe the returned
                response:

                <programlisting language="java" linenumbering="numbered">System.out.println(response.getStatus());
System.out.println(response.readEntity(String.class));</programlisting>

                which will produce the following output to the console:

                <screen linenumbering="unnumbered">200
Hi World!</screen>

                As we can see, the request was successfully processed (code 200) and returned an entity (representation) is
                <literal>"Hi World!"</literal>. Note that since we have configured a <literal>MyClientResponseFilter</literal>
                in the resource target, when <literal>response.readEntity(String.class)</literal> gets called, the response
                returned from the remote endpoint is passed through the response filter chain (including the
                <literal>MyClientResponseFilter</literal>) and entity interceptor chain and at last a proper
                &jaxrs.ext.MessageBodyReader; is located to read the response content bytes from the response stream into a
                Java <literal>String</literal> instance. Check <xref linkend="filters-and-interceptors" /> to lear more about
                request and response filters and entity interceptors.
            </para>

            <para>
                Imagine now that you would like to invoke a &lit.http.POST; request but without any query parameters. You would
                just use the <literal>helloworldWebTarget</literal> instance created earlier and call the
                <literal>post()</literal> instead of <literal>get()</literal>.
                <programlisting language="java" linenumbering="numbered">Response postResponse =
        helloworldWebTarget.request(MediaType.TEXT_PLAIN_TYPE)
                .post(Entity.entity("A string entity to be POSTed", MediaType.TEXT_PLAIN));</programlisting>
            </para>
        </section>

        <section>
            <title>Example summary</title>
            <para>
                The following code puts together the pieces used in the earlier examples.

                <example>
                    <title>Using JAX-RS Client API</title>
                    <programlisting language="java" linenumbering="numbered">ClientConfig clientConfig = new ClientConfig();
clientConfig.register(MyClientResponseFilter.class);
clientConfig.register(new AnotherClientFilter());

Client client = ClientBuilder.newClient(clientConfig);
client.register(ThirdClientFilter.class);

WebTarget webTarget = client.target("http://example.com/rest");
webTarget.register(FilterForExampleCom.class);
WebTarget resourceWebTarget = webTarget.path("resource");
WebTarget helloworldWebTarget = resourceWebTarget.path("helloworld");
WebTarget helloworldWebTargetWithQueryParam =
        helloworldWebTarget.queryParam("greeting", "Hi World!");

Invocation.Builder invocationBuilder =
        helloworldWebTargetWithQueryParam.request(MediaType.TEXT_PLAIN_TYPE);
invocationBuilder.header("some-header", "true");

Response response = invocationBuilder.get();
System.out.println(response.getStatus());
System.out.println(response.readEntity(String.class));</programlisting>
                </example>

                Now we can try to leverage the fluent API style to write this code in a more compact way.

                <example>
                    <title>Using JAX-RS Client API fluently</title>
                    <programlisting language="java" linenumbering="numbered">Client client = ClientBuilder.newClient(new ClientConfig()
            .register(MyClientResponseFilter.class)
            .register(new AnotherClientFilter()));

String entity = client.target("http://example.com/rest")
            .register(FilterForExampleCom.class)
            .path("resource/helloworld")
            .queryParam("greeting", "Hi World!")
            .request(MediaType.TEXT_PLAIN_TYPE)
            .header("some-header", "true")
            .get(String.class);</programlisting>
                </example>

                The code above does the same thing except it skips the generic &lit.jaxrs.core.Response; processing and directly
                requests an entity in the last <literal>get(String.class)</literal> method call. This shortcut method let's you
                specify that (in case the response was returned successfully with a HTTP 2xx status code) the response entity
                should be returned as Java <literal>String</literal> type. This compact example demonstrates another advantage of
                the JAX-RS client API. The fluency of JAX-RS Client API is convenient especially with simple use cases.
                Here is another a very simple GET request returning a String representation (entity):

                <programlisting language="java" linenumbering="numbered">String responseEntity = ClientBuilder.newClient()
            .target("http://example.com").path("resource/rest")
                        .request().get(String.class);</programlisting>
            </para>
        </section>
        <section>
            <title>Setting ExecutorService and ScheduledExecutorService</title>
            <para>
                Some client invocations, like asynchronous or reactive, could lead to a need to start a new thread. This is
                being done on provided ExecutorService or ScheduledExecutorService. &lit.jaxrs.client.ClientBuilder; has two
                methods, which can be used to define them: <literal>executorService(ExecutorService)</literal> and
                <literal>scheduledExecutorService(ScheduledExecutorService)</literal>. When specified, all invocations which
                do require running on another thread, should be executed using provided services.
            </para>
            <para>
                Default values do depend on the environment - in Java/Jakarta EE container, it has to be &jee6.jakarta.enterprise.concurrent.ManagedExecutorService;
                and &jee6.jakarta.enterprise.concurrent.ManagedScheduledExecutorService;, for Java SE it would be
                <literal>ForkJoinPool.commonPool</literal> for Executor service and something undefined for Scheduled
                executor service.
            </para>
            <example>
                <title>Setting JAX-RS Client ExecutorService</title>
                <programlisting language="java" linenumbering="numbered">ExecutorService myExecutorService = Executors.newCachedThreadPool();
Client client = ClientBuilder.newBuilder().executorService(myExecutorService).build();</programlisting>
            </example>
        </section>

    </section>

    <section>
        <title>Java instances and types for representations</title>

        <para>
            All the Java types and representations supported by default on the Jersey server side for
            requests and responses are also supported on the client side.
            For example, to process a response entity (or representation) as a stream of bytes use InputStream as follows:

            <programlisting language="java">InputStream in = response.readEntity(InputStream.class);

... // Read from the stream

in.close();
            </programlisting>

            Note that it is important to close the stream after processing so that resources are freed up.
        </para>
        <para>
            To <literal>POST</literal> a file use a <literal>File</literal> instance as follows:

            <programlisting language="java">File f = ...

...

webTarget.request().post(Entity.entity(f, MediaType.TEXT_PLAIN_TYPE));
            </programlisting>
        </para>

        <section>
            <title>Adding support for new representations</title>

            <para>
                The support for new application-defined representations as Java types requires the
                implementation of the same JAX-RS entity provider extension interfaces as for the server side JAX-RS API, namely
                &jaxrs.ext.MessageBodyReader; and &jaxrs.ext.MessageBodyWriter;
                respectively, for request and response entities (or inbound and outbound representations).
            </para>
            <para>
                Classes or implementations of the provider-based interfaces need to be registered as providers within the
                JAX-RS or Jersey Client API components that implement &lit.jaxrs.core.Configurable; contract
                (&lit.jaxrs.client.ClientBuilder;, &lit.jaxrs.client.Client;, &lit.jaxrs.client.WebTarget; or
                &lit.jersey.client.ClientConfig;), as was shown in the earlier sections.
                Some media types are provided in the form of JAX-RS &jaxrs.core.Feature; a concept that allows the extension
                providers to group together multiple different extension providers and/or configuration properties in order
                to simplify the registration and configuration of the provided feature by the end users. For example,
                &jersey.media.MoxyJsonFeature; can be register to enable and configure JSON binding support via MOXy
                library.
            </para>
        </section>
    </section>

    <section>
        <title><anchor xml:id="connectors"/>Client Transport Connectors</title>

        <para>
            By default, the transport layer in Jersey is provided by &lit.jdk6.HttpUrlConnection;. This transport is implemented
            in Jersey via &jersey.client.HttpUrlConnectorProvider; that implements Jersey-specific &jersey.client.Connector; SPI.
            You can implement and/or register your own &lit.jersey.client.Connector; instance to the Jersey
            &lit.jaxrs.client.Client; implementation, that will replace the default &lit.jdk6.HttpUrlConnection;-based
            transport layer. Jersey provides several alternative client transport connector implementations that are ready-to-use.

            <table>
                <title>List of Jersey Connectors</title>
                <tgroup cols='3' align='left' colsep='1' rowsep='1'>
                    <colspec colname="c1"/>
                    <colspec colname="c2"/>
                    <colspec colname="c3"/>
                    <thead>
                        <row>
                            <entry>Transport framework</entry>
                            <entry>Jersey Connector implementation</entry>
                            <entry>Maven dependency</entry>
                        </row>
                    </thead>
                    <tbody>
                        <row>
                            <entry>Grizzly NIO framework</entry>
                            <entry>&jersey.grizzly.GrizzlyConnectorProvider;</entry>
                            <entry><literal>org.glassfish.jersey.connectors:jersey-grizzly-connector</literal></entry>
                        </row>
                        <row>
                            <entry>Apache HTTP client</entry>
                            <entry>&jersey.apache.ApacheConnectorProvider;</entry>
                            <entry><literal>org.glassfish.jersey.connectors:jersey-apache-connector</literal></entry>
                        </row>
                        <row>
                            <entry>Apache 5 HTTP client</entry>
                            <entry>&jersey.apache5.Apache5ConnectorProvider;</entry>
                            <entry><literal>org.glassfish.jersey.connectors:jersey-apache5-connector</literal></entry>
                        </row>
                        <row>
                            <entry>Helidon HTTP client</entry>
                            <entry>&jersey.helidon.HelidonConnectorProvider;</entry>
                            <entry><literal>org.glassfish.jersey.connectors:jersey-helidon-connector</literal></entry>
                        </row>
                        <row>
                            <entry>Jetty HTTP client</entry>
                            <entry>&jersey.jetty.JettyConnectorProvider;</entry>
                            <entry><literal>org.glassfish.jersey.connectors:jersey-jetty-connector</literal></entry>
                        </row>
                        <row>
                            <entry>Netty NIO framework</entry>
                            <entry>&jersey.netty.NettyConnectorProvider;</entry>
                            <entry><literal>org.glassfish.jersey.connectors:jersey-netty-connector</literal></entry>
                        </row>
                        <row>
                            <entry>JDK NIO client</entry>
                            <entry>&jersey.jdk.JdkConnectorProvider;</entry>
                            <entry><literal>org.glassfish.jersey.connectors:jersey-jdk-connector</literal></entry>
                        </row>
                    </tbody>
                </tgroup>
            </table>

            <warning xml:id="connectors.warning" xreflabel="Header modification issue">
                <para>
                    Be aware of using other than default &lit.jersey.client.Connector; implementation.
                    There is an issue handling HTTP headers in
                    &lit.jaxrs.WriterInterceptor; or &lit.jaxrs.ext.MessageBodyWriter;.
                    If you need to change header fields do not use nor
                    &lit.jersey.apache.ApacheConnectorProvider; nor &lit.jersey.grizzly.GrizzlyConnectorProvider;
                    nor &lit.jersey.jetty.JettyConnectorProvider; neither &lit.jersey.netty.NettyConnectorProvider;.
                    The issue for example applies to Jersey <xref linkend="multipart" endterm="multipart.short"/>
                    feature that also modifies HTTP headers.
                </para>
                <para>
                    On the other hand, in the default transport connector, there are some restrictions on the headers, that
                    can be sent in the default configuration.
                    <literal>HttpUrlConnectorProvider</literal> uses &lit.jdk6.HttpUrlConnection; as an underlying connection
                    implementation. This JDK class by default restricts the use of following headers:
                    <itemizedlist>
                        <listitem>&lit.http.header.AccessControlRequestHeaders;</listitem>
                        <listitem>&lit.http.header.AccessControlRequestMethod;</listitem>
                        <listitem>&lit.http.header.Connection; (with one exception - &lit.http.header.Connection; header with
                            value <literal>Closed</literal> is allowed by default)</listitem>
                        <listitem>&lit.http.header.ContentLength;</listitem>
                        <listitem>&lit.http.header.ContentTransferEncoding;</listitem>
                        <listitem>&lit.http.header.Host;</listitem>
                        <listitem>&lit.http.header.Keep-Alive;</listitem>
                        <listitem>&lit.http.header.Origin;</listitem>
                        <listitem>&lit.http.header.Trailer;</listitem>
                        <listitem>&lit.http.header.Transfer-Encoding;</listitem>
                        <listitem>&lit.http.header.Upgrade;</listitem>
                        <listitem>&lit.http.header.Via;</listitem>
                        <listitem>all the headers starting with &lit.http.header.Sec.prefix;</listitem>
                    </itemizedlist>
                    The underlying connection can be configured to permit all headers to be sent,
                    however this behaviour can be changed only by setting the system property
                    <literal>sun.net.http.allowRestrictedHeaders</literal>.
                    <example>
                        <title>Sending restricted headers with <literal>HttpUrlConnector</literal></title>
                        <programlisting language="java" linenumbering="numbered">
                            Client client = ClientBuilder.newClient();
                            System.setProperty("sun.net.http.allowRestrictedHeaders", "true");

                            Response response = client.target(yourUri).path(yourPath).request().
                            header("Origin", "http://example.com").
                            header("Access-Control-Request-Method", "POST").
                            get();
                        </programlisting>
                    </example>
                </para>
                <para>
                    Note, that internally the &lit.jdk6.HttpUrlConnection; instances are pooled, so (un)setting the
                    property after already creating a target typically does not have any effect.
                    The property influences all the connections <emphasis>created</emphasis> after the property has been
                    (un)set, but there is no guarantee, that your request will use a connection
                    created after the property change.
                </para>
                <para>
                    In a simple environment, setting the property before creating the first target is sufficient, but in complex
                    environments (such as application servers), where some poolable connections might exist before your
                    application even bootstraps, this approach is not 100% reliable and we recommend using a different client
                    transport connector, such as Apache Connector.
                    These limitations have to be considered especially when invoking <emphasis>CORS</emphasis> (Cross Origin
                    Resource Sharing) requests.
                </para>
            </warning>
        </para>
        <para>
            As indicated earlier, &jersey.client.Connector; and &jersey.client.ConnectorProvider; contracts are Jersey-specific
            extension APIs that would only work with Jersey and as such are not part of JAX-RS. Following example shows how to
            setup the custom Grizzly Asynchronous HTTP Client based &lit.jersey.client.ConnectorProvider; in a Jersey client
            instance:

            <programlisting language="java" linenumbering="numbered">ClientConfig clientConfig = new ClientConfig();
clientConfig.connectorProvider(new GrizzlyConnectorProvider());
Client client = ClientBuilder.newClient(clientConfig);</programlisting>

            &lit.jaxrs.client.Client; accepts as a constructor argument a &lit.jaxrs.core.Configurable; instance. Jersey
            implementation of the &lit.jaxrs.core.Configurable; provider for the client is &lit.jersey.client.ClientConfig;.
            By using the Jersey &lit.jersey.client.ClientConfig; you can configure the custom
            &lit.jersey.client.ConnectorProvider;
            into the &lit.jersey.client.ClientConfig;. The &lit.jersey.grizzly.GrizzlyConnectorProvider; is used as a custom
            connector provider in the example above. Please note that the connector provider cannot be registered as a provider
            using &lit.jaxrs.core.Configurable;<literal>.register(...)</literal>. Also, please note that in this API has changed
            since Jersey 2.5, where the &lit.jersey.client.ConnectorProvider; SPI has been introduced in order to decouple client
            initialization from the connector instantiation. Starting with Jersey 2.5 it is therefore not possible to directly
            register &lit.jersey.client.Connector; instances in the Jersey &jersey.client.ClientConfig;. The new
            &lit.jersey.client.ConnectorProvider; SPI must be used instead to configure a custom client-side transport connector.
        </para>
        <para>
            A &jersey.client.ConnectorProvider; can also be set by a property on a &lit.jaxrs.client.ClientBuilder; starting with
            Jersey 2.40. The following example shows how to setup the custom Grizzly Asynchronous HTTP Client based
            &lit.jersey.client.ConnectorProvider; in a Jersey client instance:
            <programlisting language="java" linenumbering="numbered">Client client = ClientBuilder.newBuilder()
    .property(ClientProperties.CONNECTOR_PROVIDER, "org.glassfish.jersey.grizzly.connector.GrizzlyConnectorProvider")
    .build();</programlisting>

            For more information about the property see <xref linkend="appendix-properties"/>.
        </para>
        <section>
            <title>Client Connectors Properties</title>
            <para>
                For each &jersey.client.Connector; a property file defining properties tweaking the actual
                &lit.jersey.client.Connector; exists. There are &jersey.client.ClientProperties; properties that apply to the
                default &jersey.client.HttpUrlConnectorProvider;. Many of the properties are also understood by
                various <literal>Connectors</literal>. Each of the &lit.jersey.client.ConnectorProvider;
                defines properties that apply to it.
            </para>
            <para>
                Moreover, each &jersey.client.Connector; supports a list of properties that are unique for the
                &jersey.client.Connector;. The list of the client connector properties can be found in the
                <xref linkend="appendix-properties"/>.
            </para>
        </section>
        <section>
            <title>Applying additional settings to Connectors</title>
            <para>
                It is not possible to provide all the settings the underlying HTTP Clients support. For Apache HTTP Client, and
                for Jetty HTTP Client, it is possible to access directly the HTTP Client classes and invoke setter methods there.
            </para>
            <section>
                <title>Apache HttpClientBuilder Configuration</title>
                <para>
                    For Apache Connector, an &jersey.apache.ApacheHttpClientBuilderConfigurator; SPI allows for invoking methods
                    of <literal>org.apache.http.impl.client.HttpClientBuilder</literal>, such as <literal>setDefaultCredentialsProvider</literal>:
                    <programlisting language="java" linenumbering="numbered">
                        org.apache.http.client.CredentialsProvider credentialsProvider = new org.apache.http.impl.client.BasicCredentialsProvider();
                        credentialsProvider.setCredentials(
                            org.apache.http.auth.AuthScope.ANY,
                            new org.apache.http.auth.UsernamePasswordCredentials("name", "password")
                        );
                        ApacheHttpClientBuilderConfigurator apacheHttpClientBuilderConfigurator = (httpClientBuilder) -> {
                            return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                        };

                        ClientConfig cc = new ClientConfig();
                        cc.register(apacheHttpClientBuilderConfigurator);
                        cc.connectorProvider(new ApacheConnectorProvider());
                        Client client = ClientBuilder.newClient(cc);
                        ...
                    </programlisting>
                </para>
            </section>
            <section>
                <title>Apache 5 HttpClientBuilder Configuration</title>
                <para>
                    For Apache 5 Connector, an &jersey.apache5.Apache5HttpClientBuilderConfigurator; SPI allows for invoking methods
                    of <literal>org.apache.hc.client5.http.impl.classic.HttpClientBuilder</literal>, such as <literal>setDefaultCredentialsProvider</literal>:
                    <programlisting language="java" linenumbering="numbered">
                        org.apache.hc.client5.http.auth.CredentialsStore credentialsProvider = new org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider();
                        credentialsProvider.setCredentials(
                            new org.apache.hc.client5.http.auth.AuthScope("localhost", getPort()),
                            new org.apache.hc.client5.http.auth.UsernamePasswordCredentials("name", "password".toCharArray())
                        );
                        Apache5HttpClientBuilderConfigurator apache5HttpClientBuilderConfigurator = (httpClientBuilder) -> {
                            return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                        };

                        ClientConfig cc = new ClientConfig();
                        cc.register(apache5HttpClientBuilderConfigurator);
                        cc.connectorProvider(new Apache5ConnectorProvider());
                        Client client = ClientBuilder.newClient(cc);
                        ...
                    </programlisting>
                </para>
            </section>
            <section>
                <title>Jetty HttpClient Configuration</title>
                <para>
                    For Jetty Connector, an &jersey.jetty.JettyHttpClientSupplier; SPI allows for providing a configured instance
                    of <literal>org.eclipse.jetty.client.HttpClient</literal>:
                    <programlisting language="java" linenumbering="numbered">
                        HttpClient httpClient = new HttpClient(...);
                        ClientConfig clientConfig = new ClientConfig()
                            .connectorProvider(new JettyConnectorProvider())
                            .register(new JettyHttpClientSupplier(httpClient));
                        Client client = ClientBuilder.newClient(clientConfig);
                        ...
                    </programlisting>
                </para>
            </section>
        </section>
    </section>

    <section>
        <title>Using client request and response filters</title>

        <para>
            Filtering requests and responses can provide useful lower-level concept focused on a certain independent aspect or
            domain that is decoupled from the application layer of building and sending requests, and processing responses.
            Filters can read/modify the request URI, headers and entity or read/modify the response status, headers and entity.
        </para>
        <para>
            Jersey contains the following useful client-side filters (and features registering filters)
            that you may want to use in your applications:

            <simplelist>
                <member>&jersey.client.CsrfProtectionFilter;: Cross-site request forgery protection filter (adds
                    <literal>X-Requested-By</literal> to each state changing request).</member>
                <member>&jersey.client.EncodingFeature;: Feature that registers encoding filter which use registered
                    &jersey.common.spi.ContentEncoder;s to encode and decode the communication. The encoding/decoding is performed
                    in interceptor (you don't need to register this interceptor). Check the javadoc of the
                    &jersey.client.EncodingFeature; in order to use it.</member>
                <member>&jersey.client.HttpAuthenticationFeature;: HTTP Authentication Feature
                    (see <link xlink:href="#authentication">authentication</link>
                    below).</member>
            </simplelist>

            Note that these features are provided by Jersey, but since they use and implement JAX-RS API, the features should
            be portable and run in any JAX-RS implementation, not just Jersey. See <xref linkend="filters-and-interceptors" />
            chapter for more information on filters and interceptors.
        </para>
    </section>

    <section>
        <title>Closing connections</title>

        <para>
            The underlying connections are opened for each request
            and closed after the response is received and entity is processed (entity is read). See the
            following example:
        </para>
        <example>
            <title>Closing connections</title>
            <programlisting language="java" linenumbering="numbered">final WebTarget target = ... some web target
Response response = target.path("resource").request().get();
System.out.println("Connection is still open.");
System.out.println("string response: " + response.readEntity(String.class));
System.out.println("Now the connection is closed.");</programlisting>
            </example>
        <para>
            If you don't read the entity, then you need to close the response manually by
            <literal>response.close()</literal>. Also if the entity is read into an &jdk6.InputStream;
            (by <literal>response.readEntity(InputStream.class)</literal>), the connection stays open until
            you finish reading from the &lit.jdk6.InputStream;. In that case, the InputStream
            or the Response should be closed manually at the end of reading from InputStream.
        </para>
    </section>

    <section>
        <title>Injections into client providers</title>

        <para>
            In some cases you might need to inject some custom types into your client provider instance. JAX-RS
            types do not need to be injected as they are passed as arguments into API methods.
            Injections into client providers (filters, interceptor) are possible as long as the provider is
            registered as a class. If the provider is registered as an instance then runtime will not inject
            the provider. The reason is that this provider instance might be registered into multiple client
            configurations. For example one instance of &jaxrs.client.ClientRequestFilter; can be registered
            to two &jaxrs.client.Client;s.
        </para>
        <para>
            To solve injection of a custom type into a client provider instance
            use &jersey.client.InjectionManagerClientProvider; to
            extract &hk2.ServiceLocator; which can return the required injection. The following example shows how to utilize
            &lit.jersey.client.InjectionManagerClientProvider;:
        </para>
        <example>
            <title>InjectionManagerClientProvider example</title>
            <programlisting language="java" linenumbering="numbered">public static class MyRequestFilter implements ClientRequestFilter {
    // this injection does not work as filter is registered as an instance:
    // @Inject
    // private MyInjectedService service;

    @Override
    public void filter(ClientRequestContext requestContext) throws IOException {
        // use InjectionManagerClientProvider to extract InjectionManager from request
        final InjectionManager injectionManager = InjectionManagerClientProvider.getInjectionManager(requestContext);

        // and ask for MyInjectedService:
        final MyInjectedService service = injectionManager.getInstance(MyInjectedService.class);

        final String name = service.getName();
        ...
    }
}</programlisting>
        </example>
        <para>
            For more information see javadoc of &jersey.client.InjectionManagerClientProvider;
            (and javadoc of &lit.jersey.common.InjectionManagerProvider; which supports common JAX-RS components).
        </para>
    </section>

    <section>
        <title>Securing a Client</title>
        <para>
            This section describes how to setup SSL configuration on Jersey client (using JAX-RS API). The SSL configuration is
            setup in &jaxrs.client.ClientBuilder;. The client builder contains methods for definition of &jdk6.KeyStore;,
            &jdk6.TrustStore; or entire &jdk6.SslContext;. See the following example:

            <programlisting language="java" linenumbering="numbered">SSLContext ssl = ... your configured SSL context;
Client client = ClientBuilder.newBuilder().sslContext(ssl).build();
Response response = client.target("https://example.com/resource").request().get();</programlisting>

            The example above shows how to setup a custom &lit.jdk6.SslContext; to the &lit.jaxrs.client.ClientBuilder;.
            Creating a &lit.jdk6.SslContext; can be more difficult as you might need to init instance properly with the protocol,
            &lit.jdk6.KeyStore;, &lit.jdk6.TrustStore;, etc. Jersey offers a utility &jersey.common.SslConfigurator; class that
            can be used to setup the &lit.jdk6.SslContext;. The &lit.jersey.common.SslConfigurator; can be configured based on
            standardized system properties for SSL configuration, so for example you can configure the &lit.jdk6.KeyStore; file
            name using a environment variable <literal>javax.net.ssl.keyStore</literal> and &lit.jersey.common.SslConfigurator;
            will use such a variable to setup the &lit.jdk6.SslContext;. See javadoc of &jersey.common.SslConfigurator; for more
            details. The following code shows how a &lit.jersey.common.SslConfigurator; can be used to create a custom SSL
            context.

            <programlisting language="java" linenumbering="numbered">SslConfigurator sslConfig = SslConfigurator.newInstance()
        .trustStoreFile("./truststore_client")
        .trustStorePassword("secret-password-for-truststore")
        .keyStoreFile("./keystore_client")
        .keyPassword("secret-password-for-keystore");

SSLContext sslContext = sslConfig.createSSLContext();
Client client = ClientBuilder.newBuilder().sslContext(sslContext).build();</programlisting>
        </para>

        <para>
            Note that you can also setup &lit.jdk6.KeyStore; and &lit.jdk6.TrustStore; directly on a
            &lit.jaxrs.client.ClientBuilder; instance without wrapping them into the &lit.jdk6.SslContext;. However, if you setup
            a &lit.jdk6.SslContext; it will override any previously defined &lit.jdk6.KeyStore; and &lit.jdk6.TrustStore;
            settings.
            &lit.jaxrs.client.ClientBuilder; also offers a method for defining a custom &jdk6.HostnameVerifier; implementation.
            &lit.jdk6.HostnameVerifier; implementations are invoked when default host URL verification fails.
        </para>

        <important>
            <para>
                A behaviour of &jdk6.HostnameVerifier; is dependent on an http client implementation.
                &lit.jersey.client.HttpUrlConnectorProvider; and &lit.jersey.apache.ApacheConnectorProvider; work properly, that means that after
                the unsuccessful URL verification &lit.jdk6.HostnameVerifier; is called and by means of it is possible to
                revalidate URL using a custom implementation of &lit.jdk6.HostnameVerifier; and go on in a handshake processing.
                &lit.jersey.jetty.JettyConnectorProvider; and &lit.jersey.grizzly.GrizzlyConnectorProvider; provide only host URL verification
                and throw a &lit.jdk6.CertificateException; without any possibility to use custom &lit.jdk6.HostnameVerifier;.
                Moreover, in case of &lit.jersey.jetty.JettyConnectorProvider; there is a property
                &jersey.jetty.JettyClientProperties.ENABLE_SSL_HOSTNAME_VERIFICATION; to disable an entire host URL verification
                mechanism in a handshake.
            </para>
        </important>

        <important>
            <para>
                Note that to utilize HTTP with SSL it is necessary to utilize the <literal>“https”</literal> scheme.
            </para>
        </important>

        <para>
            Currently the default connector provider &jersey.client.HttpUrlConnectorProvider; provides connectors based on
            &lit.jdk6.HttpUrlConnection; which implement support for SSL defined by JAX-RS configuration discussed in this
            example.
        </para>

        <section>
            <title><anchor xml:id="authentication"/>Http Authentication Support</title>
            <para>Jersey supports Basic and Digest HTTP Authentication.</para>
            <important>
                <para>
                    In version of Jersey 3.x both authentication methods are provided by single &lit.jaxrs.core.Feature;
                    &jersey.client.HttpAuthenticationFeature;.
                    For migration of older applications: <literal>org.glassfish.jersey.client.filter.HttpBasicAuthFilter</literal>
                    and <literal>org.glassfish.jersey.client.filter.HttpDigestAuthFilter</literal> shall be replaced by
                    those two authentication methods.
                </para>
            </important>

            <para>
                In order to enable http authentication support in Jersey client register
                the &jersey.client.HttpAuthenticationFeature;. This feature can provide both authentication methods, digest
                and basic. Feature can work in the following modes:
            </para>
            <itemizedlist>
                <listitem>
                    <para>
                        <emphasis>BASIC:</emphasis> Basic preemptive authentication. In preemptive mode the authentication information
                          is send always with each HTTP request. This mode is more usual than the following non-preemptive mode
                          (if you require BASIC authentication you will probably use this preemptive mode). This mode must
                          be combined with usage of SSL/TLS as the password is send only BASE64 encoded.
                    </para>
                </listitem>
                <listitem>
                    <para>
                        <emphasis>BASIC NON-PREEMPTIVE:</emphasis>Basic non-preemptive authentication. In non-preemptive mode the
                          authentication information is added only when server refuses the request with <literal>401</literal> status code and
                          then the request is repeated with authentication information. This mode has negative impact on the performance.
                          The advantage is that it does not send credentials when they are not needed. This mode must
                          be combined with usage of SSL/TLS as the password is send only BASE64 encoded.
                    </para>
                </listitem>
                <listitem>
                    <para>
                        <emphasis>DIGEST:</emphasis> Http digest authentication. Does not require usage of SSL/TLS.
                    </para>
                </listitem>
                <listitem>
                    <para>
                        <emphasis>UNIVERSAL:</emphasis> Combination of basic and digest authentication. The feature works in non-preemptive
                          mode which means that it sends requests without authentication information. If <literal>401</literal> status
                          code is returned, the request is repeated and an appropriate authentication is used based on the
                          authentication requested in the response (defined in <literal>WWW-Authenticate</literal> HTTP header). The feature
                          remembers which authentication requests were successful for given URI and next time tries to preemptively
                          authenticate against this URI with latest successful authentication method.
                    </para>
                </listitem>
            </itemizedlist>


            <para>
                To initialize the feature use static methods and builder of this feature. Example of building the feature in
                 Basic authentication mode:
                <programlisting language="java" linenumbering="numbered">HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("user", "superSecretPassword");</programlisting>
            </para>
            <para>
                Example of building the feature in basic non-preemptive mode:
                <programlisting language="java" linenumbering="numbered">HttpAuthenticationFeature feature = HttpAuthenticationFeature.basicBuilder()
    .nonPreemptive().credentials("user", "superSecretPassword").build();</programlisting>
            </para>
            <para>
                You can also build the feature without any default credentials:
                <programlisting language="java" linenumbering="numbered">HttpAuthenticationFeature feature = HttpAuthenticationFeature.basicBuilder().build();</programlisting>
                In this case you need to supply username and password for each request using request properties:
                <programlisting language="java" linenumbering="numbered">Response response = client.target("http://localhost:8080/rest/homer/contact").request()
    .property(HTTP_AUTHENTICATION_BASIC_USERNAME, "homer")
    .property(HTTP_AUTHENTICATION_BASIC_PASSWORD, "p1swd745").get();</programlisting>
                This allows you to reuse the same client for authenticating with many different credentials.
            </para>
            <para>
                See javadoc of the &jersey.client.HttpAuthenticationFeature; for more details.
            </para>
        </section>

        <section>
            <title><anchor xml:id="SNI"/>Server Name Indication (SNI) Support</title>
            <para>
                When using SSL/TLS protocols for the connection, <literal>SNIHostName</literal> is set automatically
                based on the host name in the HTTPS request.
            </para>
            <para>
                There might be use-cases where the <literal>SNIHostName</literal> is required to be set for other host
                than the host specified in the HTTPS request. For those cases, when the HTTP header <literal>Host</literal>
                is set, the <literal>SNIHostName</literal> is set for the host specified in the <literal>Host</literal> header.
                Note that only <literal>Apache Connector, JDK Connector, Netty connector</literal>, and the default
                <literal>HttpUrlConnector</literal> do support this feature.
            </para>
        </section>

    </section>

    <section>
        <title>InvocationInterceptors</title>
        <para>
            Suppose a case that the start of the request is to be logged and even measured.
            This can be done by <literal>ClientRequestFilter</literal>, which is usually invoked before the request is wired on the network.
            However, the filter may be called as a last of the filters in the chain. Sure, it can have the highest priority,
            but the other filters can have the very same priority! Some long-running operations can be performed before the
            measuring can actually start. Even worse, the filter may even be skipped from the chain by the previous
            <literal>#abortWith</literal>!
        </para>
        <section>
            <title>PreInvocationInterceptor</title>
            <para>
                For this, <literal>PreInvocationInterceptor</literal>, the code that executes before the <literal>ClientRequestFilters</literal>
                are invoked, has been added to the client request chain. Jersey ensures all the interceptors are invoked with each request.
                The interceptor contains a single <literal>#beforeRequest</literal> method, which corresponds to <literal>ClientRequestFilter</literal>:
            </para>
            <programlisting language="java">
                /**
                * The method invoked before the request starts.
                * @param requestContext the request context shared with
                * ClientRequestFilter.
                */
                void beforeRequest(ClientRequestContext requestContext);
            </programlisting>
            <para>
                Note that only a single <literal>#abortWith</literal> is allowed in all <literal>PreInvocationInterceptors</literal>,
                otherwise an <literal>IllegalStateException</literal> is thrown.
                All the exceptions accumulated in <literal>PreInvocationInterceptors</literal> are thrown in a single Exception,
                available through <literal>#getSuppressed()</literal>.
            </para>
        </section>
        <section>
            <title>PostInvocationInterceptor</title>
            <para>
                Similarly, <literal>ClientResponseFilter</literal> seems to be a good place where the total time of the HTTP request can be measured,
                but similarly to <literal>ClientRequestFilter</literal>, the response filter may not be invoked at all.
                For this, <literal>PostInvocationInterceptor</literal> has been introduced. Jersey runtime ensures that every
                <literal>PostInvocationInterceptor</literal> is called. Since an exception can occur during the HTTP request,
                <literal>PostInvocationInterceptor</literal> comes with two methods:
            </para>
            <programlisting language="java">
                /**
                * The method is invoked after a request when no
                * is thrown, or the Throwables are resolved
                * by previous PostInvocationInterceptor.
                *
                * @param requestContext the request context.
                * @param responseContext the response context
                * of the original Response or response context
                * defined by the new resolving Response.
                */
                void afterRequest(ClientRequestContext requestContext, ClientResponseContext responseContext);

                /**
                * The method is invoked after a Throwable is caught
                * during the client request chain processing.
                *
                * @param requestContext the request context.
                * @param exceptionContext the context available to handle the
                * caught Throwables.
                */
                void onException(ClientRequestContext requestContext, ExceptionContext exceptionContext);
            </programlisting>
            <para>
                The <literal>#afterRequest</literal> method is executed when no exception has been thrown during the HTTP request,
                <literal>#onException</literal> method is executed if the exception has been thrown during the request.
                It is possible to set a response in <literal>#onException</literal>, and the consecutive <literal>PostInvocationInterceptor</literal> will
                execute its <literal>#afterRequest</literal> method.

                The measuring example can looks as follows, then:
            </para>
            <programlisting language="java" linenumbering="numbered">
                String response = ClientBuilder.newClient().target("path")
                    .register(new PreInvocationInterceptor() {
                        @Override
                        public void beforeRequest(ClientRequestContext requestContext) {
                            startTime = System.currentTimeMillis();
                        }
                    })
                    .register(new PostInvocationInterceptor() {
                        @Override
                        public void afterRequest(ClientRequestContext requestContext, ClientResponseContext responseContext) {
                            logDuration(System.currentTimeMillis() - startTime);
                        }
                        @Override
                        public void onException(ClientRequestContext requestContext, ExceptionContext exceptionContext) {
                            logDuration(System.currentTimeMillis() - startTime);
                        }
                    })
                    .request().get().readEntity(String.class);
            </programlisting>
        </section>
    </section>
    <section>
        <title>InvocationBuilderListener</title>
        <para>
            InvocationBuilderListener is an interface that is inspired by Microprofile REST Client <literal>RestClientBuilderListener</literal>
            and it contains a single method:
        </para>
        <programlisting language="java">
            /**
            * Whenever an Invocation.Builder is created, (i.e. when
            * WebTarget#request() is called, this method would be invoked.
            *
            * @param context the updated InvocationBuilderContext.
            */
            void onNewBuilder(InvocationBuilderContext context);
        </programlisting>
        <para>
            <literal>InvocationBuilderContext</literal> a subset of methods of the <literal>Invocation.Builder</literal>. It can be used to call the default
            values of the <literal>Invocation.Builder</literal>. Since it is invoked at the time <literal>Invocation.Builder</literal> is instantiated, any consequent
            calls of the <literal>Invocation.Builder</literal>‘s methods will replace the defaults set by the <literal>InvocationBuilderListener</literal>.

            For instance, if all the HTTP requests should contain a custom HTTP header,
            there can be created a feature that would be registered on the client:
        </para>
        <programlisting language="java" linenumbering="numbered">
            public static class MyFeature implements Feature {
                @Override
                public boolean configure(FeatureContext context) {
                    context.register(
                        (InvocationBuilderListener)(l)-&gt;
                        l.getHeaders().add("MY_HEADER", "MY_VALUE")
                    );
                    return true;
                }
            }
        </programlisting>
    </section>
    <section>
        <title>Header Expect:100-continue support</title>
        <para>
        This section describes support of Expect:100-continue in Jersey client using Expect100Continue feature.
        Jersey client supports given header for default JDK HTTP connector only.
        </para>
        <para>
        <emphasis>Jersey client Expect100Continue feature</emphasis>
        </para>
        <para>
            Since Jersey 2.32 it is possible to send Expect:100-continue header from Jersey client. Feature shall be
            registered in client using (for example)
            <programlisting language="java" linenumbering="numbered">
                target(RESOURCE_PATH).register(Expect100ContinueFeature.basic());
            </programlisting>
            Note that registration can be done in several ways: with basic settings, and with custom settings:
            <programlisting language="java" linenumbering="numbered">
                target(RESOURCE_PATH).register(Expect100ContinueFeature.withCustomThreshold(100L));
            </programlisting>
            Basic registration means that default sending threshold will be used. Value of the default threshold is
            <programlisting language="java" linenumbering="numbered">
                DEFAULT_EXPECT_100_CONTINUE_THRESHOLD_SIZE = 65536L;
            </programlisting>
            Threshold is used to determine allowed size of request after which 100-continue header shall be sent before
            sending request itself.
        </para>
        <para>
            <emphasis>Environment properties configuration</emphasis>
        </para>
        <para>
            Previous paragraph described programmatic way of configuration. However the Expect100Continue feature can
            be configured using environment variables as well.
        </para>
        <para>
            Since Jersey client can be influenced through environment variables, there are two variables which come
            since Jersey 2.32:
            <programlisting language="bash" linenumbering="unnumbered">
                -Djersey.config.client.request.expect.100.continue.processing=true/false
                -Djersey.config.client.request.expect.100.continue.threshold.size=12345
            </programlisting>
        </para>
        <para>
            First variable can be used to forbid the Expect (100-continue) header be sent at all even though it is
            registered as described in the previous paragraph. If this property is not provided (or true) and the
            Expect100Continue feature is registered, sending of the Expect header is enabled.
        </para>
        <para>
            The second property defines (or modifies) threshold size. So, if the Expect100Continue feature is registered
            using basic (default threshold size) parameters, value of the threshold can be modified using this property.
            This is valid for custom threshold as well - when the Expect100Continue feature is registered using
            withCustomThreshold method its value can be modified anyway by the environment property
            <literal>jersey.config.client.request.expect.100.continue.threshold.size</literal>.
            <important>
                In other words this variable has precedence over any programmatically set value of the threshold.
            </important>
        </para>
    </section>
</chapter>
