Skip to content

Commit 4bd2af8

Browse files
committed
Java:MultiDataSource 解决 CVAuto 下载 Excel 报告时调用 Nodejs 接口来生成渲染图时接收不到完整 request body
1 parent 64eb0e9 commit 4bd2af8

File tree

5 files changed

+64
-10
lines changed

5 files changed

+64
-10
lines changed

APIJSON-Java-Server/APIJSONBoot-MultiDataSource/pom.xml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -318,11 +318,11 @@
318318

319319

320320
<!-- DemoController /delegate 代理转发请求 HTTP PATCH 方法需要,使用 PATCH 可以取消注释 -->
321-
<!-- <dependency>-->
322-
<!-- <groupId>org.apache.httpcomponents.client5</groupId>-->
323-
<!-- <artifactId>httpclient5</artifactId>-->
324-
<!-- <version>5.3</version>-->
325-
<!-- </dependency>-->
321+
<dependency>
322+
<groupId>org.apache.httpcomponents.client5</groupId>
323+
<artifactId>httpclient5</artifactId>
324+
<version>5.3</version>
325+
</dependency>
326326

327327
<!-- &lt;!&ndash; 需要用的 HikariCP 数据库连接池库,3.1.0 以上 &ndash;&gt;-->
328328
<!-- <dependency>-->

APIJSON-Java-Server/APIJSONBoot-MultiDataSource/src/main/java/apijson/boot/DemoController.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
import jakarta.servlet.AsyncContext;
2626
import jakarta.servlet.ServletResponse;
27+
import org.jetbrains.annotations.NotNull;
2728
import org.springframework.beans.factory.annotation.Autowired;
2829
import org.springframework.http.*;
2930
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
@@ -37,6 +38,7 @@
3738
import java.lang.reflect.Method;
3839
import java.net.URLDecoder;
3940
import java.net.URLEncoder;
41+
import java.nio.charset.StandardCharsets;
4042
import java.rmi.ServerException;
4143
import java.sql.PreparedStatement;
4244
import java.sql.ResultSet;
@@ -1875,6 +1877,18 @@ else if (recordType > 0) {
18751877
CLIENT.getMessageConverters().forEach(converter -> {
18761878
if (converter instanceof StringHttpMessageConverter) {
18771879
((StringHttpMessageConverter) converter).setWriteAcceptCharset(false);
1880+
// 设置更大的缓冲区来处理大文本
1881+
((StringHttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8);
1882+
}
1883+
});
1884+
1885+
// 添加自定义的消息转换器来处理大文本
1886+
CLIENT.getMessageConverters().add(0, new StringHttpMessageConverter(StandardCharsets.UTF_8) {
1887+
@NotNull
1888+
@Override
1889+
protected Long getContentLength(String s, MediaType contentType) {
1890+
// 对于大文本,返回 null 让HTTP客户端自动处理分块传输
1891+
return s.length() > 1024 * 1024 ? -1L : super.getContentLength(s, contentType);
18781892
}
18791893
});
18801894
}
@@ -1886,6 +1900,32 @@ else if (recordType > 0) {
18861900
protected String sendRequest(HttpSession session, HttpMethod method, String url, String body, HttpHeaders headers) {
18871901
String rspBody = null;
18881902
try {
1903+
// 为JSON请求设置默认的Content-Type
1904+
if (body != null && method != HttpMethod.GET && !headers.containsKey(HttpHeaders.CONTENT_TYPE)) {
1905+
// 尝试解析JSON来判断内容类型
1906+
try {
1907+
JSON.parse(body);
1908+
headers.setContentType(MediaType.APPLICATION_JSON);
1909+
} catch (Exception e) {
1910+
// 如果不是JSON,设置为普通文本
1911+
headers.setContentType(MediaType.TEXT_PLAIN);
1912+
}
1913+
}
1914+
1915+
// 设置默认的Accept header
1916+
if (!headers.containsKey(HttpHeaders.ACCEPT)) {
1917+
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN));
1918+
}
1919+
1920+
// 为大文本body,设置适当的Content-Type和分块传输
1921+
if (body != null && body.length() > 1024 * 1024) { // 超过1MB
1922+
if (!headers.containsKey(HttpHeaders.CONTENT_TYPE)) {
1923+
headers.setContentType(MediaType.TEXT_PLAIN);
1924+
}
1925+
// 设置分块传输
1926+
headers.set(HttpHeaders.TRANSFER_ENCODING, "chunked");
1927+
}
1928+
18891929
HttpEntity<String> requestEntity = new HttpEntity<>(method == HttpMethod.GET ? null : body, headers);
18901930
ResponseEntity<String> entity = CLIENT.exchange(url, method, requestEntity, String.class);
18911931

APIJSON-Java-Server/APIJSONBoot-MultiDataSource/src/main/java/apijson/boot/FileController.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,9 +360,23 @@ public ResponseEntity<Object> downloadCVReport(@PathVariable(name = "id") String
360360
JSONObject renderReq = new JSONObject();
361361
renderReq.put("img", img);
362362
renderReq.put("data", resObj);
363-
renderReq.put("wrongs", testRecord.getJSONArray("wrongs"));
363+
renderReq.put("wrongs", testRecord.get("wrongs"));
364364
String body = renderReq.toJSONString();
365+
366+
// 设置完整的HTTP headers
365367
HttpHeaders headers = new HttpHeaders();
368+
headers.setContentType(MediaType.APPLICATION_JSON);
369+
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
370+
headers.set("User-Agent", "APIJSON-Server/1.0");
371+
headers.set("X-Requested-With", "XMLHttpRequest");
372+
373+
// 如果body很大,设置适当的headers来支持大文件传输
374+
if (body.length() > 1024 * 1024) { // 超过1MB
375+
headers.set("Transfer-Encoding", "chunked");
376+
} else {
377+
headers.setContentLength(body.length());
378+
}
379+
366380
String renderStr = demoController.sendRequest(session, HttpMethod.POST, "http://localhost:3003/cv/render", body, headers);
367381
renderStr = StringUtil.trim(renderStr);
368382
if (renderStr.length() > 100) {

APIJSON-Java-Server/APIJSONBoot-MultiDataSource/src/main/resources/application.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
spring:
22
servlet:
33
multipart:
4-
max-file-size: 10MB
5-
max-request-size: 10MB
4+
max-file-size: 50MB
5+
max-request-size: 50MB
66
enabled: true
77
file-size-threshold: 2KB
88
# If using flyway-core dependency, either comment this out or use @FlywayDatasource in DemoDataSourceConfig

APIJSON-Java-Server/APIJSONBoot-MultiDataSource/src/main/resources/static/cv/js/server.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,15 +199,15 @@ app.use(async ctx => {
199199
// while (! done[0]) {
200200
// }
201201
}
202-
else if (ctx.path == '/cv/render') {
202+
else if (ctx.path == '/cv/render') {
203203
// done = [false];
204204
// var json = '';
205205
// ctx.req.addListener('data', (data) => {
206206
// json += data;
207207
// })
208208
// ctx.req.addListener('end', function() {
209209
// console.log(json);
210-
var body = ctx.body || ctx.req.body || ctx.request.body|| {}; // || JSON.parse(json) || {};
210+
var body = ctx.body || ctx.req.body || ctx.request.body || {}; // || JSON.parse(json) || {};
211211
if (DEBUG) {
212212
console.log('\n\n <<<<<<< body = ' + body);
213213
console.log('\n\n <<<<<<< body = ' + JSON.stringify(body));

0 commit comments

Comments
 (0)