Skip to main content

API Reference

Complete reference for all classes, methods, and interfaces in MochaJSON v1.0.0.

Core Classes

Api Class

Static entry point for simple HTTP requests with production-safe defaults.

Methods

MethodDescriptionParametersReturns
get(String url)Create GET requesturl - Target URLApiRequest
post(String url)Create POST requesturl - Target URLApiRequest
put(String url)Create PUT requesturl - Target URLApiRequest
delete(String url)Create DELETE requesturl - Target URLApiRequest
patch(String url)Create PATCH requesturl - Target URLApiRequest
execute(ApiRequest request)Execute request synchronouslyrequest - Configured requestApiResponse
executeAsync(ApiRequest request)Execute request asynchronouslyrequest - Configured requestCompletableFuture<ApiResponse>
executeAsync(ApiRequest request, Consumer<ApiResponse> callback)Execute request asynchronously with callbackrequest - Configured request, callback - Response handlervoid

Example Usage

// Simple GET request with production-safe defaults
Map<String, Object> data = Api.get("https://api.example.com/data")
.execute()
.toMap();

// POST request
ApiResponse response = Api.post("https://api.example.com/users")
.body(Map.of("name", "John", "email", "john@example.com"))
.execute();

ApiClient Class

Advanced HTTP client with configurable timeouts, interceptors, and logging. Each client is completely independent and stateless.

Constructor

ConstructorDescriptionParameters
ApiClient(Builder builder)Create from Builderbuilder - Configured builder

Methods

MethodDescriptionParametersReturns
get(String url)Create GET requesturl - Target URLApiRequest
post(String url)Create POST requesturl - Target URLApiRequest
put(String url)Create PUT requesturl - Target URLApiRequest
delete(String url)Create DELETE requesturl - Target URLApiRequest
patch(String url)Create PATCH requesturl - Target URLApiRequest
execute(ApiRequest request)Execute request synchronouslyrequest - Configured requestApiResponse
executeAsync(ApiRequest request)Execute request asynchronouslyrequest - Configured requestCompletableFuture&lt;ApiResponse&gt;
executeAsync(ApiRequest request, Consumer&lt;ApiResponse&gt; callback)Execute request asynchronously with callbackrequest - Configured request, callback - Response handlervoid
getSecurityConfig()Get security configurationNoneSecurityConfig

Builder Class

MethodDescriptionParametersReturns
connectTimeout(Duration timeout)Set connection timeouttimeout - Connection timeoutBuilder
readTimeout(Duration timeout)Set read timeouttimeout - Read timeoutBuilder
writeTimeout(Duration timeout)Set write timeouttimeout - Write timeoutBuilder
allowLocalhost(boolean allow)Allow localhost URLsallow - Whether to allow localhostBuilder
enableRetry()Enable retry with 3 attemptsNoneBuilder
enableLogging()Enable console loggingNoneBuilder
requestInterceptor(Consumer&lt;ApiRequest&gt; interceptor)Add request interceptorinterceptor - Request interceptorBuilder
responseInterceptor(Consumer&lt;ApiResponse&gt; interceptor)Add response interceptorinterceptor - Response interceptorBuilder
engine(HttpClientEngine engine)Set custom HTTP engineengine - Custom engineBuilder
executor(Executor executor)Set custom executorexecutor - Custom executorBuilder
build()Build ApiClientNoneApiClient

Example Usage

// Create configured client
ApiClient client = new ApiClient.Builder()
.connectTimeout(Duration.ofSeconds(10))
.readTimeout(Duration.ofSeconds(30))
.allowLocalhost(true) // Development-friendly
.enableRetry()
.enableLogging()
.build();

// Use the client
Map<String, Object> data = client.get("https://api.example.com/data")
.execute()
.toMap();

// Async usage CompletableFuture<ApiResponse> future = client.get("https://api.example.com/data") .executeAsync();


### `RequestInterceptor` Interface (New in v1.0.0)

Interface for intercepting and modifying HTTP requests before they are sent.

#### Methods

| Method | Description | Parameters | Returns |
|--------|-------------|------------|---------|
| `intercept(ApiRequest request)` | Intercept and modify request | `request` - Original request | `ApiRequest` |

#### Static Factory Methods

| Method | Description | Parameters | Returns |
|--------|-------------|------------|---------|
| `logging(Consumer&lt;String&gt; logger)` | Create logging interceptor | `logger` - Logger function | `RequestInterceptor` |
| `bearerAuth(Supplier&lt;String&gt; tokenProvider)` | Create auth interceptor | `tokenProvider` - Token provider | `RequestInterceptor` |
| `addHeaders(Map<String, String> headers)` | Create header interceptor | `headers` - Headers to add | `RequestInterceptor` |

#### Example Usage

```java
// Authentication interceptor
RequestInterceptor authInterceptor = RequestInterceptor.bearerAuth(() -> getToken());

// Logging interceptor
RequestInterceptor loggingInterceptor = RequestInterceptor.logging(System.out::println);

// Custom interceptor
RequestInterceptor customInterceptor = request -> {
System.out.println("Sending: " + request.getMethod() + " " + request.getUrl());
return request.header("X-Request-ID", UUID.randomUUID().toString());
};

ResponseInterceptor Interface (New in v1.0.0)

Interface for intercepting and modifying HTTP responses after they are received.

Methods

MethodDescriptionParametersReturns
intercept(ApiResponse response)Intercept and modify responseresponse - Original responseApiResponse

Static Factory Methods

MethodDescriptionParametersReturns
logging(Consumer&lt;String&gt; logger)Create logging interceptorlogger - Logger functionResponseInterceptor
throwOnError()Create error handling interceptorNoneResponseInterceptor
retryOnStatus(int[] codes, int maxRetries)Create retry interceptorcodes - Retryable status codes, maxRetries - Max retriesResponseInterceptor

Example Usage

// Error handling interceptor
ResponseInterceptor errorInterceptor = ResponseInterceptor.throwOnError();

// Logging interceptor
ResponseInterceptor loggingInterceptor = ResponseInterceptor.logging(System.out::println);

// Custom interceptor
ResponseInterceptor customInterceptor = response -> {
if (response.code() >= 400) {
System.err.println("Error: " + response.code() + " - " + response.body());
}
return response;
};

Api Class

Main entry point for creating HTTP requests.

Static Methods

MethodDescriptionParametersReturns
get(String url)Create GET requesturl - Target URLApiRequest
post(String url)Create POST requesturl - Target URLApiRequest
put(String url)Create PUT requesturl - Target URLApiRequest
delete(String url)Create DELETE requesturl - Target URLApiRequest
patch(String url)Create PATCH requesturl - Target URLApiRequest
execute(ApiRequest request)Execute request synchronouslyrequest - Configured requestApiResponse
executeAsync(ApiRequest request)Execute request asynchronouslyrequest - Configured requestCompletableFuture&lt;ApiResponse&gt;
executeAsync(ApiRequest request, Consumer&lt;ApiResponse&gt; callback)Execute request asynchronously with callbackrequest - Configured request, callback - Response handlervoid

Example Usage

// Create requests
ApiRequest getRequest = Api.get("https://api.example.com/data");
ApiRequest postRequest = Api.post("https://api.example.com/users");

// Execute requests
ApiResponse response = Api.execute(getRequest);
Api.executeAsync(postRequest, response -> {
System.out.println("Async response: " + response.body());
});

ApiRequest Class

Fluent interface for building HTTP requests.

Methods

MethodDescriptionParametersReturns
header(String name, String value)Add HTTP headername - Header name, value - Header valueApiRequest
query(String name, Object value)Add query parametername - Parameter name, value - Parameter valueApiRequest
body(Object body)Set request bodybody - Request body (String, Map, or Object)ApiRequest
execute()Execute request synchronouslyNoneApiResponse
executeAsync()Execute request asynchronouslyNoneCompletableFuture&lt;ApiResponse&gt;
async(Consumer&lt;ApiResponse&gt; callback)Execute request asynchronously with callbackcallback - Response handlervoid

Getters

MethodDescriptionReturns
getUrl()Get request URLString
getMethod()Get HTTP methodString
getHeaders()Get request headersMap<String, String>
getQueryParams()Get query parametersMap<String, Object>
getBody()Get request bodyObject

Example Usage

ApiRequest request = Api.get("https://api.example.com/search")
.header("Authorization", "Bearer token123")
.query("q", "java")
.query("page", 1)
.query("limit", 10)
.body(searchData);

ApiResponse response = request.execute();

ApiResponse Class

Container for HTTP response data with JSON parsing capabilities.

Methods

MethodDescriptionParametersReturns
code()Get HTTP status codeNoneint
body()Get response body as stringNoneString
headers()Get response headersNoneMap<String, String>
json()Get JSON mapper instanceNoneJsonMapper
to(Class&lt;T&gt; type)Parse JSON to specified typetype - Target classT
toMap()Parse JSON to MapNoneMap<String, Object>
toJsonMap()Parse JSON to chainable JsonMapNoneJsonMap
toList()Parse JSON to ListNoneList&lt;Object&gt;
isSuccess()Check if status is 200-299Noneboolean
isError()Check if status is 400+Noneboolean

Example Usage

ApiResponse response = Api.get("https://api.example.com/users/1").execute();

// Basic response info
int statusCode = response.code();
String body = response.body();
Map<String, String> headers = response.headers();

// JSON parsing
User user = response.to(User.class);
Map<String, Object> data = response.toMap();
JsonMap json = response.toJsonMap();
List&lt;Object&gt; items = response.toList();

// Status checking
if (response.isSuccess()) {
System.out.println("Request successful");
} else if (response.isError()) {
System.out.println("Request failed: " + response.code());
}

JsonMap Class

Chainable wrapper for JSON data that eliminates casting boilerplate when accessing nested objects.

Constructors

ConstructorDescriptionParameters
JsonMap(Map<String, Object> map)Create JsonMap from Mapmap - Map to wrap

Methods

MethodDescriptionParametersReturns
get(String key)Get value with chainable accesskey - Key to retrieveJsonMap
toString()Get string representationNoneString

Example Usage

JsonMap json = response.toJsonMap();

// Chainable nested access
String city = json.get("data").get("location").get("city").toString();
String latitude = json.get("data").get("location").get("coordinates").get("latitude").toString();

// Intermediate access
JsonMap user = json.get("data").get("user");
String name = user.get("name").get("first").toString();

JSON Mapping

JsonMapper Interface

Interface for JSON serialization and deserialization.

Methods

MethodDescriptionParametersReturns
stringify(Object obj)Convert object to JSON stringobj - Object to serializeString
parse(String json, Class&lt;T&gt; type)Parse JSON string to objectjson - JSON string, type - Target classT
toMap(String json)Parse JSON string to Mapjson - JSON stringMap<String, Object>
toList(String json)Parse JSON string to Listjson - JSON stringList&lt;Object&gt;

Example Usage

JsonMapper mapper = response.json();

// Serialize object to JSON
String json = mapper.stringify(user);

// Parse JSON to object
User user = mapper.parse(jsonString, User.class);

// Parse JSON to Map/List
Map<String, Object> map = mapper.toMap(jsonString);
List&lt;Object&gt; list = mapper.toList(jsonString);

JacksonJsonMapper Class

Jackson-based implementation of JsonMapper.

Constructors

ConstructorDescriptionParameters
JacksonJsonMapper()Create with default ObjectMapperNone
JacksonJsonMapper(ObjectMapper objectMapper)Create with custom ObjectMapperobjectMapper - Custom ObjectMapper

Example Usage

// Default mapper
JacksonJsonMapper mapper = new JacksonJsonMapper();

// Custom mapper
ObjectMapper customMapper = new ObjectMapper();
customMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
JacksonJsonMapper customJsonMapper = new JacksonJsonMapper(customMapper);

KotlinxJsonMapper Class

Kotlinx Serialization-based implementation of JsonMapper.

Constructors

ConstructorDescriptionParameters
KotlinxJsonMapper()Create with default Json configurationNone
KotlinxJsonMapper(Json json)Create with custom Json configurationjson - Custom Json instance

Example Usage

// Default mapper
val mapper = KotlinxJsonMapper()

// Custom mapper
val customJson = Json {
ignoreUnknownKeys = true
coerceInputValues = true
}
val customMapper = KotlinxJsonMapper(customJson)

HTTP Client Engine

HttpClientEngine Interface

Interface for executing HTTP requests.

Methods

MethodDescriptionParametersReturns
execute(ApiRequest request)Execute HTTP requestrequest - Configured requestApiResponse

Example Usage

HttpClientEngine engine = new DefaultHttpClientEngine();
ApiResponse response = engine.execute(request);

DefaultHttpClientEngine Class

Default implementation using Java 11+ HttpClient.

Constructors

ConstructorDescriptionParameters
DefaultHttpClientEngine()Create with default HttpClient and JsonMapperNone
DefaultHttpClientEngine(HttpClient httpClient, JsonMapper jsonMapper)Create with custom HttpClient and JsonMapperhttpClient - Custom HttpClient, jsonMapper - Custom JsonMapper

Features

  • Connection Timeout: 30 seconds
  • Read Timeout: 30 seconds
  • Automatic JSON Serialization: For request bodies
  • UTF-8 Encoding: For all text content
  • Header Management: Automatic Content-Type setting

Exception Classes

ApiException Class

Exception for HTTP and network-related errors.

Constructors

ConstructorDescriptionParameters
ApiException(String message)Create with messagemessage - Error message
ApiException(String message, Throwable cause)Create with message and causemessage - Error message, cause - Underlying cause

Example Usage

try {
ApiResponse response = Api.get("https://api.example.com/data").execute();
} catch (ApiException e) {
System.err.println("API Error: " + e.getMessage());
if (e.getCause() != null) {
System.err.println("Cause: " + e.getCause().getMessage());
}
}

JsonException Class

Exception for JSON serialization and deserialization errors.

Constructors

ConstructorDescriptionParameters
JsonException(String message)Create with messagemessage - Error message
JsonException(String message, Throwable cause)Create with message and causemessage - Error message, cause - Underlying cause

Example Usage

try {
User user = response.to(User.class);
} catch (JsonException e) {
System.err.println("JSON Error: " + e.getMessage());
if (e.getCause() != null) {
System.err.println("Cause: " + e.getCause().getMessage());
}
}

Utility Classes

Utils Class

Utility methods for HTTP operations.

Static Methods

MethodDescriptionParametersReturns
inputStreamToString(InputStream inputStream)Convert InputStream to StringinputStream - Input streamString
buildQueryString(Map<String, Object> params)Build query string from parametersparams - Parameter mapString
isEmpty(String str)Check if string is null or emptystr - String to checkboolean
isNotEmpty(String str)Check if string is not null and not emptystr - String to checkboolean
safeToString(Object obj)Safely convert object to stringobj - Object to convertString

Example Usage

// Convert InputStream to String
String content = Utils.inputStreamToString(inputStream);

// Build query string
Map<String, Object> params = Map.of("page", 1, "limit", 10);
String queryString = Utils.buildQueryString(params);

// String utilities
if (Utils.isNotEmpty(userInput)) {
System.out.println("User input: " + userInput);
}

Sample JSON Responses

User Object

{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "Sincere@april.biz",
"phone": "1-770-736-8031 x56442",
"website": "hildegard.org",
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.1496"
}
},
"company": {
"name": "Romaguera-Crona",
"catchPhrase": "Multi-layered client-server neural-net",
"bs": "harness real-time e-markets"
}
}

Post Object

{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
}

Posts Array

[
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
},
{
"userId": 1,
"id": 2,
"title": "qui est esse",
"body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
}
]

Next Steps