Skip to content

Commit 04f77e8

Browse files
author
金山云SDK
authored
Merge pull request KscSDK#9 from liuyichen/master
headers中封装Version, Action
2 parents 0488d2b + 16f9b86 commit 04f77e8

File tree

3 files changed

+111
-41
lines changed

3 files changed

+111
-41
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: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -783,7 +783,9 @@ def _parse_error_from_body(self, response):
783783
'ec2': EC2QueryParser,
784784
'query': QueryParser,
785785
'query-json': JSONParser,
786+
'kcs': JSONParser,
786787
'json': JSONParser,
788+
'json2': JSONParser,
787789
'rest-json': RestJSONParser,
788790
'rest-xml': RestXMLParser,
789791
}

kscore/serialize.py

Lines changed: 85 additions & 40 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,52 +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
332+
serialized['body'] = data
333+
334+
return serialized
335+
336+
337+
class KCSSerializer(QueryAcceptJsonSerializer):
338+
339+
def _serialize_data(self, serialized, data):
309340

310-
serialized['headers'].update(Accept='application/json')
341+
serialized['body'] = {}
342+
343+
serialized['query_string'] = data
311344

312345
return serialized
313346

314347

315348
class JSONSerializer(Serializer):
349+
"""
350+
BASE JSON REQUEST all method with json body
351+
"""
316352
TIMESTAMP_FORMAT = 'unixtimestamp'
317353

318354
def serialize_to_request(self, parameters, operation_model):
319355
target = '%s.%s' % (operation_model.metadata['targetPrefix'],
320356
operation_model.name)
321-
json_version = operation_model.metadata['jsonVersion']
322357
serialized = self._create_default_request()
323358
serialized['method'] = operation_model.http.get('method',
324359
self.DEFAULT_METHOD)
360+
361+
serialized['query_string'] = self.MAP_TYPE(
362+
Action=operation_model.name, Version=operation_model.metadata['apiVersion']
363+
)
364+
325365
serialized['headers'] = {
326366
'X-Amz-Target': target,
327-
'Content-Type': 'application/x-amz-json-%s' % json_version,
367+
'Content-Type': 'application/json',
368+
'Accept': 'application/json',
369+
328370
}
329371
body = {}
330372
input_shape = operation_model.input_shape
331373
if input_shape is not None:
332374
self._serialize(body, parameters, input_shape)
333-
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)
334384
return serialized
335385

336386
def _serialize(self, serialized, value, shape, key=None):
@@ -383,21 +433,14 @@ def _serialize_type_blob(self, serialized, value, shape, key):
383433
serialized[key] = self._get_base64(value)
384434

385435

386-
class KSJSONSerializer(JSONSerializer):
436+
class NotGetJsonSerializer(JSONSerializer):
387437

388-
def serialize_to_request(self, parameters, operation_model):
389-
serialized = JSONSerializer.serialize_to_request(self, parameters, operation_model)
390-
query_params = self.MAP_TYPE()
391-
query_params['Action'] = operation_model.name
392-
query_params['Version'] = operation_model.metadata['apiVersion']
393-
serialized['query_string'] = query_params
394-
headers = {'Content-Type': 'application/json', 'Accept': 'application/json'}
395-
serialized['headers'].update(headers)
396-
body = {}
397-
input_shape = operation_model.input_shape
398-
if input_shape is not None:
399-
self._serialize(body, parameters, input_shape)
400-
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)
401444
return serialized
402445

403446

@@ -664,10 +707,12 @@ def _default_serialize(self, xmlnode, params, shape, name):
664707

665708

666709
SERIALIZERS = {
710+
'kcs': KCSSerializer,
667711
'ec2': EC2Serializer,
668712
'query': QuerySerializer,
669-
'query-json': ResJSONSerializer,
670-
'json': KSJSONSerializer,
713+
'query-json': QueryAcceptJsonSerializer,
714+
'json': JSONSerializer,
715+
'json2': NotGetJsonSerializer,
671716
'rest-json': RestJSONSerializer,
672717
'rest-xml': RestXMLSerializer,
673718
}

0 commit comments

Comments
 (0)