Skip to content

Commit 9937ae1

Browse files
authored
Merge pull request KscSDK#1 from liuyichen/master
合并
2 parents ff63d0e + 16f9b86 commit 9937ae1

File tree

3 files changed

+102
-57
lines changed

3 files changed

+102
-57
lines changed

README.rst

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ SDK 使用文档
44
A low-level interface to a growing number of KSC Web Services.
55

66

7-
87
----------------
98
Install 安装
109
----------------
@@ -167,6 +166,30 @@ Examples 示例
167166

168167
+ 更多
169168

169+
--------------------
170+
BUG FIXED 问题修正
171+
--------------------
172+
173+
+ CERTIFICATE_VERIFY_FAILED
174+
::
175+
176+
requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
177+
178+
+ 参考 `InsecurePlatformWarning <https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings>`__ 解决方法如下
179+
::
180+
181+
pip install requests[security]
182+
183+
+ 如 `build/temp.linux-x86_64-2.7/_openssl.c:433:30: fatal error: openssl/opensslv.h: No such file or directory` 解决方法如下
184+
::
185+
186+
yum install openssl-devel
187+
188+
+ 如 `build/temp.linux-x86_64-2.7/_openssl.c:12:24: fatal error: pyconfig.h: No such file or directory`解决方法如下
189+
::
190+
191+
yum install python-devel
192+
170193
--------------------
171194
Contact Information
172195
--------------------

kscore/parsers.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -785,6 +785,7 @@ def _parse_error_from_body(self, response):
785785
'query-json': JSONParser,
786786
'kcs': JSONParser,
787787
'json': JSONParser,
788+
'json2': JSONParser,
788789
'rest-json': RestJSONParser,
789790
'rest-xml': RestXMLParser,
790791
}

kscore/serialize.py

Lines changed: 77 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -118,12 +118,26 @@ def _create_default_request(self):
118118
'url_path': '/',
119119
'query_string': '',
120120
'method': self.DEFAULT_METHOD,
121-
'headers': {},
121+
'headers': self.headers,
122122
# An empty body is represented as an empty byte string.
123123
'body': b''
124124
}
125125
return serialized
126126

127+
def _serialize_not_shape(self, data, parameters):
128+
pass
129+
130+
def _serialize_data(self, serialized, data):
131+
132+
serialized['body'] = data
133+
134+
return serialized
135+
136+
@property
137+
def headers(self):
138+
139+
return {}
140+
127141
# Some extra utility methods subclasses can use.
128142

129143
def _timestamp_iso8601(self, value):
@@ -162,7 +176,9 @@ def _get_base64(self, value):
162176

163177

164178
class QuerySerializer(Serializer):
165-
179+
"""
180+
BASE HTTP QUERY REQUEST
181+
"""
166182
TIMESTAMP_FORMAT = 'iso8601'
167183

168184
def serialize_to_request(self, parameters, operation_model):
@@ -172,12 +188,24 @@ def serialize_to_request(self, parameters, operation_model):
172188
self.DEFAULT_METHOD)
173189
# The query serializer only deals with body params so
174190
# that's what we hand off the _serialize_* methods.
191+
175192
body_params = self.MAP_TYPE()
176193
body_params['Action'] = operation_model.name
177194
body_params['Version'] = operation_model.metadata['apiVersion']
178195
if shape is not None:
179196
self._serialize(body_params, parameters, shape)
180-
serialized['body'] = body_params
197+
else:
198+
self._serialize_not_shape(body_params, parameters)
199+
200+
return self._serialize_data(serialized, body_params)
201+
202+
def _serialize_not_shape(self, data, parameters):
203+
pass
204+
205+
def _serialize_data(self, serialized, data):
206+
207+
serialized['body'] = data
208+
181209
return serialized
182210

183211
def _serialize(self, serialized, value, shape, prefix=''):
@@ -285,75 +313,74 @@ def _serialize_type_list(self, serialized, value, shape, prefix=''):
285313
self._serialize(serialized, element, element_shape, element_prefix)
286314

287315

288-
class ResJSONSerializer(QuerySerializer):
316+
class QueryAcceptJsonSerializer(QuerySerializer):
317+
318+
@property
319+
def headers(self):
320+
return {"Accept": 'application/json'}
321+
322+
def _serialize_not_shape(self, data, parameters):
323+
324+
data.update(parameters)
325+
326+
def _serialize_data(self, serialized, data):
289327

290-
def serialize_to_request(self, parameters, operation_model):
291-
shape = operation_model.input_shape
292-
serialized = self._create_default_request()
293-
serialized['method'] = operation_model.http.get('method',
294-
self.DEFAULT_METHOD)
295-
# The query serializer only deals with body params so
296-
# that's what we hand off the _serialize_* methods.
297-
body_params = self.MAP_TYPE()
298-
body_params['Action'] = operation_model.name
299-
body_params['Version'] = operation_model.metadata['apiVersion']
300-
if shape is not None:
301-
self._serialize(body_params, parameters, shape)
302-
else:
303-
body_params.update(parameters)
304328
if serialized['method'].lower() == "get":
305329
serialized['body'] = {}
306-
serialized['query_string'] = body_params
330+
serialized['query_string'] = data
307331
else:
308-
serialized['body'] = body_params
309-
310-
serialized['headers'].update(Accept='application/json')
332+
serialized['body'] = data
311333

312334
return serialized
313335

314336

315-
class KCSSerializer(QuerySerializer):
337+
class KCSSerializer(QueryAcceptJsonSerializer):
316338

317-
def serialize_to_request(self, parameters, operation_model):
318-
shape = operation_model.input_shape
319-
serialized = self._create_default_request()
320-
serialized['method'] = operation_model.http.get('method', self.DEFAULT_METHOD)
321-
body_params = self.MAP_TYPE()
322-
body_params['Action'] = operation_model.name
323-
body_params['Version'] = operation_model.metadata['apiVersion']
324-
if shape is not None:
325-
self._serialize(body_params, parameters, shape)
326-
else:
327-
body_params.update(parameters)
328-
329-
serialized['query_string'] = body_params
339+
def _serialize_data(self, serialized, data):
330340

331341
serialized['body'] = {}
332342

333-
serialized['headers'].update(Accept='application/json')
343+
serialized['query_string'] = data
334344

335345
return serialized
336346

337347

338348
class JSONSerializer(Serializer):
349+
"""
350+
BASE JSON REQUEST all method with json body
351+
"""
339352
TIMESTAMP_FORMAT = 'unixtimestamp'
340353

341354
def serialize_to_request(self, parameters, operation_model):
342355
target = '%s.%s' % (operation_model.metadata['targetPrefix'],
343356
operation_model.name)
344-
json_version = operation_model.metadata['jsonVersion']
345357
serialized = self._create_default_request()
346358
serialized['method'] = operation_model.http.get('method',
347359
self.DEFAULT_METHOD)
360+
361+
serialized['query_string'] = self.MAP_TYPE(
362+
Action=operation_model.name, Version=operation_model.metadata['apiVersion']
363+
)
364+
348365
serialized['headers'] = {
349366
'X-Amz-Target': target,
350-
'Content-Type': 'application/x-amz-json-%s' % json_version,
367+
'Content-Type': 'application/json',
368+
'Accept': 'application/json',
369+
351370
}
352371
body = {}
353372
input_shape = operation_model.input_shape
354373
if input_shape is not None:
355374
self._serialize(body, parameters, input_shape)
356-
serialized['body'] = json.dumps(body).encode(self.DEFAULT_ENCODING)
375+
else:
376+
self._serialize_not_shape(body, parameters)
377+
return self._serialize_data(serialized, body)
378+
379+
def _serialize_not_shape(self, data, parameters):
380+
data.update(parameters)
381+
382+
def _serialize_data(self, serialized, data):
383+
serialized['body'] = json.dumps(data).encode(self.DEFAULT_ENCODING)
357384
return serialized
358385

359386
def _serialize(self, serialized, value, shape, key=None):
@@ -406,21 +433,14 @@ def _serialize_type_blob(self, serialized, value, shape, key):
406433
serialized[key] = self._get_base64(value)
407434

408435

409-
class KSJSONSerializer(JSONSerializer):
436+
class NotGetJsonSerializer(JSONSerializer):
410437

411-
def serialize_to_request(self, parameters, operation_model):
412-
serialized = JSONSerializer.serialize_to_request(self, parameters, operation_model)
413-
query_params = self.MAP_TYPE()
414-
query_params['Action'] = operation_model.name
415-
query_params['Version'] = operation_model.metadata['apiVersion']
416-
serialized['query_string'] = query_params
417-
headers = {'Content-Type': 'application/json', 'Accept': 'application/json'}
418-
serialized['headers'].update(headers)
419-
body = {}
420-
input_shape = operation_model.input_shape
421-
if input_shape is not None:
422-
self._serialize(body, parameters, input_shape)
423-
serialized['body'] = json.dumps(body).encode(self.DEFAULT_ENCODING)
438+
def _serialize_data(self, serialized, data):
439+
if serialized['method'].lower() == "get":
440+
serialized['body'] = {}
441+
serialized['query_string'].update(data)
442+
else:
443+
serialized['body'] = json.dumps(data).encode(self.DEFAULT_ENCODING)
424444
return serialized
425445

426446

@@ -690,8 +710,9 @@ def _default_serialize(self, xmlnode, params, shape, name):
690710
'kcs': KCSSerializer,
691711
'ec2': EC2Serializer,
692712
'query': QuerySerializer,
693-
'query-json': ResJSONSerializer,
694-
'json': KSJSONSerializer,
713+
'query-json': QueryAcceptJsonSerializer,
714+
'json': JSONSerializer,
715+
'json2': NotGetJsonSerializer,
695716
'rest-json': RestJSONSerializer,
696717
'rest-xml': RestXMLSerializer,
697718
}

0 commit comments

Comments
 (0)