You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

477 lines
15 KiB

<?php
namespace Api\Controller;
use Think\Controller;
class ImportPostmanController extends BaseController {
public function import(){
$login_user = $this->checkLogin();
$json = file_get_contents($_FILES["file"]["tmp_name"]) ;
//$json = file_get_contents("../Public/postmanpostman_collectionV2.json") ;//test
$json_array = json_decode($json ,1 );
unset($json);
if ($json_array['id']) {
$this->_fromPostmanV1($json_array);
return ;
}
if ($json_array['info']) {
$this->_fromPostmanV2($json_array);
return ;
}
$this->sendError(10101);
}
//从postman导入(v1版本)
private function _fromPostmanV1($json_array){
$login_user = $this->checkLogin();
// TODO 这里需要检查下合法性。比如关键字检查/黑名单检查/字符串过滤
$from = I("from") ? I("from") : '' ;
$item_array = array(
"item_name" => $json_array['name'] ? $json_array['name'] : 'from postman' ,
"item_type" => ($from == 'runapi') ? '3': '1' ,
"item_description" => $json_array['description'] ? $json_array['description'] :'',
"password" => time().rand(),
"members" => array(),
"pages" =>array(
"pages" => array(),
"catalogs" => array()
)
) ;
$level = 2 ;
foreach ($json_array['requests'] as $key => $value) {
if (!$value['folder']) {
$item_array['pages']['pages'][] = $this->_requestToDoc($value);
}
}
foreach ($json_array['folders'] as $key => $value) {
//不存在父目录的话,那就是根目录了。
if (!$value['folder']) {
$cat_array = array(
"id" => $value['id'] ,
"cat_name" => $value['name'] ,
"level" => $level ,
"s_number" => 99 ,
);
$cat_array['pages'] = $this->_getPageByFolders($value['id'] , $json_array ) ;
$cat_array['catalogs'] = $this->_getSubByFolders($value['id'] ,$value['name'] , $level + 1 , $json_array ) ;
$item_array['pages']['catalogs'][] = $cat_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));
}
//根据postman的folders获取子页面和子目录
//参数id为父目录的id
private function _getSubByFolders($id , $name , $level , $json_array ){
$return = array() ;
foreach($json_array['folders'] as $key => $value) {
if ($value['folder'] && $value['folder'] == $id ) {
$cat_array = array(
"id" => $value['id'] ,
"cat_name" => $value['name'] ,
"level" => $level ,
"s_number" => 99 ,
);
$cat_array['pages'] = $this->_getPageByFolders($value['id'], $json_array ) ;
$cat_array['catalogs'] = $this->_getSubByFolders($value['id'] , $value['name'] , $level + 1 , $json_array);
$return[] = $cat_array ;
}
}
return $return ;
}
//根据postman的folders获取页面
private function _getPageByFolders($id , $json_array ){
$return = array() ;
foreach ($json_array['requests'] as $key => $value) {
if ($value['folder'] == $id ) {
$return[] = $this->_requestToDoc($value);
}
}
return $return ;
}
private function _requestToDoc($request){
$from = I("from") ? I("from") : '' ;
if($from == 'runapi'){
return $this->_requestToApi($request);
//如果是来自runapi的导入请求,则已经return不再执行下面
}
$return = array() ;
$return['page_title'] = $request['name'] ;
$return['id'] = $request['id'] ;
$return['s_number'] = 99 ;
$return['page_comments'] = '' ;
//若$return['page_title'] 为很长的url,则做一些特殊处理
$tmp_title_array = explode("/", $return['page_title']);
if ($tmp_title_array) {
$tmp_title_array = array_slice($tmp_title_array, -2);// 倒数2个
if($tmp_title_array[1])$return['page_title'] = $tmp_title_array[0]."/".$tmp_title_array[1] ;
}
$content = '
**简要描述:**
- '.$request['description'].'
**请求URL:**
- ` '.$request['url'].' `
**请求方式:**
- '.$request['method'].' ';
if ($request['headerData']) {
$content .='
**Header:**
|Header名|是否必选|类型|说明|
|:---- |:---|:----- |----- |'."\n";
foreach ($request['headerData'] as $key => $value) {
$content .= '|'.$value["key"].' | | text | '.$value["value"].' |'."\n";
}
}
if ($request['rawModeData']) {
$content .= '
**请求参数示例**
```
'.$request['rawModeData'].'
```
';
}
if ($request['data']) {
$content .='
**参数:**
|参数名|是否必选|类型|说明|
|:---- |:---|:----- |----- |'."\n";
foreach ($request['data'] as $key => $value) {
$content .= '|'.$value["key"].' | |'.$value["type"].' | 无 |'."\n";
}
}
$return['page_content'] = $content ;
return $return ;
}
//转成runapi所需要的api格式
private function _requestToApi($request){
$return = array() ;
$return['page_title'] = $request['name'] ;
$return['id'] = $request['id'] ;
$return['s_number'] = 99 ;
$return['page_comments'] = '' ;
//若$return['page_title'] 为很长的url,则做一些特殊处理
$tmp_title_array = explode("/", $return['page_title']);
if ($tmp_title_array) {
$tmp_title_array = array_slice($tmp_title_array, -2);// 倒数2个
if($tmp_title_array[1])$return['page_title'] = $tmp_title_array[0]."/".$tmp_title_array[1] ;
}
$content_array = array(
"info"=>array(
"from" => 'runapi' ,
"type" => 'api' ,
"title" => $request['name'] ,
"description" => $request['description'] ,
"method" => strtolower($request['method']) ,
"url" => $request['url'] ,
"remark" => '' ,
),
"request" =>array(
"params"=> array(
'mode' => "urlencoded",
'json' => "",
'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['data']) {
foreach ($request['data'] as $key => $value) {
$content_array['request']['params']['urlencoded'][] = array(
"name" =>$value["key"],
"type" =>'string',
"value" =>$value["value"],
"require" =>'1',
"remark" =>'',
);
}
}
$return['page_content'] = json_encode($content_array) ;
return $return ;
}
//从postman导入(v2版本)
private function _fromPostmanV2($json_array){
$login_user = $this->checkLogin();
// TODO 这里需要检查下合法性。比如关键字检查/黑名单检查/字符串过滤
$from = I("from") ? I("from") : '' ;
$item_array = array(
"item_name" => $json_array['info']['name'] ? $json_array['info']['name'] : 'from postman' ,
"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" => array()
)
) ;
$level = 2 ;
$item_array['pages']['pages'] = $this->_getPageByItem($json_array['item'] );
$item_array['pages']['catalogs'] = $this->_getItemByItem($json_array['item'] , 2 );
$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 _getPageByItem($item_array ){
$return = array();
foreach ($item_array as $key => $value) {
//含有request,则这是一个子页面
if ($value['request']) {
$return[] = $this->_requestToDocV2($value['name'] ,$value['request']);
}
}
return $return ;
}
//获取某个目录下的所有子目录
private function _getItemByItem($item_array ,$level ){
$return = array();
foreach ($item_array as $key => $value) {
//含有item,则这是一个子目录
if ($value['item']) {
$one_ary = array(
"cat_name" => $value['name'] ,
"level" => $level ,
"s_number" => 99 ,
"pages" => $this->_getPageByItem($value['item'], $level + 1 ), //递归
"catalogs" => $this->_getItemByItem($value['item'], $level + 1 ) //递归
);
$return[] = $one_ary ;
}
}
return $return ;
}
private function _requestToDocV2($name , $request){
$from = I("from") ? I("from") : '' ;
if($from == 'runapi'){
return $this->_requestToApiV2($name , $request);
//如果是来自runapi的导入请求,则已经return不再执行下面
}
$return = array() ;
$return['page_title'] = $name ;
$return['s_number'] = 99 ;
$return['page_comments'] = '' ;
//若$return['page_title'] 为很长的url,则做一些特殊处理
$tmp_title_array = explode("/", $return['page_title']);
if ($tmp_title_array) {
$tmp_title_array = array_slice($tmp_title_array, -2);// 倒数2个
if($tmp_title_array[1])$return['page_title'] = $tmp_title_array[0]."/".$tmp_title_array[1] ;
}
$url = is_array($request['url']) ? $request['url']['raw'] : $request['url'] ;
$rawModeData = $request['body']['mode'] == 'raw' ? $request['body']['raw'] : $request['rawModeData'] ;
$content = '
**简要描述:**
- '.$request['description'].'
**请求URL:**
- ` '.$url.' `
**请求方式:**
- '.$request['method'].' ';
if ($request['header']) {
$content .='
**Header:**
|Header名|是否必选|类型|说明|
|:---- |:---|:----- |----- |'."\n";
foreach ($request['header'] as $key => $value) {
$content .= '|'.$value["key"].' | | | '.$value["value"].' |'."\n";
}
}
if ($rawModeData) {
$content .= '
**请求参数示例**
```
'.$rawModeData.'
```
';
}
if ($request['body']['formdata']) {
$content .='
**参数:**
|参数名|是否必选|类型|说明|
|:---- |:---|:----- |----- |'."\n";
foreach ($request['body']['formdata'] as $key => $value) {
$content .= '|'.$value["key"].' | |'.$value["type"].' | 无 |'."\n";
}
}
$return['page_content'] = $content ;
return $return ;
}
//转成runapi所需要的api格式
private function _requestToApiV2($name , $request){
$return = array() ;
$return['page_title'] = $name ;
$return['s_number'] = 99 ;
$return['page_comments'] = '' ;
//若$return['page_title'] 为很长的url,则做一些特殊处理
$tmp_title_array = explode("/", $return['page_title']);
if ($tmp_title_array) {
$tmp_title_array = array_slice($tmp_title_array, -2);// 倒数2个
if($tmp_title_array[1])$return['page_title'] = $tmp_title_array[0]."/".$tmp_title_array[1] ;
}
$url = is_array($request['url']) ? $request['url']['raw'] : $request['url'] ;
$rawModeData = $request['body']['mode'] == 'raw' ? $request['body']['raw'] : $request['rawModeData'] ;
$content_array = array(
"info"=>array(
"from" => 'runapi' ,
"type" => 'api' ,
"title" => $name ,
"description" => $request['description'] ,
"method" => strtolower($request['method']) ,
"url" => $url ,
"remark" => '' ,
),
"request" =>array(
"params"=> array(
'mode' => "formdata",
'json' => "",
'urlencoded' => array(),
'formdata' => array(),
),
"headers"=> array(),
"cookies"=> array(),
"auth"=> array(),
),
"response" =>array(),
"extend" =>array(),
);
if ($request['header']) {
$tmp_array = array();
foreach ($request['header'] as $key => $value) {
$content_array['request']['headers'][] = array(
"name" =>$value["key"],
"type" =>'string',
"value" =>$value["value"],
"require" =>'1',
"remark" =>'',
);
}
}
if ($request['body']['formdata']) {
foreach ($request['body']['formdata'] as $key => $value) {
$content_array['request']['params']['formdata'][] = array(
"name" =>$value["key"],
"type" =>'string',
"value" =>$value["value"],
"require" =>'1',
"remark" =>'',
);
}
}
$return['page_content'] = json_encode($content_array) ;
return $return ;
}
}