ImportPostmanController.class.php 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. <?php
  2. namespace Api\Controller;
  3. use Think\Controller;
  4. class ImportPostmanController extends BaseController {
  5. public function import(){
  6. $login_user = $this->checkLogin();
  7. $json = file_get_contents($_FILES["file"]["tmp_name"]) ;
  8. //$json = file_get_contents("../Public/postmanpostman_collectionV2.json") ;//test
  9. $json_array = json_decode($json ,1 );
  10. unset($json);
  11. if ($json_array['id']) {
  12. $this->_fromPostmanV1($json_array);
  13. return ;
  14. }
  15. if ($json_array['info']) {
  16. $this->_fromPostmanV2($json_array);
  17. return ;
  18. }
  19. $this->sendError(10101);
  20. }
  21. //从postman导入(v1版本)
  22. private function _fromPostmanV1($json_array){
  23. $login_user = $this->checkLogin();
  24. // TODO 这里需要检查下合法性。比如关键字检查/黑名单检查/字符串过滤
  25. $item_array = array(
  26. "item_name" => $json_array['name'] ? $json_array['name'] : 'from postman' ,
  27. "item_type" => '1' ,
  28. "item_description" => $json_array['description'] ? $json_array['description'] :'',
  29. "password" => time().rand(),
  30. "members" => array(),
  31. "pages" =>array(
  32. "pages" => array(),
  33. "catalogs" => array()
  34. )
  35. ) ;
  36. $level = 2 ;
  37. foreach ($json_array['requests'] as $key => $value) {
  38. if (!$value['folder']) {
  39. $item_array['pages']['pages'][] = $this->_requestToDoc($value);
  40. }
  41. }
  42. foreach ($json_array['folders'] as $key => $value) {
  43. //不存在父目录的话,那就是根目录了。
  44. if (!$value['folder']) {
  45. $cat_array = array(
  46. "id" => $value['id'] ,
  47. "cat_name" => $value['name'] ,
  48. "level" => $level ,
  49. "s_number" => 99 ,
  50. );
  51. $cat_array['pages'] = $this->_getPageByFolders($value['id'] , $json_array ) ;
  52. $cat_array['catalogs'] = $this->_getSubByFolders($value['id'] ,$value['name'] , $level + 1 , $json_array ) ;
  53. $item_array['pages']['catalogs'][] = $cat_array ;
  54. }
  55. }
  56. D("Item")->import( json_encode($item_array) , $login_user['uid'] );
  57. //echo D("Item")->export(196053901215026 );
  58. //echo json_encode($item_array);
  59. $this->sendResult(array());
  60. }
  61. //根据postman的folders获取子页面和子目录
  62. //参数id为父目录的id
  63. private function _getSubByFolders($id , $name , $level , $json_array ){
  64. $return = array() ;
  65. foreach($json_array['folders'] as $key => $value) {
  66. if ($value['folder'] && $value['folder'] == $id ) {
  67. $cat_array = array(
  68. "id" => $value['id'] ,
  69. "cat_name" => $value['name'] ,
  70. "level" => $level ,
  71. "s_number" => 99 ,
  72. );
  73. $cat_array['pages'] = $this->_getPageByFolders($value['id'], $json_array ) ;
  74. $cat_array['catalogs'] = $this->_getSubByFolders($value['id'] , $value['name'] , $level + 1 , $json_array);
  75. $return[] = $cat_array ;
  76. }
  77. }
  78. return $return ;
  79. }
  80. //根据postman的folders获取页面
  81. private function _getPageByFolders($id , $json_array ){
  82. $return = array() ;
  83. foreach ($json_array['requests'] as $key => $value) {
  84. if ($value['folder'] == $id ) {
  85. $return[] = $this->_requestToDoc($value);
  86. }
  87. }
  88. return $return ;
  89. }
  90. private function _requestToDoc($request){
  91. $return = array() ;
  92. $return['page_title'] = $request['name'] ;
  93. $return['id'] = $request['id'] ;
  94. $return['s_number'] = 99 ;
  95. $return['page_comments'] = '' ;
  96. //若$return['page_title'] 为很长的url,则做一些特殊处理
  97. $tmp_title_array = explode("/", $return['page_title']);
  98. if ($tmp_title_array) {
  99. $tmp_title_array = array_slice($tmp_title_array, -2);// 倒数2个
  100. if($tmp_title_array[1])$return['page_title'] = $tmp_title_array[0]."/".$tmp_title_array[1] ;
  101. }
  102. $content = '
  103. **简要描述:**
  104. - '.$request['description'].'
  105. **请求URL:**
  106. - ` '.$request['url'].' `
  107. **请求方式:**
  108. - '.$request['method'].' ';
  109. if ($request['headerData']) {
  110. $content .='
  111. **Header:**
  112. |Header名|是否必选|类型|说明|
  113. |:---- |:---|:----- |----- |'."\n";
  114. foreach ($request['headerData'] as $key => $value) {
  115. $content .= '|'.$value["key"].' | | text | '.$value["value"].' |'."\n";
  116. }
  117. }
  118. if ($request['rawModeData']) {
  119. $content .= '
  120. **请求参数示例**
  121. ```
  122. '.$request['rawModeData'].'
  123. ```
  124. ';
  125. }
  126. if ($request['data']) {
  127. $content .='
  128. **参数:**
  129. |参数名|是否必选|类型|说明|
  130. |:---- |:---|:----- |----- |'."\n";
  131. foreach ($request['data'] as $key => $value) {
  132. $content .= '|'.$value["key"].' | |'.$value["type"].' | 无 |'."\n";
  133. }
  134. }
  135. $return['page_content'] = $content ;
  136. return $return ;
  137. }
  138. //从postman导入(v2版本)
  139. private function _fromPostmanV2($json_array){
  140. $login_user = $this->checkLogin();
  141. // TODO 这里需要检查下合法性。比如关键字检查/黑名单检查/字符串过滤
  142. $item_array = array(
  143. "item_name" => $json_array['info']['name'] ? $json_array['info']['name'] : 'from postman' ,
  144. "item_type" => '1' ,
  145. "item_description" => $json_array['info']['description'] ? $json_array['info']['description'] :'',
  146. "password" => time().rand(),
  147. "members" => array(),
  148. "pages" =>array(
  149. "pages" => array(),
  150. "catalogs" => array()
  151. )
  152. ) ;
  153. $level = 2 ;
  154. $item_array['pages']['pages'] = $this->_getPageByItem($json_array['item'] );
  155. $item_array['pages']['catalogs'] = $this->_getItemByItem($json_array['item'] , 2 );
  156. D("Item")->import( json_encode($item_array) , $login_user['uid'] );
  157. //echo D("Item")->export(196053901215026 );
  158. //echo json_encode($item_array);
  159. $this->sendResult(array());
  160. }
  161. //获取某个目录下的所有页面
  162. private function _getPageByItem($item_array ){
  163. $return = array();
  164. foreach ($item_array as $key => $value) {
  165. //含有request,则这是一个子页面
  166. if ($value['request']) {
  167. $return[] = $this->_requestToDocV2($value['name'] ,$value['request']);
  168. }
  169. }
  170. return $return ;
  171. }
  172. //获取某个目录下的所有子目录
  173. private function _getItemByItem($item_array ,$level ){
  174. $return = array();
  175. foreach ($item_array as $key => $value) {
  176. //含有item,则这是一个子目录
  177. if ($value['item']) {
  178. $one_ary = array(
  179. "cat_name" => $value['name'] ,
  180. "level" => $level ,
  181. "s_number" => 99 ,
  182. "pages" => $this->_getPageByItem($value['item'], $level + 1 ), //递归
  183. "catalogs" => $this->_getItemByItem($value['item'], $level + 1 ) //递归
  184. );
  185. $return[] = $one_ary ;
  186. }
  187. }
  188. return $return ;
  189. }
  190. private function _requestToDocV2($name , $request){
  191. $return = array() ;
  192. $return['page_title'] = $name ;
  193. $return['s_number'] = 99 ;
  194. $return['page_comments'] = '' ;
  195. //若$return['page_title'] 为很长的url,则做一些特殊处理
  196. $tmp_title_array = explode("/", $return['page_title']);
  197. if ($tmp_title_array) {
  198. $tmp_title_array = array_slice($tmp_title_array, -2);// 倒数2个
  199. if($tmp_title_array[1])$return['page_title'] = $tmp_title_array[0]."/".$tmp_title_array[1] ;
  200. }
  201. $url = is_array($request['url']) ? $request['url']['raw'] : $request['url'] ;
  202. $rawModeData = $request['body']['mode'] == 'raw' ? $request['body']['raw'] : $request['rawModeData'] ;
  203. $content = '
  204. **简要描述:**
  205. - '.$request['description'].'
  206. **请求URL:**
  207. - ` '.$url.' `
  208. **请求方式:**
  209. - '.$request['method'].' ';
  210. if ($request['header']) {
  211. $content .='
  212. **Header:**
  213. |Header名|是否必选|类型|说明|
  214. |:---- |:---|:----- |----- |'."\n";
  215. foreach ($request['header'] as $key => $value) {
  216. $content .= '|'.$value["key"].' | | | '.$value["value"].' |'."\n";
  217. }
  218. }
  219. if ($rawModeData) {
  220. $content .= '
  221. **请求参数示例**
  222. ```
  223. '.$rawModeData.'
  224. ```
  225. ';
  226. }
  227. if ($request['body']['formdata']) {
  228. $content .='
  229. **参数:**
  230. |参数名|是否必选|类型|说明|
  231. |:---- |:---|:----- |----- |'."\n";
  232. foreach ($request['body']['formdata'] as $key => $value) {
  233. $content .= '|'.$value["key"].' | |'.$value["type"].' | 无 |'."\n";
  234. }
  235. }
  236. $return['page_content'] = $content ;
  237. return $return ;
  238. }
  239. }