123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250 |
- <?php
- namespace Api\Controller;
- use Think\Controller;
- class ImportSwaggerController extends BaseController {
- public $json_array = array();
- public $url_pre = '';
- public function import(){
- $login_user = $this->checkLogin();
- $json = file_get_contents($_FILES["file"]["tmp_name"]) ;
- //$json = file_get_contents("../Public/swagger.json") ;//test
- $json_array = json_decode($json ,1 );
- unset($json);
- if ($json_array['info']) {
- $this->json_array = $json_array ;
- $scheme = $json_array['schemes'][0] ? $json_array['schemes'][0] : 'http';
- $this->url_pre = $scheme."://".$json_array['host'].$json_array['basePath'] ;
- $this->_fromSwaggerV2($json_array);
- return ;
- }
- $this->sendError(10303);
- }
- private function _fromSwaggerV2($json_array){
- $login_user = $this->checkLogin();
- // TODO 这里需要检查下合法性。比如关键字检查/黑名单检查/字符串过滤
- $from = I("from") ? I("from") : '' ;
- $item_array = array(
- "item_name" => $json_array['info']['title'] ? $json_array['info']['title'] : 'from swagger' ,
- "item_type" => ($from == 'runapi') ? '3': '1' ,
- "item_description" => $json_array['info']['description'] ? $json_array['info']['description'] :'',
- "password" => time().rand(),
- "members" => array(),
- "pages" =>array(
- "pages" => array(),
- "catalogs" => $this->_getAllTagsLogs($json_array)
- )
- ) ;
- $level = 2 ;
- // $item_array['pages']['catalogs'][0]['pages'] = $this->_getPageByPaths($json_array);
- $item_id = D("Item")->import( json_encode($item_array) , $login_user['uid'] );
-
- //echo D("Item")->export(196053901215026 );
- //echo json_encode($item_array);
- $this->sendResult(array('item_id' => $item_id));
- }
- private function _getAllTagsLogs($json_array) {
- $catalogsMap = array(
- "fromSwagger" => array("cat_name" =>'from swagger', "pages" =>array())
- );
- $paths = $json_array['paths'] ;
- foreach ($paths as $url => $value) {
- foreach ($value as $method => $value2) {
- $tags = isset($value2["tags"]) ? $value2["tags"] : array();
- if ($tags == array()){
- $page = $this->_requestToDoc($method, $url, $value2, $json_array);
- if($page['page_title']){
- $catalogsMap["fromSwagger"]["pages"][] = $page;
- }
- }else{
- foreach ($tags as $tag){
- if (!key_exists($tag, $catalogsMap)) {
- $page = $this->_requestToDoc($method, $url, $value2, $json_array);
- if ($page["page_title"] != "" && $page["page_content"] != ""){
- $catalogsMap[$tag] = array("cat_name" => $tag, "pages" => array($page));
- }
- }else{
- // 存在则page merge
- $page = $this->_requestToDoc($method, $url, $value2, $json_array);
- if ($page["page_title"] != "" && $page["page_content"] != ""){
- $catalogsMap[$tag]["pages"][] = $page;
- }
- }
- }
- }
- }
- }
- $catalogs = array();
- foreach ($catalogsMap as $key => $value){
- $catalogs[] = $value;
- }
- return $catalogs;
- }
- private function _getPageByPaths($json_array){
- $return = array() ;
- $paths = $json_array['paths'] ;
- foreach ($paths as $url => $value) {
- foreach ($value as $method => $value2) {
- $return[] = $this->_requestToDoc($method , $url , $value2 , $json_array);
- }
- }
- return $return ;
- }
- private function _requestToDoc($method , $url , $request , $json_array){
- $from = I("from") ? I("from") : '' ;
- $res = $this->_requestToApi($method , $url , $request , $json_array);
- if($from == 'runapi'){
- return $res ;
- }else{
- $res['page_content'] = D("Page")->runapiToMd($res['page_content']);
- return $res ;
- }
- }
- private function _requestToApi($method , $url , $request , $json_array){
- $return = array() ;
- $return['page_title'] = $request['summary'] ? $request['summary']: $request['operationId'] ;
- $return['s_number'] = 99 ;
- $return['page_comments'] = '' ;
-
- $content_array = array(
- "info"=>array(
- "from" => 'runapi' ,
- "type" => 'api' ,
- "title" => $request['summary'] ? $request['summary']: $request['operationId'] ,
- "description" => $request['description'] ,
- "method" => strtolower($method) ,
- "url" => $this->url_pre . $url ,
- "remark" => '' ,
- ),
- "request" =>array(
- "params"=> array(
- 'mode' => "formdata",
- 'json' => "",
- 'jsonDesc' => array(),
- 'urlencoded' => array(),
- 'formdata' => array(),
- ),
- "headers"=> array(),
- "cookies"=> array(),
- "auth"=> array(),
- ),
- "response" =>array(),
- "extend" =>array(),
- );
- if ($request['headerData']) {
- $tmp_array = array();
- foreach ($request['headerData'] as $key => $value) {
- $content_array['request']['headers'][] = array(
- "name" =>$value["key"],
- "type" =>'string',
- "value" =>$value["value"],
- "require" =>'1',
- "remark" =>'',
- );
- }
- }
- if ($request['parameters']) {
- foreach ($request['parameters'] as $key => $value) {
- // 如果in字段是body的话,应该就是参数为json的情况了
- if($value["in"] == 'body'){
- $ref_str = $value['schema']['$ref'] ;
- //如果含有引用标识,则获取引用
- if($ref_str){
- $ref_array = $this->_getDefinition($ref_str);
- }else{
- $ref_array = $value['schema'] ;
- }
- $json_array = $this->_definitionToJsonArray($ref_array);
- $json_str = $this->_jsonArrayToStr($json_array);
- $content_array['request']['params']['mode'] = 'json';
- $content_array['request']['params']['json'] = $json_str;
- $content_array['request']['params']['jsonDesc'] = $json_array;
- }else{
- $content_array['request']['params']['formdata'][] = array(
- "name" =>$value["name"],
- "type" =>'string',
- "value" =>$value["value"],
- "require" =>'1',
- "remark" =>$value["description"],
- );
- }
- }
- }
- //处理返回结果情况
- if($request['responses'] && $request['responses']['200']){
- $ref_str = $request['responses']['200']['schema']['$ref'] ;
- //如果含有引用标识,则获取引用
- if($ref_str){
- $ref_array = $this->_getDefinition($ref_str);
- }else{
- $ref_array = $request['responses']['200']['schema'] ;
- }
- $json_array = $this->_definitionToJsonArray($ref_array);
- $json_str = $this->_jsonArrayToStr($json_array);
- $content_array['response']['responseExample'] = $json_str;
- $content_array['response']['responseParamsDesc'] = $json_array;
- }
- $return['page_content'] = json_encode($content_array);
- return $return ;
- }
- // 获取引用,返回数组。
- //$ref_str 是swagger里引用的字符串,比如"#/definitions/Petoo"
- private function _getDefinition($ref_str){
- $json_array = $this->json_array ;
- $str_array = explode('#/definitions/',$ref_str);
- $path = $str_array1[1];
- $target_array = $json_array['definitions'][$str_array[1]] ;
- if($target_array){
- return $target_array ;
- }
- return false;
- }
- //把引用类型的数组转换成纯json数组
- private function _definitionToJsonArray($ref_array){
- $res = array() ;
- foreach ($ref_array['properties'] as $key => $value) {
- $res[] = array(
- "name" =>$key,
- "type" =>'string',
- "value" =>'',
- "require" =>'1',
- "remark" =>$value["title"],
- );
- }
- return $res ;
- }
- // 把json数组转成纯json字符串
- private function _jsonArrayToStr($json_array){
- $res_array = array() ;
- foreach ($json_array as $key => $value) {
- $res_array[$value['name']] = '' ;
- }
- return json_encode($res_array) ;
- }
- }
|