add gzip support for okhttp

This commit is contained in:
Looly 2023-10-08 23:07:05 +08:00
parent 5aed18a51b
commit b72bbd85e7
5 changed files with 45 additions and 28 deletions

View File

@ -14,6 +14,7 @@ package org.dromara.hutool.http;
import org.dromara.hutool.core.compress.InflaterInputStream;
import org.dromara.hutool.core.map.CaseInsensitiveMap;
import org.dromara.hutool.core.reflect.ConstructorUtil;
import java.io.InputStream;
import java.util.Map;
@ -45,6 +46,26 @@ public enum GlobalCompressStreamRegister {
compressMap.put("deflate", InflaterInputStream.class);
}
/**
* 包装原始响应流为指定压缩算法解压流
*
* @param in 原始响应流
* @param contentEncoding 压缩编码如gzip等
* @return 包装后的响应流
*/
public InputStream wrapStream(final InputStream in, final String contentEncoding){
final Class<? extends InputStream> streamClass = get(contentEncoding);
if (null != streamClass) {
try {
return ConstructorUtil.newInstance(streamClass, in);
} catch (final Exception ignore) {
// 对于构造错误的压缩算法跳过之
}
}
return in;
}
/**
* 获取解压器
*

View File

@ -12,7 +12,6 @@
package org.dromara.hutool.http.client.engine.jdk;
import org.dromara.hutool.core.reflect.ConstructorUtil;
import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.http.GlobalCompressStreamRegister;
import org.dromara.hutool.http.HttpException;
@ -106,14 +105,6 @@ public class JdkHttpInputStream extends InputStream {
return;
}
final String contentEncoding = response.contentEncoding();
final Class<? extends InputStream> streamClass = GlobalCompressStreamRegister.INSTANCE.get(contentEncoding);
if (null != streamClass) {
try {
this.in = ConstructorUtil.newInstance(streamClass, this.in);
} catch (final Exception ignore) {
// 对于构造错误的压缩算法跳过之
}
}
this.in = GlobalCompressStreamRegister.INSTANCE.wrapStream(this.in, response.contentEncoding());
}
}

View File

@ -40,9 +40,7 @@ public class OkHttpEngine implements ClientEngine {
/**
* 构造
*/
public OkHttpEngine() {
this.client = new OkHttpClient();
}
public OkHttpEngine() {}
@Override
public OkHttpEngine init(final ClientConfig config) {

View File

@ -12,12 +12,14 @@
package org.dromara.hutool.http.client.engine.okhttp;
import org.dromara.hutool.core.io.stream.EmptyInputStream;
import org.dromara.hutool.core.util.ObjUtil;
import org.dromara.hutool.http.client.Response;
import kotlin.Pair;
import okhttp3.Headers;
import okhttp3.ResponseBody;
import org.dromara.hutool.core.io.stream.EmptyInputStream;
import org.dromara.hutool.core.util.ObjUtil;
import org.dromara.hutool.http.GlobalCompressStreamRegister;
import org.dromara.hutool.http.client.Response;
import org.dromara.hutool.http.meta.HeaderName;
import java.io.InputStream;
import java.nio.charset.Charset;
@ -77,7 +79,9 @@ public class OkHttpResponse implements Response {
if(null == body){
return EmptyInputStream.INSTANCE;
}
return body.byteStream();
return GlobalCompressStreamRegister.INSTANCE.wrapStream(body.byteStream(),
this.rawRes.header(HeaderName.CONTENT_ENCODING.getValue()));
}
@Override

View File

@ -13,37 +13,40 @@
package org.dromara.hutool.http.client;
import org.dromara.hutool.core.lang.Console;
import org.dromara.hutool.http.client.engine.httpclient5.HttpClient5Engine;
import org.dromara.hutool.http.client.engine.okhttp.OkHttpEngine;
import org.dromara.hutool.http.meta.HeaderName;
import org.dromara.hutool.http.meta.Method;
import org.dromara.hutool.json.JSONUtil;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import java.util.Date;
import java.util.HashMap;
public class XiaohonshuTest {
@Test
@Disabled
void postTest() {
long l = (new Date().getTime());
String sign = "oauth.getAccessToken?appId=880c43b57a97425d9a06&timestamp="+l
+"&version=2.0d9758815286df7a3075d64785df2b890";
final long l = System.currentTimeMillis();
final String sign = "oauth.getAccessToken?appId=880c43b57a97425d9a06&timestamp=" + l
+ "&version=2.0d9758815286df7a3075d64785df2b890";
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("sign",sign);
final HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("sign", sign);
paramMap.put("appId", "880c43b57a97425d9a06"); //880c43b57a97425d9a06
paramMap.put("timestamp", l);
paramMap.put("version", "2.0");
paramMap.put("method", "oauth.getAccessToken");
paramMap.put("code", "code-266ef7f29fff4f0d80d4bd23f579391e-2097e077fad84eb0a5ec4a44a8de1116");
String json = JSONUtil.toJsonStr(paramMap);
final String json = JSONUtil.toJsonStr(paramMap);
Request request = Request.of("https://ark.xiaohongshu.com/ark/open_api/v3/common_controller")
.header(HeaderName.CONTENT_TYPE, "application/json;charset=UTF-8")
final Request request = Request.of("https://ark.xiaohongshu.com/ark/open_api/v3/common_controller")
.header(HeaderName.CONTENT_TYPE, "application/json;charset=UTF-8")
.method(Method.POST)
.header(HeaderName.ACCEPT_ENCODING, "gzip")
.body(json);
Console.log(request.send(new HttpClient5Engine()).bodyStr());
final Response res = request.send(new OkHttpEngine());
Console.log(res.header(HeaderName.CONTENT_ENCODING));
Console.log(res.bodyStr());
}
}