Selaa lähdekoodia

接口开发11.5 修改请求T100请求头为utf8格式

ht 3 tuntia sitten
vanhempi
commit
c403ecbb15

+ 2 - 0
README.md

@@ -283,6 +283,8 @@ Content-Type: application/json
 
 请求体只需要提供 `head` 和 `detail`,服务端会补齐外部接口协议固定字段。
 
+服务端向 ERP/T100 推送单据(包括通用 T100 单据)以及通过 `/api/minglei/ports/replyerp` 回写审批状态时,均使用 UTF-8 编码的 JSON 请求体,并显式发送 `Content-Type: application/json;charset=UTF-8`。
+
 ```json
 {
   "head": {

+ 2 - 1
src/main/java/com/malk/minglei/service/impl/port/MingleiPortServiceImpl.java

@@ -16,6 +16,7 @@ import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 import org.springframework.web.client.RestTemplate;
 
+import java.nio.charset.StandardCharsets;
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.Map;
@@ -94,7 +95,7 @@ public class MingleiPortServiceImpl implements MingleiPortService {
 
     private Map<String, Object> submitDocument(Map<String, Object> parameter, String dataKeyType, String serviceName) {
         HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(MediaType.APPLICATION_JSON);
+        headers.setContentType(new MediaType(MediaType.APPLICATION_JSON, StandardCharsets.UTF_8));
         headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
 
         validateConfiguration();

+ 2 - 1
src/main/java/com/malk/minglei/service/impl/port/ReplyErpServiceImpl.java

@@ -18,6 +18,7 @@ import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 import org.springframework.web.client.RestTemplate;
 
+import java.nio.charset.StandardCharsets;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.Collections;
@@ -68,7 +69,7 @@ public class ReplyErpServiceImpl implements ReplyErpService {
                 request.getProg(), request.getDocno(), request.getStus());
 
         HttpHeaders headers = new HttpHeaders();
-        headers.setContentType(MediaType.APPLICATION_JSON);
+        headers.setContentType(new MediaType(MediaType.APPLICATION_JSON, StandardCharsets.UTF_8));
         headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
 
         Map<String, Object> externalRequest = createExternalRequest(request);

+ 7 - 1
src/test/java/com/malk/minglei/service/impl/port/MingleiPortServiceImplTest.java

@@ -7,6 +7,7 @@ import com.malk.minglei.dto.MingleiPortRequest;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.springframework.http.MediaType;
+import org.springframework.mock.http.client.MockClientHttpRequest;
 import org.springframework.test.web.client.MockRestServiceServer;
 import org.springframework.web.client.RestTemplate;
 
@@ -42,7 +43,7 @@ class MingleiPortServiceImplTest {
     void submitSupplierPriceApprovalForwardsDocumentAndReturnsExternalResponse() throws Exception {
         server.expect(requestTo("http://external.example/wtoptst/ws/r/awsp920"))
                 .andExpect(method(org.springframework.http.HttpMethod.POST))
-                .andExpect(header("Content-Type", MediaType.APPLICATION_JSON_VALUE))
+                .andExpect(header("Content-Type", "application/json;charset=UTF-8"))
                 .andExpect(content().json(externalRequestJson()))
                 .andRespond(withSuccess("{\"srvver\":\"1.0\",\"srvcode\":\"100\",\"datakey\":null,\"payload\":{\"std_data\":{\"execution\":{\"code\":\"0\",\"sql_code\":null,\"description\":\"SUCCESS\"},\"parameter\":{\"pmdidocno\":\"CH3\",\"tran_time\":\"2026-08-25 10:00:00\"}}}}", MediaType.APPLICATION_JSON));
 
@@ -56,11 +57,16 @@ class MingleiPortServiceImplTest {
     void submitT100DocumentUsesDingTalkServiceName() {
         server.expect(requestTo("http://external.example/wtoptst/ws/r/awsp920"))
                 .andExpect(method(org.springframework.http.HttpMethod.POST))
+                .andExpect(header("Content-Type", "application/json;charset=UTF-8"))
                 .andExpect(content().json("{\"service\":{\"name\":\"DingTalk To T100\"},\"datakey\":{\"type\":\"priceSheets\"}}", false))
+                .andExpect(request -> assertEquals("中文备注",
+                        objectMapper.readTree(((MockClientHttpRequest) request).getBodyAsBytes())
+                                .at("/payload/std_data/parameter/remark").asText()))
                 .andRespond(withSuccess("{}", MediaType.APPLICATION_JSON));
 
         Map<String, Object> parameter = new LinkedHashMap<String, Object>();
         parameter.put("head", Collections.singletonMap("pmaaucent", "86"));
+        parameter.put("remark", "中文备注");
         mingleiPortService.submitT100Document(parameter, "priceSheets", "DingTalk To T100");
 
         server.verify();

+ 5 - 1
src/test/java/com/malk/minglei/service/impl/port/ReplyErpServiceImplTest.java

@@ -7,6 +7,7 @@ import com.malk.minglei.dto.ReplyErpRequest;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.springframework.http.MediaType;
+import org.springframework.mock.http.client.MockClientHttpRequest;
 import org.springframework.test.web.client.MockRestServiceServer;
 import org.springframework.web.client.RestTemplate;
 
@@ -42,13 +43,16 @@ class ReplyErpServiceImplTest {
     void replyErpForwardsApprovalResultAndReturnsExternalResponse() throws Exception {
         server.expect(requestTo("http://external.example/wtoptst/ws/r/awsp920"))
                 .andExpect(method(org.springframework.http.HttpMethod.POST))
-                .andExpect(header("Content-Type", MediaType.APPLICATION_JSON_VALUE))
+                .andExpect(header("Content-Type", "application/json;charset=UTF-8"))
                 .andExpect(jsonPath("$.key").value("key-1"))
                 .andExpect(jsonPath("$.host.timestamp").value(matchesPattern("\\d{17}")))
                 .andExpect(jsonPath("$.service.name").value("Yes Or No"))
                 .andExpect(jsonPath("$.payload.std_data.parameter.prog").value("axmt500"))
                 .andExpect(jsonPath("$.payload.std_data.parameter.docno").value("MLXSF260900167"))
                 .andExpect(jsonPath("$.payload.std_data.parameter.stus").value("Y"))
+                .andExpect(request -> assertEquals("审批通过",
+                        objectMapper.readTree(((MockClientHttpRequest) request).getBodyAsBytes())
+                                .at("/payload/std_data/parameter/ref").asText()))
                 .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
                 .andRespond(withSuccess("{\"srvcode\":\"000\"}", MediaType.APPLICATION_JSON));