macgregor/alexandria

View on GitHub
alexandria-core/src/main/java/com/github/macgregor/alexandria/remotes/Requests.java

Summary

Maintainability
A
1 hr
Test Coverage
package com.github.macgregor.alexandria.remotes;

import okhttp3.HttpUrl;
import okhttp3.Request;
import okio.Buffer;

import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * Utility class for making rest requests
 */
public class Requests {

    /**
     * Create a {@link Request.Builder} from the provided route, adding all headers
     *
     * @param route  {@link HttpUrl} the request should be made to
     * @param headers  optional headers to add to the request
     * @return  {@link Request.Builder}
     */
    public static Request.Builder requestBuilder(HttpUrl route, Map<String, String> headers){
        return addHeaders(new Request.Builder().url(route), headers);
    }

    /**
     * Create a {@link HttpUrl.Builder} from the baseUrl, path segments and query parameters.
     *
     * Path segments will be added to the url path in the order they given. So
     * {@code routeBuilder("www.google.com", Arrays.asList("foo", "bar"), Collections.emptyMap())} would build a request
     * url www.googl.com/foo/bar
     *
     * @param baseUrl  base url for the request
     * @param segments  optional path segments to add to the request url
     * @param queryParameters  optional query parameters to add to the request url
     * @return  {@link HttpUrl.Builder}
     */
    public static HttpUrl.Builder routeBuilder(String baseUrl, List<String> segments, Map<String, String> queryParameters){
        HttpUrl.Builder builder = HttpUrl.parse(baseUrl).newBuilder();
        addSegments(builder, segments);
        addQueryParameters(builder, queryParameters);
        return builder;
    }

    /**
     * Add query parameters to the {@link HttpUrl.Builder}
     *
     * @param builder  existing {@link HttpUrl.Builder} to add query parameters to
     * @param queryParameters  query parameters to add
     * @return  {@link HttpUrl.Builder}
     */
    public static HttpUrl.Builder addQueryParameters(HttpUrl.Builder builder, Map<String, String> queryParameters){
        if(queryParameters != null){
            for(Map.Entry<String, String> entry : queryParameters.entrySet()){
                builder.addQueryParameter(entry.getKey(), entry.getValue());
            }
        }
        return builder;
    }

    /**
     * Add url segments to a {@link HttpUrl.Builder}
     *
     * @param builder  existing {@link HttpUrl.Builder} to add url segments to
     * @param segments  url segments to add
     * @return  {@link HttpUrl.Builder}
     */
    public static HttpUrl.Builder addSegments(HttpUrl.Builder builder, List<String> segments){
        if(segments != null){
            for(String segment : segments){
                builder.addPathSegment(segment);
            }
        }
        return builder;
    }

    /**
     * Add headers to a {@link Request.Builder}
     *
     * @param requestBuilder  existing {@link Request.Builder} to add headers to
     * @param headers  headers to add
     * @return  {@link Request.Builder}
     */
    public static Request.Builder addHeaders(Request.Builder requestBuilder, Map<String, String> headers){
        if(headers != null){
            for(Map.Entry<String, String> entry : headers.entrySet()){
                requestBuilder.addHeader(entry.getKey(), entry.getValue());
            }
        }
        return requestBuilder;
    }

    /**
     * Return the request body in string form.
     *
     * @param request  {@link Request} with a body to stringify
     * @return  String representation of the request body
     * @throws IOException  the request body couldnt be converted to a string
     */
    public static String bodyToString(final Request request) throws IOException {
        final Request copy = request.newBuilder().build();
        final Buffer buffer = new Buffer();
        copy.body().writeTo(buffer);
        return buffer.readUtf8();
    }
}