ソースを参照

fix 修改 HTTP 请求包内容

Young 2 年 前
コミット
62f6347162

+ 35 - 0
support-http/src/main/java/cn/nosum/http/SimpleDownloadRequestExecutor.java

@@ -0,0 +1,35 @@
+package cn.nosum.http;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+
+/**
+ * 简单文件下载抽象实现.
+ *
+ * @param <H> 请求对象
+ * @param <P> 代理对象
+ * @author Young
+ */
+public abstract class SimpleDownloadRequestExecutor<H, P> extends SimpleGetRequestExecutor<H, P, OutputStream> {
+
+    public SimpleDownloadRequestExecutor(RequestHttp<H, P> requestHttp) {
+        super(requestHttp);
+    }
+
+    public SimpleDownloadRequestExecutor(RequestHttp<H, P> requestHttp, ResponseHandler<OutputStream> responseHandler) {
+        super(requestHttp, responseHandler);
+    }
+
+    protected OutputStream transfer(InputStream inputStream) throws IOException {
+        OutputStream output = new ByteArrayOutputStream();
+        byte[] buffer = new byte[4096];
+        int n;
+        while (-1 != (n = inputStream.read(buffer))) {
+            output.write(buffer, 0, n);
+        }
+        return output;
+    }
+}

+ 1 - 2
support-http/src/main/java/cn/nosum/http/SimpleRequestExecutor.java

@@ -1,6 +1,5 @@
 package cn.nosum.http;
 
-import cn.nosum.http.entity.UploadRequest;
 import cn.nosum.http.exception.HttpErrorException;
 
 import java.io.IOException;
@@ -53,6 +52,6 @@ public abstract class SimpleRequestExecutor<H, P, T, R> implements RequestExecut
      * @throws HttpErrorException 自定义异常
      * @throws IOException        io异常
      */
-    public abstract String doExecute(String uri, T data) throws HttpErrorException, IOException;
+    public abstract R doExecute(String uri, T data) throws HttpErrorException, IOException;
 
 }

+ 58 - 0
support-http/src/main/java/cn/nosum/http/apache/ApacheDownloadRequestExecutor.java

@@ -0,0 +1,58 @@
+package cn.nosum.http.apache;
+
+import cn.nosum.http.RequestHttp;
+import cn.nosum.http.ResponseHandler;
+import cn.nosum.http.SimpleDownloadRequestExecutor;
+import cn.nosum.http.exception.HttpErrorException;
+import org.apache.http.Header;
+import org.apache.http.HttpHost;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.entity.ContentType;
+import org.apache.http.impl.client.CloseableHttpClient;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+
+/**
+ * APACHE 下载请求封装.
+ *
+ * @author Young
+ */
+public class ApacheDownloadRequestExecutor extends SimpleDownloadRequestExecutor<CloseableHttpClient, HttpHost> {
+
+
+    public ApacheDownloadRequestExecutor(RequestHttp<CloseableHttpClient, HttpHost> requestHttp) {
+        super(requestHttp);
+    }
+
+    public ApacheDownloadRequestExecutor(RequestHttp<CloseableHttpClient, HttpHost> requestHttp, ResponseHandler<OutputStream> responseHandler) {
+        super(requestHttp, responseHandler);
+    }
+
+    @Override
+    public OutputStream doExecute(String uri, String data) throws HttpErrorException, IOException {
+        HttpGet httpGet = new HttpGet(uri);
+        if (requestHttp.getRequestHttpProxy() != null) {
+            RequestConfig config = RequestConfig.custom().setProxy(requestHttp.getRequestHttpProxy()).build();
+            httpGet.setConfig(config);
+        }
+
+        try (CloseableHttpResponse response = requestHttp.getRequestHttpClient().execute(httpGet);
+             InputStream inputStream = InputStreamResponseHandler.INSTANCE.handleResponse(response)) {
+            Header[] contentTypeHeader = response.getHeaders("Content-Type");
+            if (contentTypeHeader != null && contentTypeHeader.length > 0) {
+                // application/json; encoding=utf-8 下载媒体文件出错
+                if (contentTypeHeader[0].getValue().startsWith(ContentType.APPLICATION_JSON.getMimeType())) {
+                    throw new HttpErrorException(Utf8ResponseHandler.INSTANCE.handleResponse(response));
+                }
+            }
+            return transfer(inputStream);
+        } finally {
+            httpGet.releaseConnection();
+        }
+    }
+}

+ 62 - 0
support-http/src/main/java/cn/nosum/http/jodd/JoddDownloadRequestExecutor.java

@@ -0,0 +1,62 @@
+package cn.nosum.http.jodd;
+
+
+import cn.nosum.http.RequestHttp;
+import cn.nosum.http.ResponseHandler;
+import cn.nosum.http.SimpleDownloadRequestExecutor;
+import cn.nosum.http.exception.HttpErrorException;
+import cn.nosum.http.proxy.HttpResponseProxy;
+import jodd.http.HttpConnectionProvider;
+import jodd.http.HttpRequest;
+import jodd.http.HttpResponse;
+import jodd.http.ProxyInfo;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.charset.StandardCharsets;
+
+
+/**
+ * JODD 下载请求封装.
+ *
+ * @author Young
+ */
+public class JoddDownloadRequestExecutor extends SimpleDownloadRequestExecutor<HttpConnectionProvider, ProxyInfo> {
+
+    public JoddDownloadRequestExecutor(RequestHttp<HttpConnectionProvider, ProxyInfo> requestHttp) {
+        super(requestHttp);
+    }
+
+    public JoddDownloadRequestExecutor(RequestHttp<HttpConnectionProvider, ProxyInfo> requestHttp, ResponseHandler<OutputStream> responseHandler) {
+        super(requestHttp, responseHandler);
+    }
+
+    @Override
+    public OutputStream doExecute(String uri, String data) throws HttpErrorException, IOException {
+        HttpRequest request = HttpRequest.get(uri);
+        if (requestHttp.getRequestHttpProxy() != null) {
+            requestHttp.getRequestHttpClient().useProxy(requestHttp.getRequestHttpProxy());
+        }
+        request.withConnectionProvider(requestHttp.getRequestHttpClient());
+
+        HttpResponse response = request.send();
+        response.charset(StandardCharsets.UTF_8.name());
+
+        String contentType = response.header("Content-Type");
+        // application/json; encoding=utf-8 下载媒体文件出错
+        if (contentType != null && contentType.startsWith("application/json")) {
+            throw new HttpErrorException(response.bodyText());
+        }
+
+        String fileName = new HttpResponseProxy(response).getFileName();
+        if (StringUtils.isBlank(fileName)) {
+            return null;
+        }
+        try (InputStream inputStream = new ByteArrayInputStream(response.bodyBytes())) {
+            return transfer(inputStream);
+        }
+    }
+}

+ 46 - 0
support-http/src/main/java/cn/nosum/http/okhttp/OkHttpDownloadRequestExecutor.java

@@ -0,0 +1,46 @@
+package cn.nosum.http.okhttp;
+
+import cn.nosum.http.RequestHttp;
+import cn.nosum.http.ResponseHandler;
+import cn.nosum.http.SimpleDownloadRequestExecutor;
+import cn.nosum.http.exception.HttpErrorException;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Objects;
+
+/**
+ * OKHTTP 下载请求封装.
+ *
+ * @author Young
+ */
+public class OkHttpDownloadRequestExecutor extends SimpleDownloadRequestExecutor<OkHttpClient, OkHttpProxyInfo> {
+
+
+    public OkHttpDownloadRequestExecutor(RequestHttp<OkHttpClient, OkHttpProxyInfo> requestHttp) {
+        super(requestHttp);
+    }
+
+    public OkHttpDownloadRequestExecutor(RequestHttp<OkHttpClient, OkHttpProxyInfo> requestHttp, ResponseHandler<OutputStream> responseHandler) {
+        super(requestHttp, responseHandler);
+    }
+
+    @Override
+    public OutputStream doExecute(String uri, String data) throws HttpErrorException, IOException {
+        OkHttpClient client = requestHttp.getRequestHttpClient();
+        Request request = new Request.Builder().url(uri).get().build();
+        Response response = client.newCall(request).execute();
+        String contentType = response.header("Content-Type");
+        // application/json; encoding=utf-8 下载媒体文件出错
+        if (contentType != null && contentType.startsWith("application/json")) {
+            throw new HttpErrorException(Objects.requireNonNull(response.body()).string());
+        }
+        try (InputStream input = Objects.requireNonNull(response.body()).byteStream()) {
+            return transfer(input);
+        }
+    }
+}