added unit tests to feign client

This commit is contained in:
David Kiss
2015-12-07 01:13:20 -05:00
parent 21e8822343
commit eb4acd0971
26 changed files with 2313 additions and 4 deletions

View File

@@ -46,7 +46,7 @@ public class ApiClient {
*/
public <T extends Api> T buildClient(Class<T> clientClass) {
return Feign.builder()
.encoder(new JacksonEncoder(objectMapper))
.encoder(new FormAwareEncoder(new JacksonEncoder(objectMapper)))
.decoder(new JacksonDecoder(objectMapper))
// enable for basic auth:
// .requestInterceptor(new feign.auth.BasicAuthRequestInterceptor(username, password))

View File

@@ -0,0 +1,159 @@
package {{invokerPackage}};
import java.io.*;
import java.lang.reflect.Type;
import java.net.URLEncoder;
import java.net.URLConnection;
import java.util.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import feign.codec.Encoder;
import feign.RequestTemplate;
{{>generatedAnnotation}}
public class FormAwareEncoder implements Encoder {
private static final String LINE_FEED = "\r\n";
private static final String BOUNDARY = "----------------314159265358979323846";
private final Encoder delegate;
private DateFormat dateFormat;
public FormAwareEncoder(Encoder delegate) {
this.delegate = delegate;
// Use RFC3339 format for date and datetime.
// See http://xml2rfc.ietf.org/public/rfc/html/rfc3339.html#anchor14
this.dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
// Use UTC as the default time zone.
this.dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
}
public void encode(Object object, Type bodyType, RequestTemplate template) {
if (object instanceof Map) {
StringBuilder formParamBuilder = new StringBuilder();
Map<String, Object> formParams = (Map<String, Object>) object;
boolean isMultiPart = isMultiPart(formParams);
for (Map.Entry<String, Object> param : formParams.entrySet()) {
String keyStr = param.getKey();
if (param.getValue() instanceof File) {
addFilePart(formParamBuilder, keyStr, (File) param.getValue());
} else {
String valueStr = parameterToString(param.getValue());
if (isMultiPart) {
addMultiPartFormField(formParamBuilder, keyStr, valueStr);
} else {
addEncodedFormField(formParamBuilder, keyStr, valueStr);
}
}
}
if (isMultiPart) {
formParamBuilder.append(LINE_FEED);
formParamBuilder.append("--").append(BOUNDARY).append("--").append(LINE_FEED);
}
String contentType = isMultiPart ? "multipart/form-data; boundary=" + BOUNDARY : "application/x-www-form-urlencoded";
template.header("Content-type");
template.header("Content-type", contentType);
template.header("MIME-Version", "1.0");
template.body(formParamBuilder.toString());
} else {
delegate.encode(object, bodyType, template);
}
}
/*
* Currently only supports text files
*/
private void addFilePart(StringBuilder formParamBuilder, String fieldName, File uploadFile) {
try {
String fileName = uploadFile.getName();
formParamBuilder.append("--").append(BOUNDARY).append(LINE_FEED);
formParamBuilder.append(
"Content-Disposition: form-data; name=\"" + fieldName
+ "\"; filename=\"" + fileName + "\"")
.append(LINE_FEED);
formParamBuilder.append(
"Content-Type: "
+ URLConnection.guessContentTypeFromName(fileName))
.append(LINE_FEED);
formParamBuilder.append(LINE_FEED);
BufferedReader reader = new BufferedReader(new FileReader(uploadFile));
String line = "";
while ((line = reader.readLine()) != null) {
formParamBuilder.append(line).append(LINE_FEED);
}
formParamBuilder.append(LINE_FEED);
} catch (IOException e) {
e.printStackTrace();
}
}
private void addEncodedFormField(StringBuilder formParamBuilder, String name, String value) {
if (formParamBuilder.length() > 0) {
formParamBuilder.append("&");
}
try {
formParamBuilder.append(URLEncoder.encode(name, "utf8"))
.append("=")
.append(URLEncoder.encode(value, "utf8"));
} catch (UnsupportedEncodingException e) {
// move on to next
}
}
private void addMultiPartFormField(StringBuilder formParamBuilder, String name, String value) {
formParamBuilder.append("--").append(BOUNDARY).append(LINE_FEED);
formParamBuilder.append("Content-Disposition: form-data; name=\"" + name + "\"")
.append(LINE_FEED);
formParamBuilder.append("Content-Type: text/plain; charset=utf-8").append(
LINE_FEED);
formParamBuilder.append(LINE_FEED);
formParamBuilder.append(value).append(LINE_FEED);
}
private boolean isMultiPart(Map<String, Object> formParams) {
boolean isMultiPart = false;
for (Map.Entry<String, Object> entry : formParams.entrySet()) {
if (entry.getValue() instanceof File) {
isMultiPart = true;
break;
}
}
return isMultiPart;
}
/**
* Format the given parameter object into string.
*/
public String parameterToString(Object param) {
if (param == null) {
return "";
} else if (param instanceof Date) {
return formatDate((Date) param);
} else if (param instanceof Collection) {
StringBuilder b = new StringBuilder();
for(Object o : (Collection)param) {
if(b.length() > 0) {
b.append(",");
}
b.append(String.valueOf(o));
}
return b.toString();
} else {
return String.valueOf(param);
}
}
/**
* Format the given Date object into string.
*/
public String formatDate(Date date) {
return dateFormat.format(date);
}
}

View File

@@ -25,10 +25,12 @@ public interface {{classname}} extends {{invokerPackage}}.ApiClient.Api {
*/
@RequestLine("{{httpMethod}} {{{path}}}{{#hasQueryParams}}?{{/hasQueryParams}}{{#queryParams}}{{paramName}}={{=<% %>=}}{<%paramName%>}<%={{ }}=%>{{#hasMore}}&{{/hasMore}}{{/queryParams}}")
@Headers({
{{#headerParams}}"{{paramName}}: {{=<% %>=}}{<%paramName%>}<%={{ }}=%>"{{#hasMore}},
"Content-type: {{vendorExtensions.x-contentType}}",
"Accepts: {{vendorExtensions.x-accepts}}",{{#headerParams}}
"{{paramName}}: {{=<% %>=}}{<%paramName%>}<%={{ }}=%>"{{#hasMore}},
{{/hasMore}}{{/headerParams}}
})
{{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}}{{nickname}} ({{#allParams}}@Param("{{paramName}}") {{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws ApiException;
{{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}}{{nickname}}({{#allParams}}{{^vendorExtensions.x-isBody}}@Param("{{paramName}}") {{/vendorExtensions.x-isBody}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws ApiException;
{{/operation}}
{{/operations}}
}