Merge pull request #412 from FindTheBest/master

Python/PHP Multipart-Form request support
This commit is contained in:
Tony Tam 2015-02-06 10:47:10 -08:00
commit f55d9eaa68
4 changed files with 57 additions and 10 deletions

View File

@ -77,7 +77,8 @@ class APIClient {
$headers[] = "api_key: " . $this->apiKey;
}
if (is_object($postData) or is_array($postData)) {
if (strpos($headers['Content-Type'], "multipart/form-data") < 0 and (is_object($postData) or is_array($postData))) {
$postData = json_encode($this->sanitizeForSerialization($postData));
}

View File

@ -72,7 +72,12 @@ class {{classname}} {
}
{{#formParams}}
if(${{paramName}} != null) {
{{#notFile}}
$body['{{paramName}}'] = ${{paramName}};
{{/notFile}}
{{#isFile}}
$body['{{paramName}}'] = '@' . ${{paramName}};
{{/isFile}}
}
{{/formParams}}
if (empty($body)) {

View File

@ -59,8 +59,11 @@ class {{classname}}(object):
queryParams = {}
headerParams = {}
formParams = {}
files = {}
bodyParam = None
headerParams['Content-type'] = '{{#consumes}}{{mediaType}}{{#hasMore}},{{/hasMore}}{{/consumes}}'
{{#queryParams}}
if ('{{paramName}}' in params):
queryParams['{{paramName}}'] = self.apiClient.toPathValue(params['{{paramName}}'])
@ -80,10 +83,9 @@ class {{classname}}(object):
{{#formParams}}
if ('{{paramName}}' in params):
formParams['{{paramName}}'] = params['{{paramName}}']
{{#notFile}}formParams['{{paramName}}'] = params['{{paramName}}']{{/notFile}}{{#isFile}}files['{{paramName}}'] = params['{{paramName}}']{{/isFile}}
{{newline}}
{{/formParams}}
if formParams:
headerParams['Content-type'] = 'application/x-www-form-urlencoded'
{{#bodyParam}}
if ('{{paramName}}' in params):
@ -93,7 +95,7 @@ class {{classname}}(object):
postData = (formParams if formParams else bodyParam)
response = self.apiClient.callAPI(resourcePath, method, queryParams,
postData, headerParams)
postData, headerParams, files=files)
{{#returnType}}
if not response:

View File

@ -12,6 +12,9 @@ import urllib2
import httplib
import json
import datetime
import mimetypes
import random
import string
from models import *
@ -26,9 +29,10 @@ class ApiClient:
self.apiKey = apiKey
self.apiServer = apiServer
self.cookie = None
self.boundary = ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(30))
def callAPI(self, resourcePath, method, queryParams, postData,
headerParams=None):
headerParams=None, files=None):
url = self.apiServer + resourcePath
headers = {}
@ -36,7 +40,6 @@ class ApiClient:
for param, value in headerParams.iteritems():
headers[param] = value
#headers['Content-type'] = 'application/json'
headers['api_key'] = self.apiKey
if self.cookie:
@ -60,12 +63,16 @@ class ApiClient:
elif method in ['POST', 'PUT', 'DELETE']:
if postData:
data = self.sanitizeForSerialization(postData)
postData = self.sanitizeForSerialization(postData)
if 'Content-type' not in headers:
headers['Content-type'] = 'application/json'
data = json.dumps(data)
data = json.dumps(postData)
elif headers['Content-type'] == 'multipart/form-data':
data = self.buildMultipartFormData(postData, files)
headers['Content-type'] = 'multipart/form-data; boundary={0}'.format(self.boundary)
headers['Content-length'] = str(len(data))
else:
data = urllib.urlencode(data)
data = urllib.urlencode(postData)
else:
raise Exception('Method ' + method + ' is not recognized.')
@ -127,6 +134,38 @@ class ApiClient:
elif type(postData) not in safeToDump:
data = json.dumps(postData.__dict__)
def buildMultipartFormData(self, postData, files):
def escape_quotes(s):
return s.replace('"', '\\"')
lines = []
for name, value in postData.items():
lines.extend((
'--{0}'.format(self.boundary),
'Content-Disposition: form-data; name="{0}"'.format(escape_quotes(name)),
'',
str(value),
))
for name, filepath in files.items():
f = open(filepath, 'r')
filename = filepath.split('/')[-1]
mimetype = mimetypes.guess_type(filename)[0] or 'application/octet-stream'
lines.extend((
'--{0}'.format(self.boundary),
'Content-Disposition: form-data; name="{0}"; filename="{1}"'.format(escape_quotes(name), escape_quotes(filename)),
'Content-Type: {0}'.format(mimetype),
'',
f.read()
))
lines.extend((
'--{0}--'.format(self.boundary),
''
))
return '\r\n'.join(lines)
def deserialize(self, obj, objClass):
"""Derialize a JSON string into an object.