/src/main/java/com/huobi/service/huobi/signature/UrlParamsBuilder.java

https://github.com/HuobiRDCenter/huobi_Java · Java · 208 lines · 158 code · 44 blank · 6 comment · 21 complexity · 7515898f6bbdff26b32f461b0cd09fb2 MD5 · raw file

  1. package com.huobi.service.huobi.signature;
  2. import java.io.UnsupportedEncodingException;
  3. import java.math.BigDecimal;
  4. import java.net.URLEncoder;
  5. import java.text.SimpleDateFormat;
  6. import java.util.Date;
  7. import java.util.HashMap;
  8. import java.util.List;
  9. import java.util.Map;
  10. import java.util.TreeMap;
  11. import com.alibaba.fastjson.JSON;
  12. import okhttp3.MediaType;
  13. import okhttp3.RequestBody;
  14. import com.huobi.exception.SDKException;
  15. public class UrlParamsBuilder {
  16. class ParamsMap {
  17. final Map<String, String> map = new HashMap<>();
  18. final Map<String, List> stringListMap = new HashMap<>();
  19. void put(String name, String value) {
  20. if (name == null || "".equals(name)) {
  21. throw new SDKException(SDKException.RUNTIME_ERROR,
  22. "[URL] Key can not be null");
  23. }
  24. if (value == null || "".equals(value)) {
  25. return;
  26. }
  27. map.put(name, value);
  28. }
  29. void put(String name, Integer value) {
  30. put(name, value != null ? Integer.toString(value) : null);
  31. }
  32. void put(String name, Date value, String format) {
  33. SimpleDateFormat dateFormatter = new SimpleDateFormat(format);
  34. put(name, value != null ? dateFormatter.format(value) : null);
  35. }
  36. void put(String name, Long value) {
  37. put(name, value != null ? Long.toString(value) : null);
  38. }
  39. void put(String name, BigDecimal value) {
  40. put(name, value != null ? value.toPlainString() : null);
  41. }
  42. }
  43. private static final MediaType JSON_TYPE = MediaType.parse("application/json");
  44. private final ParamsMap paramsMap = new ParamsMap();
  45. private final ParamsMap postBodyMap = new ParamsMap();
  46. private boolean postMode = false;
  47. public static UrlParamsBuilder build() {
  48. return new UrlParamsBuilder();
  49. }
  50. private UrlParamsBuilder() {
  51. }
  52. public UrlParamsBuilder setPostMode(boolean mode) {
  53. postMode = mode;
  54. return this;
  55. }
  56. public <T extends Enum> UrlParamsBuilder putToUrl(String name, T value) {
  57. if (value != null) {
  58. paramsMap.put(name, value.toString());
  59. }
  60. return this;
  61. }
  62. public UrlParamsBuilder putToUrl(String name, String value) {
  63. paramsMap.put(name, value);
  64. return this;
  65. }
  66. public UrlParamsBuilder putToUrl(String name, Date value, String format) {
  67. paramsMap.put(name, value, format);
  68. return this;
  69. }
  70. public UrlParamsBuilder putToUrl(String name, Integer value) {
  71. paramsMap.put(name, value);
  72. return this;
  73. }
  74. public UrlParamsBuilder putToUrl(String name, Long value) {
  75. paramsMap.put(name, value);
  76. return this;
  77. }
  78. public UrlParamsBuilder putToUrl(String name, BigDecimal value) {
  79. paramsMap.put(name, value);
  80. return this;
  81. }
  82. public UrlParamsBuilder putToPost(String name, String value) {
  83. postBodyMap.put(name, value);
  84. return this;
  85. }
  86. public <T extends Enum> UrlParamsBuilder putToPost(String name, T value) {
  87. if (value != null) {
  88. postBodyMap.put(name, value.toString());
  89. }
  90. return this;
  91. }
  92. public UrlParamsBuilder putToPost(String name, Date value, String format) {
  93. postBodyMap.put(name, value, format);
  94. return this;
  95. }
  96. public UrlParamsBuilder putToPost(String name, Integer value) {
  97. postBodyMap.put(name, value);
  98. return this;
  99. }
  100. public <T> UrlParamsBuilder putToPost(String name, List list) {
  101. postBodyMap.stringListMap.put(name, list);
  102. return this;
  103. }
  104. public UrlParamsBuilder putToPost(String name, Long value) {
  105. postBodyMap.put(name, value);
  106. return this;
  107. }
  108. public UrlParamsBuilder putToPost(String name, BigDecimal value) {
  109. postBodyMap.put(name, value);
  110. return this;
  111. }
  112. public String buildUrl() {
  113. Map<String, String> map = new HashMap<>(paramsMap.map);
  114. StringBuilder head = new StringBuilder("?");
  115. return AppendUrl(map, head);
  116. }
  117. public String buildSignature() {
  118. Map<String, String> map = new TreeMap<>(paramsMap.map);
  119. StringBuilder head = new StringBuilder();
  120. return AppendUrl(map, head);
  121. }
  122. private String AppendUrl(Map<String, String> map, StringBuilder stringBuilder) {
  123. for (Map.Entry<String, String> entry : map.entrySet()) {
  124. if (!("").equals(stringBuilder.toString())) {
  125. stringBuilder.append("&");
  126. }
  127. stringBuilder.append(entry.getKey());
  128. stringBuilder.append("=");
  129. stringBuilder.append(urlEncode(entry.getValue()));
  130. }
  131. return stringBuilder.toString();
  132. }
  133. public RequestBody buildPostBody() {
  134. if (postBodyMap.stringListMap.isEmpty()) {
  135. if (postBodyMap.map.isEmpty()) {
  136. return RequestBody.create(JSON_TYPE, "");
  137. } else {
  138. return RequestBody.create(JSON_TYPE, JSON.toJSONString(postBodyMap.map));
  139. }
  140. } else {
  141. return RequestBody.create(JSON_TYPE, JSON.toJSONString(postBodyMap.stringListMap));
  142. }
  143. }
  144. public boolean hasPostParam() {
  145. return !postBodyMap.map.isEmpty() || postMode;
  146. }
  147. public String buildUrlToJsonString() {
  148. return JSON.toJSONString(paramsMap.map);
  149. }
  150. /**
  151. * 使用标准URL Encode编码。注意和JDK默认的不同,空格被编码为%20而不是+。
  152. *
  153. * @param s String字符串
  154. * @return URL编码后的字符串
  155. */
  156. private static String urlEncode(String s) {
  157. try {
  158. return URLEncoder.encode(s, "UTF-8").replaceAll("\\+", "%20");
  159. } catch (UnsupportedEncodingException e) {
  160. throw new SDKException(SDKException.RUNTIME_ERROR,
  161. "[URL] UTF-8 encoding not supported!");
  162. }
  163. }
  164. }