vars.go 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. package dartgen
  2. import "text/template"
  3. var funcMap = template.FuncMap{
  4. "getBaseName": getBaseName,
  5. "getPropertyFromMember": getPropertyFromMember,
  6. "isDirectType": isDirectType,
  7. "isAtomicType": isAtomicType,
  8. "isNumberType": isNumberType,
  9. "isClassListType": isClassListType,
  10. "isAtomicListType": isAtomicListType,
  11. "isListItemsNullable": isListItemsNullable,
  12. "isNullableType": isNullableType,
  13. "appendNullCoalescing": appendNullCoalescing,
  14. "appendDefaultEmptyValue": appendDefaultEmptyValue,
  15. "getCoreType": getCoreType,
  16. "lowCamelCase": lowCamelCase,
  17. "normalizeHandlerName": normalizeHandlerName,
  18. "hasUrlPathParams": hasUrlPathParams,
  19. "extractPositionalParamsFromPath": extractPositionalParamsFromPath,
  20. "makeDartRequestUrlPath": makeDartRequestUrlPath,
  21. }
  22. const (
  23. apiFileContent = `import 'dart:io';
  24. import 'dart:convert';
  25. import '../vars/kv.dart';
  26. import '../vars/vars.dart';
  27. /// 发送POST请求.
  28. ///
  29. /// data:为你要post的结构体,我们会帮你转换成json字符串;
  30. /// ok函数:请求成功的时候调用,fail函数:请求失败的时候会调用,eventually函数:无论成功失败都会调用
  31. Future apiPost(String path, dynamic data,
  32. {Map<String, String> header,
  33. Function(Map<String, dynamic>) ok,
  34. Function(String) fail,
  35. Function eventually}) async {
  36. await _apiRequest('POST', path, data,
  37. header: header, ok: ok, fail: fail, eventually: eventually);
  38. }
  39. /// 发送GET请求.
  40. ///
  41. /// ok函数:请求成功的时候调用,fail函数:请求失败的时候会调用,eventually函数:无论成功失败都会调用
  42. Future apiGet(String path,
  43. {Map<String, String> header,
  44. Function(Map<String, dynamic>) ok,
  45. Function(String) fail,
  46. Function eventually}) async {
  47. await _apiRequest('GET', path, null,
  48. header: header, ok: ok, fail: fail, eventually: eventually);
  49. }
  50. Future _apiRequest(String method, String path, dynamic data,
  51. {Map<String, String> header,
  52. Function(Map<String, dynamic>) ok,
  53. Function(String) fail,
  54. Function eventually}) async {
  55. var tokens = await getTokens();
  56. try {
  57. var client = HttpClient();
  58. HttpClientRequest r;
  59. if (method == 'POST') {
  60. r = await client.postUrl(Uri.parse(serverHost + path));
  61. } else {
  62. r = await client.getUrl(Uri.parse(serverHost + path));
  63. }
  64. var strData = '';
  65. if (data != null) {
  66. strData = jsonEncode(data);
  67. }
  68. if (method == 'POST') {
  69. r.headers.set('Content-Type', 'application/json; charset=utf-8');
  70. r.headers.set('Content-Length', utf8.encode(strData).length);
  71. }
  72. if (tokens != null) {
  73. r.headers.set('Authorization', tokens.accessToken);
  74. }
  75. if (header != null) {
  76. header.forEach((k, v) {
  77. r.headers.set(k, v);
  78. });
  79. }
  80. r.write(strData);
  81. var rp = await r.close();
  82. var body = await rp.transform(utf8.decoder).join();
  83. print('${rp.statusCode} - $path');
  84. print('-- request --');
  85. print(strData);
  86. print('-- response --');
  87. print('$body \n');
  88. if (rp.statusCode == 404) {
  89. if (fail != null) fail('404 not found');
  90. } else {
  91. Map<String, dynamic> base = jsonDecode(body);
  92. if (rp.statusCode == 200) {
  93. if (base['code'] != 0) {
  94. if (fail != null) fail(base['desc']);
  95. } else {
  96. if (ok != null) ok(base['data']);
  97. }
  98. } else if (base['code'] != 0) {
  99. if (fail != null) fail(base['desc']);
  100. }
  101. }
  102. } catch (e) {
  103. if (fail != null) fail(e.toString());
  104. }
  105. if (eventually != null) eventually();
  106. }
  107. `
  108. apiFileContentV2 = `import 'dart:io';
  109. import 'dart:convert';
  110. import '../vars/kv.dart';
  111. import '../vars/vars.dart';
  112. /// send request with post method
  113. ///
  114. /// data: any request class that will be converted to json automatically
  115. /// ok: is called when request succeeds
  116. /// fail: is called when request fails
  117. /// eventually: is always called until the nearby functions returns
  118. Future apiPost(String path, dynamic data,
  119. {Map<String, String>? header,
  120. Function(Map<String, dynamic>)? ok,
  121. Function(String)? fail,
  122. Function? eventually}) async {
  123. await _apiRequest('POST', path, data,
  124. header: header, ok: ok, fail: fail, eventually: eventually);
  125. }
  126. /// send request with get method
  127. ///
  128. /// ok: is called when request succeeds
  129. /// fail: is called when request fails
  130. /// eventually: is always called until the nearby functions returns
  131. Future apiGet(String path,
  132. {Map<String, String>? header,
  133. Function(Map<String, dynamic>)? ok,
  134. Function(String)? fail,
  135. Function? eventually}) async {
  136. await _apiRequest('GET', path, null,
  137. header: header, ok: ok, fail: fail, eventually: eventually);
  138. }
  139. Future _apiRequest(String method, String path, dynamic data,
  140. {Map<String, String>? header,
  141. Function(Map<String, dynamic>)? ok,
  142. Function(String)? fail,
  143. Function? eventually}) async {
  144. var tokens = await getTokens();
  145. try {
  146. var client = HttpClient();
  147. HttpClientRequest r;
  148. if (method == 'POST') {
  149. r = await client.postUrl(Uri.parse(serverHost + path));
  150. } else {
  151. r = await client.getUrl(Uri.parse(serverHost + path));
  152. }
  153. var strData = '';
  154. if (data != null) {
  155. strData = jsonEncode(data);
  156. }
  157. if (method == 'POST') {
  158. r.headers.set('Content-Type', 'application/json; charset=utf-8');
  159. r.headers.set('Content-Length', utf8.encode(strData).length);
  160. }
  161. if (tokens != null) {
  162. r.headers.set('Authorization', tokens.accessToken);
  163. }
  164. if (header != null) {
  165. header.forEach((k, v) {
  166. r.headers.set(k, v);
  167. });
  168. }
  169. r.write(strData);
  170. var rp = await r.close();
  171. var body = await rp.transform(utf8.decoder).join();
  172. print('${rp.statusCode} - $path');
  173. print('-- request --');
  174. print(strData);
  175. print('-- response --');
  176. print('$body \n');
  177. if (rp.statusCode == 404) {
  178. if (fail != null) fail('404 not found');
  179. } else {
  180. Map<String, dynamic> base = jsonDecode(body);
  181. if (rp.statusCode == 200) {
  182. if (base['code'] != 0) {
  183. if (fail != null) fail(base['desc']);
  184. } else {
  185. if (ok != null) ok(base['data']);
  186. }
  187. } else if (base['code'] != 0) {
  188. if (fail != null) fail(base['desc']);
  189. }
  190. }
  191. } catch (e) {
  192. if (fail != null) fail(e.toString());
  193. }
  194. if (eventually != null) eventually();
  195. }`
  196. tokensFileContent = `class Tokens {
  197. /// 用于访问的token, 每次请求都必须带在Header里面
  198. final String accessToken;
  199. final int accessExpire;
  200. /// 用于刷新token
  201. final String refreshToken;
  202. final int refreshExpire;
  203. final int refreshAfter;
  204. Tokens(
  205. {this.accessToken,
  206. this.accessExpire,
  207. this.refreshToken,
  208. this.refreshExpire,
  209. this.refreshAfter});
  210. factory Tokens.fromJson(Map<String, dynamic> m) {
  211. return Tokens(
  212. accessToken: m['access_token'],
  213. accessExpire: m['access_expire'],
  214. refreshToken: m['refresh_token'],
  215. refreshExpire: m['refresh_expire'],
  216. refreshAfter: m['refresh_after']);
  217. }
  218. Map<String, dynamic> toJson() {
  219. return {
  220. 'access_token': accessToken,
  221. 'access_expire': accessExpire,
  222. 'refresh_token': refreshToken,
  223. 'refresh_expire': refreshExpire,
  224. 'refresh_after': refreshAfter,
  225. };
  226. }
  227. }
  228. `
  229. tokensFileContentV2 = `class Tokens {
  230. /// 用于访问的token, 每次请求都必须带在Header里面
  231. final String accessToken;
  232. final int accessExpire;
  233. /// 用于刷新token
  234. final String refreshToken;
  235. final int refreshExpire;
  236. final int refreshAfter;
  237. Tokens({
  238. required this.accessToken,
  239. required this.accessExpire,
  240. required this.refreshToken,
  241. required this.refreshExpire,
  242. required this.refreshAfter
  243. });
  244. factory Tokens.fromJson(Map<String, dynamic> m) {
  245. return Tokens(
  246. accessToken: m['access_token'],
  247. accessExpire: m['access_expire'],
  248. refreshToken: m['refresh_token'],
  249. refreshExpire: m['refresh_expire'],
  250. refreshAfter: m['refresh_after']);
  251. }
  252. Map<String, dynamic> toJson() {
  253. return {
  254. 'access_token': accessToken,
  255. 'access_expire': accessExpire,
  256. 'refresh_token': refreshToken,
  257. 'refresh_expire': refreshExpire,
  258. 'refresh_after': refreshAfter,
  259. };
  260. }
  261. }
  262. `
  263. )