Skip to content

Commit 9de9c9b

Browse files
committed
Server:解决代理接口 /delegate 转发请求时丢失 URL parameter 参数
1 parent 1b47ee7 commit 9de9c9b

File tree

1 file changed

+35
-7
lines changed
  • APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/server

1 file changed

+35
-7
lines changed

APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/server/Controller.java

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,12 @@
2727
import java.util.ArrayList;
2828
import java.util.Arrays;
2929
import java.util.Enumeration;
30+
import java.util.HashMap;
3031
import java.util.List;
32+
import java.util.Map;
33+
import java.util.Map.Entry;
3134
import java.util.Random;
35+
import java.util.Set;
3236
import java.util.concurrent.TimeoutException;
3337

3438
import javax.servlet.http.HttpServletRequest;
@@ -1025,16 +1029,40 @@ public String delegate(
10251029
headers.put(COOKIE, c);
10261030
}
10271031
}
1028-
try {
1029-
request.getParameterMap().remove("$_delegate_url");
1030-
} catch (Exception e) {
1031-
// TODO: handle exception
1032+
1033+
//可能是 HTTP POST FORM,即便是 HTTP POST JSON,URL 的参数也要拼接,尽可能保持原样 if (method == HttpMethod.GET) {
1034+
Map<String, String[]> map = request.getParameterMap();
1035+
1036+
if (map != null) {
1037+
map = new HashMap<>(map); //解决 throw exception: Unmodified Map
1038+
map.remove("$_except_headers");
1039+
map.remove("$_delegate_url");
1040+
1041+
Set<Entry<String, String[]>> set = map == null ? null : map.entrySet();
1042+
1043+
if (set != null && set.isEmpty() == false) {
1044+
1045+
if (url.contains("?") == false) {
1046+
url += "?";
1047+
}
1048+
boolean first = url.endsWith("?");
1049+
1050+
for (Entry<String, String[]> e : set) {
1051+
if (e != null) {
1052+
url += ((first ? "" : "&") + e.getKey() + "=" + ( e.getValue() == null || e.getValue().length <= 0 ? "" : StringUtil.getString(e.getValue()[0]) ));
1053+
first = false;
1054+
}
1055+
}
1056+
}
10321057
}
1058+
// }
10331059

10341060
RestTemplate client = new RestTemplate();
1035-
// 请勿轻易改变此提交方式,大部分的情况下,提交方式都是表单提交
1036-
HttpEntity<String> requestEntity = new HttpEntity<>(method == HttpMethod.GET ? JSON.toJSONString(request.getParameterMap()) : body, headers);
1037-
// 执行HTTP请求
1061+
// 请勿轻易改变此提交方式,大部分的情况下,提交方式都是表单提交
1062+
HttpEntity<String> requestEntity = new HttpEntity<>(method == HttpMethod.GET ? null : body, headers);
1063+
// 执行HTTP请求,这里可能抛异常,不要包装,直接让它抛,能够在浏览器 Console/XHR/{i}/Preview
1064+
// 看到 error: "Internal Server Error" message: "405 null" 之类的包括信息,
1065+
// 包装后反而容易混淆,并且会因为 JSON 结构不一致导致解析问题
10381066
ResponseEntity<String> entity = client.exchange(url, method, requestEntity, String.class);
10391067

10401068
HttpHeaders hs = entity.getHeaders();

0 commit comments

Comments
 (0)