如何在Spring-Web中使用RestTemplate解析gzip编码的响应

在修改了Consuming RESTful Web Service示例以从api.stackexchange.com

调用id来获取用户之后,我得到了JsonParseException:

com.fasterxml.jackson.core.JsonParseException: Illegal character ((CTRL-CHAR,

code 31)): only regular white space (\r, \n, \t) is allowed between tokens

响应来自api.stackexchange.comgzip压缩。

我正在使用Spring Boot Parent Ver。1.3.1.RELEASE因此,Spring-Web4.2.4-RELEASE

这是我调整后的示例:

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-与示例相同

<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>

回答:

用来自Apache HttpClient的默认requestFactory替换默认的requestFactory(它将动态解码GZIP):

HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(

HttpClientBuilder.create().build());

RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory);

将Apache Http Client添加到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>

以上是 如何在Spring-Web中使用RestTemplate解析gzip编码的响应 的全部内容, 来源链接: utcz.com/qa/428098.html

回到顶部