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

ca.uhn.fhir.okhttp.client.OkHttpRestfulClient Maven / Gradle / Ivy

The newest version!
/*-
 * #%L
 * HAPI FHIR OkHttp Client
 * %%
 * Copyright (C) 2014 - 2024 Smile CDR, Inc.
 * %%
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * #L%
 */
package ca.uhn.fhir.okhttp.client;

import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.rest.api.Constants;
import ca.uhn.fhir.rest.api.EncodingEnum;
import ca.uhn.fhir.rest.api.RequestTypeEnum;
import ca.uhn.fhir.rest.client.api.Header;
import ca.uhn.fhir.rest.client.api.HttpClientUtil;
import ca.uhn.fhir.rest.client.api.IHttpClient;
import ca.uhn.fhir.rest.client.api.IHttpRequest;
import ca.uhn.fhir.rest.client.impl.BaseHttpClientInvocation;
import ca.uhn.fhir.rest.client.method.MethodUtil;
import okhttp3.Call;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.RequestBody;
import org.hl7.fhir.instance.model.api.IBaseBinary;

import java.util.List;
import java.util.Map;

import static ca.uhn.fhir.okhttp.utils.UrlStringUtils.deleteLastCharacter;
import static ca.uhn.fhir.okhttp.utils.UrlStringUtils.endsWith;
import static ca.uhn.fhir.okhttp.utils.UrlStringUtils.everythingAfterFirstQuestionMark;
import static ca.uhn.fhir.okhttp.utils.UrlStringUtils.hasQuestionMark;
import static ca.uhn.fhir.okhttp.utils.UrlStringUtils.withTrailingQuestionMarkRemoved;

/**
 * A Http Request based on OkHttp. This is an adapter around the class
 * {@link OkHttpClient}
 *
 * @author Matthew Clarke | [email protected] | Orion Health
 */
public class OkHttpRestfulClient implements IHttpClient {

	private Call.Factory myClient;
	private StringBuilder myUrl;
	private Map> myIfNoneExistParams;
	private String myIfNoneExistString;
	private RequestTypeEnum myRequestType;
	private List
myHeaders; private OkHttpRestfulRequest myRequest; public OkHttpRestfulClient( Call.Factory theClient, StringBuilder theUrl, Map> theIfNoneExistParams, String theIfNoneExistString, RequestTypeEnum theRequestType, List
theHeaders) { myClient = theClient; myUrl = theUrl; myIfNoneExistParams = theIfNoneExistParams; myIfNoneExistString = theIfNoneExistString; myRequestType = theRequestType; myHeaders = theHeaders; } @Override public IHttpRequest createByteRequest( FhirContext theContext, String theContents, String theContentType, EncodingEnum theEncoding) { initBaseRequest(theContext, theEncoding, createPostBody(theContents, theContentType)); return myRequest; } private void initBaseRequest(FhirContext theContext, EncodingEnum theEncoding, RequestBody body) { String sanitisedUrl = withTrailingQuestionMarkRemoved(myUrl.toString()); myRequest = new OkHttpRestfulRequest(myClient, sanitisedUrl, myRequestType, body); addHeadersToRequest(myRequest, theEncoding, theContext); } private RequestBody createPostBody(String theContents, String theContentType) { return RequestBody.create(MediaType.parse(theContentType), theContents); } @Override public IHttpRequest createParamRequest( FhirContext theContext, Map> theParams, EncodingEnum theEncoding) { initBaseRequest(theContext, theEncoding, getFormBodyFromParams(theParams)); return myRequest; } private RequestBody getFormBodyFromParams(Map> queryParams) { FormBody.Builder formBuilder = new FormBody.Builder(); for (Map.Entry> paramEntry : queryParams.entrySet()) { for (String value : paramEntry.getValue()) { formBuilder.add(paramEntry.getKey(), value); } } return formBuilder.build(); } @Override public IHttpRequest createBinaryRequest(FhirContext theContext, IBaseBinary theBinary) { initBaseRequest(theContext, null, createPostBody(theBinary.getContent(), theBinary.getContentType())); return myRequest; } private RequestBody createPostBody(byte[] theContents, String theContentType) { return RequestBody.create(MediaType.parse(theContentType), theContents); } @Override public IHttpRequest createGetRequest(FhirContext theContext, EncodingEnum theEncoding) { initBaseRequest(theContext, theEncoding, null); return myRequest; } private void addHeadersToRequest( OkHttpRestfulRequest theHttpRequest, EncodingEnum theEncoding, FhirContext theContext) { if (myHeaders != null) { for (Header next : myHeaders) { theHttpRequest.addHeader(next.getName(), next.getValue()); } } addUserAgentHeader(theHttpRequest, theContext); MethodUtil.addAcceptHeaderToRequest(theEncoding, theHttpRequest, theContext); addIfNoneExistHeader(theHttpRequest); } private void addUserAgentHeader(OkHttpRestfulRequest theHttpRequest, FhirContext theContext) { theHttpRequest.addHeader("User-Agent", HttpClientUtil.createUserAgentString(theContext, "okhttp")); } private void addIfNoneExistHeader(IHttpRequest result) { if (myIfNoneExistParams != null) { addIfNoneExistHeaderFromParams(result, myIfNoneExistParams); } else if (myIfNoneExistString != null) { addIfNoneExistHeaderFromString(result, myIfNoneExistString); } } private void addIfNoneExistHeaderFromString(IHttpRequest result, String ifNoneExistString) { StringBuilder sb = newHeaderBuilder(myUrl); boolean shouldAddQuestionMark = !hasQuestionMark(sb); sb.append(shouldAddQuestionMark ? '?' : '&'); sb.append(everythingAfterFirstQuestionMark(ifNoneExistString)); result.addHeader(Constants.HEADER_IF_NONE_EXIST, sb.toString()); } private void addIfNoneExistHeaderFromParams(IHttpRequest result, Map> ifNoneExistParams) { StringBuilder sb = newHeaderBuilder(myUrl); boolean shouldAddInitialQuestionMark = !hasQuestionMark(sb); BaseHttpClientInvocation.appendExtraParamsWithQuestionMark(ifNoneExistParams, sb, shouldAddInitialQuestionMark); result.addHeader(Constants.HEADER_IF_NONE_EXIST, sb.toString()); } public static StringBuilder newHeaderBuilder(StringBuilder baseUrl) { StringBuilder sb = new StringBuilder(baseUrl); if (endsWith(baseUrl, '/')) { deleteLastCharacter(sb); } return sb; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy