I have created a REST service which sends GET requests to retrieve a JSON response from a specified URL.
I have got it working to the point where I retrieve the JSON message successfully although my next issue is converting the JSON message to JAVA Objects.
Below is my Rest Client:
public class RestADClient {
// HTTP GET request
public String sendGet(String url) throws Exception {
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
// optional default is GET
con.setRequestMethod("GET");
//add request header
con.setRequestProperty("Authorization", "myAuthorizationProp");
int responseCode = con.getResponseCode();
System.out.println("\nSending 'GET' request to URL : " + url);
System.out.println("Response Code : " + responseCode);
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println("Response Message: " + response.toString());
ObjectMapper mapper = new ObjectMapper();
try {
// Convert JSON string to Object
String jsonInString = "[{ \"frequency\": \"ONE_MIN\", \"metricId\": 2253538, \"metricName\": \"DB|Server:1|IO|Data File Average Read Size\", \"metricPath\": \"Databases|X|IO|Data File Average Read Size\", \"metricValues\": [ { \"count\": 14, \"current\": 65323, \"max\": 65536, \"min\": 0, \"occurrences\": 0, \"standardDeviation\": 0, \"startTimeInMillis\": 1447927800000, \"sum\": 251408, \"useRange\": true, \"value\": 17958 }]}]";
ADMetrics adMetrics = mapper.readValue(jsonInString, ADMetrics.class);
System.out.println(adMetrics);
} catch (JsonGenerationException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return response.toString();
}
}
Below is my ADMetrics POJO class:
import java.util.List;
public class ADMetrics {
private String frequency;
private int metricId;
private String metricName;
private String metricPath;
private List<String> metricValues;
private int count;
private int current;
private int max;
private int min;
private int occurences;
private int standardDeviation;
private int startTimeInMillis;
private int sum;
private boolean useRange;
private int value;
public String getFrequency() {
return frequency;
}
public void setFrequency(String frequency) {
this.frequency = frequency;
}
public int getMetricId() {
return metricId;
}
public void setMetricId(int metricId) {
this.metricId = metricId;
}
public String getMetricName() {
return metricName;
}
public void setMetricName(String metricName) {
this.metricName = metricName;
}
public String getMetricPath() {
return metricPath;
}
public void setMetricPath(String metricPath) {
this.metricPath = metricPath;
}
public List<String> getMetricValues() {
return metricValues;
}
public void setMetricValues(List<String> metricValues) {
this.metricValues = metricValues;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public int getCurrent() {
return current;
}
public void setCurrent(int current) {
this.current = current;
}
public int getMax() {
return max;
}
public void setMax(int max) {
this.max = max;
}
public int getMin() {
return min;
}
public void setMin(int min) {
this.min = min;
}
public int getOccurences() {
return occurences;
}
public void setOccurences(int occurences) {
this.occurences = occurences;
}
public int getStandardDeviation() {
return standardDeviation;
}
public void setStandardDeviation(int standardDeviation) {
this.standardDeviation = standardDeviation;
}
public int getStartTimeInMillis() {
return startTimeInMillis;
}
public void setStartTimeInMillis(int startTimeInMillis) {
this.startTimeInMillis = startTimeInMillis;
}
public int getSum() {
return sum;
}
public void setSum(int sum) {
this.sum = sum;
}
public boolean isUseRange() {
return useRange;
}
public void setUseRange(boolean useRange) {
this.useRange = useRange;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
Below is my JUnit test:
public class ADTest {
String url = "myURL";
@Test
public void testResponseContainsMetricFrequency() throws Exception {
RestADClient restADClient = new RestADClient();
assertTrue(restADClient.sendGet(url).contains("frequency"));
}}
When I run the test, I get the following:
Response Code : 200
Response Message: [{ "frequency": "ONE_MIN", "metricId": 2253538, "metricName": "DB|Server:169|IO|Data File Average Read Size", "metricPath": "Databases|QA-CARS|IO|Data File Average Read Size", "metricValues": [ { "count": 13, "current": 66013, "max": 72003, "min": 0, "occurrences": 0, "standardDeviation": 0, "startTimeInMillis": 1447929360000, "sum": 198688, "useRange": true, "value": 15284 }]}]
org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of rest.client.ADMetrics out of START_ARRAY token at [Source: java.io.StringReader@78b729e6; line: 1, column: 1]