After I modified Consuming a RESTful Web Service example to call get users by id from api.stackexchange.com I get JsonParseException:
com.fasterxml.jackson.core.JsonParseException: Illegal character ((CTRL-CHAR, code 31)): only regular white space (\r, \n, \t) is allowed between tokens
Response from api.stackexchange.com
is gzip compressed.
How to add support for gzip compressed response into Spring-Web RestTemplate?
I am using Spring boot parent ver. 1.3.1.RELEASE
hence Spring-Web 4.2.4-RELEASE
Here’s my adjusted example:
User.java
package stackexchange.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonNaming(LowerCaseWithUnderscoresStrategy.class)
public class User {
// Properties made public in order to shorten the example
public int userId;
public String displayName;
public int reputation;
@Override
public String toString() {
return "user{"
+ "display_name='" + displayName + '\''
+ "reputation='" + reputation + '\''
+ "user_id='" + userId + '\''
+ '}';
}
}
CommonWrapper.java
package stackexchange.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonNaming(LowerCaseWithUnderscoresStrategy.class)
public class CommonWrapper {
// Properties made public in order to shorten the example
public boolean hasMore;
// an array of the type found in type
public User[] items;
public int page;
public int pageSize;
public int quotaMax;
public int quotaRemaining;
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for (User user : items) {
sb.append("{" + user.toString() + "}\n");
}
return "common_wrapper{"
+ "\"items\"=[\n"
+ sb
+ "]"
+ "has_more='" + hasMore + '\''
+ "page='" + page + '\''
+ "page_size='" + pageSize + '\''
+ "quota_max='" + quotaMax + '\''
+ "quota_remaining='" + quotaRemaining + '\''
+ '}';
}
}
StackExchange.java
package stackexchange;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.web.client.RestTemplate;
import stackexchange.dto.CommonWrapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
@JsonNaming(LowerCaseWithUnderscoresStrategy.class)
public class StackExchange implements CommandLineRunner{
private static final Logger log = LoggerFactory.getLogger(StackExchange.class);
public static void main(String args[]) {
SpringApplication.run(StackExchange.class);
}
@Override
public void run(String... strings) throws Exception {
RestTemplate restTemplate = new RestTemplate();
CommonWrapper response = restTemplate
.getForObject(
"https://api.stackexchange.com/2.2/users/4607349?site=stackoverflow",
CommonWrapper.class);
log.info(response.toString());
}
}
pom.xml - same as in example
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>stackexchangetest</groupId>
<artifactId>stackexchangetest</artifactId>
<version>0.0.1</version>
<name>stackexchangetest</name>
<description>api.stackexchange.com Test</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.1.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
You can use the annotation @JsonRootName to specify the root element in your response. So try this: @JsonIgnoreProperties(ignoreUnknown = true) @JsonRootName(value ="result") public class User { public User(){ } private boolean admin; .... }
You can tell using Developer Tools (F12). Go to the Network tab, select the file you want to examine and then look at the Headers tab on the right. If you are gzipped, then you will see that in the Content-Encoding.
Replace the default requestFactory with one from Apache HttpClient (which decodes GZIP on the fly):
HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(
HttpClientBuilder.create().build());
RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory);
Add Apache Http Client into pom.xml
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<!--Version is not needed when used with Spring Boot parent pom file -->
<version>4.5.1</version>
</dependency>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With