Skip to content

Commit

Permalink
Merge pull request #39 from mollie/query-params-for-post-requests
Browse files Browse the repository at this point in the history
Add support for query string parameters for POST requests
  • Loading branch information
mvdpanne committed Apr 4, 2018
2 parents 2e45f25 + b82fcdb commit 6854af6
Show file tree
Hide file tree
Showing 6 changed files with 40 additions and 39 deletions.
1 change: 1 addition & 0 deletions .travis.yml
Expand Up @@ -8,6 +8,7 @@ python:
- "3.6"

install:
- pip install --upgrade pip setuptools
- pip install pipenv
- pipenv install --dev

Expand Down
8 changes: 2 additions & 6 deletions Mollie/API/Client.py
Expand Up @@ -6,14 +6,12 @@

import requests

from .Error import Error
from . import Error
from . import Resource


class Client(object):
CLIENT_VERSION = '1.2.1'
HTTP_GET = 'GET'
HTTP_POST = 'POST'
HTTP_DELETE = 'DELETE'
API_ENDPOINT = 'https://api.mollie.nl'
API_VERSION = 'v1'
UNAME = ' '.join(platform.uname())
Expand All @@ -35,8 +33,6 @@ def validateApiKey(api_key):
return api_key

def __init__(self, api_key=None, api_endpoint=None):
from . import Resource

self.api_endpoint = self.validateApiEndpoint(api_endpoint or self.API_ENDPOINT)
self.api_version = self.API_VERSION
self.api_key = self.validateApiKey(api_key) if api_key else None
Expand Down
43 changes: 13 additions & 30 deletions Mollie/API/Resource/Base.py
@@ -1,16 +1,15 @@
from Mollie.API.Client import Client
from Mollie.API.Error import Error
from Mollie.API.Object import List

import json

from Mollie.API import Error
from Mollie.API.Object import List


class Base(object):
REST_CREATE = Client.HTTP_POST
REST_UPDATE = Client.HTTP_POST
REST_READ = Client.HTTP_GET
REST_LIST = Client.HTTP_GET
REST_DELETE = Client.HTTP_DELETE
REST_CREATE = 'POST'
REST_UPDATE = 'POST'
REST_READ = 'GET'
REST_LIST = 'GET'
REST_DELETE = 'DELETE'
DEFAULT_LIMIT = 10

def __init__(self, client):
Expand All @@ -29,7 +28,7 @@ def rest_create(self, data, params=None):

def rest_read(self, resource_id, params=None):
path = self.getResourceName() + '/' + str(resource_id)
result = self.performApiCall(self.REST_READ, path, None, params)
result = self.performApiCall(self.REST_READ, path, params=params)
return self.getResourceObject(result)

def rest_update(self, resource_id, data, params=None):
Expand All @@ -39,54 +38,38 @@ def rest_update(self, resource_id, data, params=None):

def rest_delete(self, resource_id, params=None):
path = self.getResourceName() + '/' + str(resource_id)
return self.performApiCall(self.REST_DELETE, path, None, params)
return self.performApiCall(self.REST_DELETE, path, params=params)

def rest_list(self, params=None):
path = self.getResourceName()
result = self.performApiCall(self.REST_LIST, path, None, params)
result = self.performApiCall(self.REST_LIST, path, params=params)
return List(result, self.getResourceObject({}).__class__)

def create(self, data=None, **params):
data = self.merge_dictionaries(data, params)
if data is not None:
try:
data = json.dumps(data)
except Exception as e:
raise Error('Error encoding parameters into JSON: "%s"' % str(e))
return self.rest_create(data)
return self.rest_create(data, params)

def get(self, resource_id, **params):
return self.rest_read(resource_id, params)

def update(self, resource_id, data=None, **params):
data = self.merge_dictionaries(data, params)
if data is not None:
try:
data = json.dumps(data)
except Exception as e:
raise Error('Error encoding parameters into JSON: "%s"' % str(e))
return self.rest_update(resource_id, data)
return self.rest_update(resource_id, data, params)

def delete(self, resource_id):
return self.rest_delete(resource_id)

def all(self, **params):
return self.rest_list(params)

@staticmethod
def merge_dictionaries(a, b):
if a is None and b is None:
return None
if a is None:
return b
if b is None:
return a

merged_dict = a.copy()
merged_dict.update(b)

return merged_dict

def performApiCall(self, http_method, path, data=None, params=None):
body = self.client.performHttpCall(http_method, path, data, params)
try:
Expand Down
4 changes: 2 additions & 2 deletions Mollie/API/__init__.py
@@ -1,6 +1,6 @@
__all__ = ["Object", "Resource", "Error", "Client"]

from . import Object
from . import Resource
from .Error import Error
from .Client import Client
from . import Object
from . import Resource
21 changes: 21 additions & 0 deletions README.md
Expand Up @@ -71,6 +71,27 @@ if payment.isPaid():
print 'Payment received.'
```

### How to pass the different parameter types ###
In the example above, a new payment is created by passing a dictionary of payment data, which corresponds to the `data` parameter of the `mollie.payments.create` method. This data will be used as request body in a POST request to Mollie. In general, the methods for POST requests, which accept request body parameters, have a `data` parameter to provide such request body parameters.

Every keyword argument (other than `data`) passed to a method will be interpreted as a query string parameter. For example, the following method call:
```python
payments = mollie.payments.all(count=20)
```
Will result in a request with query string `?count=20`. Furthermore, this is an example of a request that only accepts query string parameters. Both can be combined, however, to for example create a payment that includes a QR code object:
```python
payment = mollie.payments.create(
{
'amount': 10.00,
'description': 'My first API payment',
'redirectUrl': 'https://webshop.example.org/order/12345/',
'webhookUrl': 'https://webshop.example.org/mollie-webhook/',
'method': Method.IDEAL
},
include='details.qrCode'
)
```

### Fully integrated iDEAL payments ###

If you want to fully integrate iDEAL payments in your web site, some additional steps are required. First, you need to
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Expand Up @@ -2,7 +2,7 @@

setup(
name='mollie-api-python',
version='1.3.2',
version='1.4.0',
license='BSD',
packages=find_packages(),
include_package_data=True,
Expand Down

0 comments on commit 6854af6

Please sign in to comment.