1
1
import os
2
2
3
3
import requests
4
- from jsonschema import RefResolver
5
4
6
5
7
6
def execute_api_call (url : str , method : str , headers : dict , params : dict ,
@@ -33,7 +32,7 @@ def parse_nested_parameters(param_name, param_info, parameters_list, content):
33
32
param_type = param_info ['type' ]
34
33
param_description = param_info .get ('description' ,
35
34
f'用户输入的{ param_name } ' ) # 按需更改描述
36
- param_required = param_name in content [ 'required' ]
35
+ param_required = param_name in content . get ( 'required' , [])
37
36
try :
38
37
if param_type == 'object' :
39
38
properties = param_info .get ('properties' )
@@ -65,7 +64,7 @@ def parse_nested_parameters(param_name, param_info, parameters_list, content):
65
64
'enum' :
66
65
inner_param_info .get ('enum' , '' ),
67
66
'in' :
68
- 'requestBody '
67
+ 'body '
69
68
})
70
69
else :
71
70
# Non-nested parameters are added directly to the parameter list
@@ -75,7 +74,7 @@ def parse_nested_parameters(param_name, param_info, parameters_list, content):
75
74
'required' : param_required ,
76
75
'type' : param_type ,
77
76
'enum' : param_info .get ('enum' , '' ),
78
- 'in' : 'requestBody '
77
+ 'in' : 'body '
79
78
})
80
79
except Exception as e :
81
80
raise ValueError (f'{ e } :schema结构出错' )
@@ -89,17 +88,75 @@ def extract_references(schema_content):
89
88
references .append (schema_content ['$ref' ])
90
89
for key , value in schema_content .items ():
91
90
references .extend (extract_references (value ))
91
+ # if properties exist, record the schema content in references and deal later
92
+ if 'properties' in schema_content :
93
+ references .append (schema_content )
92
94
elif isinstance (schema_content , list ):
93
95
for item in schema_content :
94
96
references .extend (extract_references (item ))
95
97
return references
96
98
97
99
100
+ def swagger_to_openapi (swagger_data ):
101
+ openapi_data = {
102
+ 'openapi' : '3.0.0' ,
103
+ 'info' : swagger_data .get ('info' , {}),
104
+ 'paths' : swagger_data .get ('paths' , {}),
105
+ 'components' : {
106
+ 'schemas' : swagger_data .get ('definitions' , {}),
107
+ 'securitySchemes' : swagger_data .get ('securityDefinitions' , {})
108
+ }
109
+ }
110
+
111
+ # 转换基本信息
112
+ if 'host' in swagger_data :
113
+ openapi_data ['servers' ] = [{
114
+ 'url' :
115
+ f"https://{ swagger_data ['host' ]} { swagger_data .get ('basePath' , '' )} "
116
+ }]
117
+
118
+ # 转换路径
119
+ for path , methods in openapi_data ['paths' ].items ():
120
+ for method , operation in methods .items ():
121
+ # 转换参数
122
+ if 'parameters' in operation :
123
+ new_parameters = []
124
+ for param in operation ['parameters' ]:
125
+ if param .get ('in' ) == 'body' :
126
+ if 'requestBody' not in operation :
127
+ operation ['requestBody' ] = {'content' : {}}
128
+ operation ['requestBody' ]['content' ] = {
129
+ 'application/json' : {
130
+ 'schema' : param .get ('schema' , {})
131
+ }
132
+ }
133
+ else :
134
+ new_parameters .append (param )
135
+ operation ['parameters' ] = new_parameters
136
+
137
+ # 转换响应
138
+ if 'responses' in operation :
139
+ for status , response in operation ['responses' ].items ():
140
+ if 'schema' in response :
141
+ response ['content' ] = {
142
+ 'application/json' : {
143
+ 'schema' : response .pop ('schema' )
144
+ }
145
+ }
146
+
147
+ return openapi_data
148
+
149
+
98
150
def openapi_schema_convert (schema : dict , auth : dict = {}):
99
151
config_data = {}
152
+ host = schema .get ('host' , '' )
153
+ if host :
154
+ schema = swagger_to_openapi (schema )
155
+
156
+ schema = jsonref .replace_refs (schema )
100
157
101
- resolver = RefResolver .from_schema (schema )
102
158
servers = schema .get ('servers' , [])
159
+
103
160
if servers :
104
161
servers_url = servers [0 ].get ('url' )
105
162
else :
@@ -120,6 +177,10 @@ def openapi_schema_convert(schema: dict, auth: dict = {}):
120
177
if isinstance (path_parameters , dict ):
121
178
path_parameters = [path_parameters ]
122
179
for path_parameter in path_parameters :
180
+ if 'schema' in path_parameter :
181
+ path_type = path_parameter ['schema' ]['type' ]
182
+ else :
183
+ path_type = path_parameter ['type' ]
123
184
parameters_list .append ({
124
185
'name' :
125
186
path_parameter ['name' ],
@@ -130,7 +191,7 @@ def openapi_schema_convert(schema: dict, auth: dict = {}):
130
191
'required' :
131
192
path_parameter .get ('required' , False ),
132
193
'type' :
133
- path_parameter [ 'schema' ][ 'type' ] ,
194
+ path_type ,
134
195
'enum' :
135
196
path_parameter .get ('enum' , '' )
136
197
})
@@ -160,13 +221,11 @@ def openapi_schema_convert(schema: dict, auth: dict = {}):
160
221
schema_content = content_details .get ('schema' , {})
161
222
references = extract_references (schema_content )
162
223
for reference in references :
163
- resolved_schema = resolver .resolve (reference )
164
- content = resolved_schema [1 ]
165
- for param_name , param_info in content [
224
+ for param_name , param_info in reference [
166
225
'properties' ].items ():
167
226
parse_nested_parameters (
168
227
param_name , param_info , parameters_list ,
169
- content )
228
+ reference )
170
229
X_DashScope_Async = requestBody .get (
171
230
'X-DashScope-Async' , '' )
172
231
if X_DashScope_Async == '' :
0 commit comments