All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.azure.core.http.HttpRequest Maven / Gradle / Ivy

The newest version!
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

package com.azure.core.http;

import com.azure.core.implementation.ImplUtils;
import com.azure.core.implementation.util.BinaryDataHelper;
import com.azure.core.implementation.util.FluxByteBufferContent;
import com.azure.core.util.BinaryData;
import com.azure.core.util.logging.ClientLogger;
import reactor.core.publisher.Flux;

import java.net.MalformedURLException;
import java.net.URL;
import java.nio.ByteBuffer;

/**
 * Represents an outgoing HTTP request.
 *
 * 

This class encapsulates an HTTP request, including the HTTP method, URL, headers, and body. It provides methods * to set and get these properties.

* *

This class is useful when you want to create an HTTP request to send to a server. For example, you can use it to * create a GET request to retrieve a resource, a POST request to create a resource, a PUT request to update a resource, * or a DELETE request to delete a resource.

* *

Note: This class provides a {@link #copy()} method to create a copy of the HTTP request. This is useful when you * want to modify the HTTP request without affecting the original request.

*/ public class HttpRequest { // HttpRequest is a highly used, short-lived class, use a static logger. private static final ClientLogger LOGGER = new ClientLogger(HttpRequest.class); private HttpMethod httpMethod; private URL url; private HttpHeaders headers; private BinaryData body; /** * Create a new HttpRequest instance. * * @param httpMethod the HTTP request method * @param url the target address to send the request to */ public HttpRequest(HttpMethod httpMethod, URL url) { this(httpMethod, url, new HttpHeaders(), (BinaryData) null); } /** * Create a new HttpRequest instance. * * @param httpMethod the HTTP request method * @param url the target address to send the request to * @throws IllegalArgumentException if {@code url} is null or it cannot be parsed into a valid URL. */ public HttpRequest(HttpMethod httpMethod, String url) { this.httpMethod = httpMethod; setUrl(url); this.headers = new HttpHeaders(); } /** * Create a new HttpRequest instance. * * @param httpMethod the HTTP request method * @param url the target address to send the request to * @param headers the HTTP headers to use with this request */ public HttpRequest(HttpMethod httpMethod, URL url, HttpHeaders headers) { this.httpMethod = httpMethod; this.url = url; this.headers = headers; } /** * Create a new HttpRequest instance. * * @param httpMethod the HTTP request method * @param url the target address to send the request to * @param headers the HTTP headers to use with this request * @param body the request content */ public HttpRequest(HttpMethod httpMethod, URL url, HttpHeaders headers, Flux body) { this.httpMethod = httpMethod; this.url = url; this.headers = headers; setBody(BinaryDataHelper.createBinaryData(new FluxByteBufferContent(body))); } /** * Create a new HttpRequest instance. * * @param httpMethod the HTTP request method * @param url the target address to send the request to * @param headers the HTTP headers to use with this request * @param body the request content */ public HttpRequest(HttpMethod httpMethod, URL url, HttpHeaders headers, BinaryData body) { this.httpMethod = httpMethod; this.url = url; this.headers = headers; setBody(body); } /** * Get the request method. * * @return the request method */ public HttpMethod getHttpMethod() { return httpMethod; } /** * Set the request method. * * @param httpMethod the request method * @return this HttpRequest */ public HttpRequest setHttpMethod(HttpMethod httpMethod) { this.httpMethod = httpMethod; return this; } /** * Get the target address. * * @return the target address */ public URL getUrl() { return url; } /** * Set the target address to send the request to. * * @param url target address as {@link URL} * @return this HttpRequest */ public HttpRequest setUrl(URL url) { this.url = url; return this; } /** * Set the target address to send the request to. * * @param url target address as a String * @return this HttpRequest * @throws IllegalArgumentException if {@code url} is null or it cannot be parsed into a valid URL. */ public HttpRequest setUrl(String url) { try { this.url = ImplUtils.createUrl(url); } catch (MalformedURLException ex) { throw LOGGER.logExceptionAsWarning(new IllegalArgumentException("'url' must be a valid URL.", ex)); } return this; } /** * Get the request headers. * * @return headers to be sent */ public HttpHeaders getHeaders() { return headers; } /** * Set the request headers. * * @param headers the set of headers * @return this HttpRequest */ public HttpRequest setHeaders(HttpHeaders headers) { this.headers = headers; return this; } /** * Set a request header, replacing any existing value. A null for {@code value} will remove the header if one with * matching name exists. * * @param name the header name * @param value the header value * @return this HttpRequest * @deprecated Use {@link #setHeader(HttpHeaderName, String)} instead as is offers better performance. */ @Deprecated public HttpRequest setHeader(String name, String value) { headers.set(name, value); return this; } /** * Set a request header, replacing any existing value. A null for {@code value} will remove the header if one with * matching name exists. * * @param headerName the header name * @param value the header value * @return this HttpRequest */ public HttpRequest setHeader(HttpHeaderName headerName, String value) { headers.set(headerName, value); return this; } /** * Get the request content. * * @return the content to be sent */ public Flux getBody() { return body == null ? null : body.toFluxByteBuffer(); } /** * Get the request content. * * @return the content to be sent */ public BinaryData getBodyAsBinaryData() { return body; } /** * Set the request content. *

* The Content-Length header will be set based on the given content's length. * * @param content the request content * @return this HttpRequest */ public HttpRequest setBody(String content) { return setBody(BinaryData.fromString(content)); } /** * Set the request content. *

* The Content-Length header will be set based on the given content's length. * * @param content the request content * @return this HttpRequest */ public HttpRequest setBody(byte[] content) { return setBody(BinaryData.fromBytes(content)); } /** * Set request content. *

* Caller must set the Content-Length header to indicate the length of the content, or use Transfer-Encoding: * chunked. * * @param content the request content * @return this HttpRequest */ public HttpRequest setBody(Flux content) { if (content != null) { this.body = BinaryDataHelper.createBinaryData(new FluxByteBufferContent(content)); } else { this.body = null; } return this; } /** * Set request content. *

* If provided content has known length, i.e. {@link BinaryData#getLength()} returns non-null then * Content-Length header is updated. Otherwise, * if provided content has unknown length, i.e. {@link BinaryData#getLength()} returns null then * the caller must set the Content-Length header to indicate the length of the content, or use Transfer-Encoding: * chunked. * * @param content the request content * @return this HttpRequest */ public HttpRequest setBody(BinaryData content) { this.body = content; if (content != null && content.getLength() != null) { setContentLength(content.getLength()); } return this; } private void setContentLength(long contentLength) { headers.set(HttpHeaderName.CONTENT_LENGTH, String.valueOf(contentLength)); } /** * Creates a copy of the request. *

* The main purpose of this is so that this HttpRequest can be changed and the resulting HttpRequest can be a * backup. This means that the cloned HttpHeaders and body must not be able to change from side effects of this * HttpRequest. * * @return a new HTTP request instance with cloned instances of all mutable properties. */ public HttpRequest copy() { final HttpHeaders bufferedHeaders = new HttpHeaders(headers); return new HttpRequest(httpMethod, url, bufferedHeaders, body); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy