Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 4bd2af8

Browse files
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)

AltStyle によって変換されたページ (->オリジナル) /