urbanairship 5.6.0 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +30 -0
- data/README.rst +1 -0
- data/docs/ab_tests.rst +162 -0
- data/docs/attributes.rst +52 -0
- data/docs/automations.rst +212 -0
- data/docs/index.rst +3 -0
- data/docs/push.rst +24 -0
- data/docs/sms.rst +19 -0
- data/docs/static_lists.rst +2 -2
- data/lib/urbanairship.rb +12 -0
- data/lib/urbanairship/ab_tests/ab_test.rb +88 -0
- data/lib/urbanairship/ab_tests/experiment.rb +45 -0
- data/lib/urbanairship/ab_tests/variant.rb +34 -0
- data/lib/urbanairship/automations/automation.rb +105 -0
- data/lib/urbanairship/automations/pipeline.rb +52 -0
- data/lib/urbanairship/client.rb +22 -9
- data/lib/urbanairship/common.rb +63 -16
- data/lib/urbanairship/configuration.rb +2 -1
- data/lib/urbanairship/custom_events/custom_event.rb +60 -0
- data/lib/urbanairship/custom_events/payload.rb +89 -0
- data/lib/urbanairship/devices/attribute.rb +54 -0
- data/lib/urbanairship/devices/channel_tags.rb +1 -1
- data/lib/urbanairship/devices/channel_uninstall.rb +10 -10
- data/lib/urbanairship/devices/create_and_send.rb +4 -4
- data/lib/urbanairship/devices/devicelist.rb +28 -7
- data/lib/urbanairship/devices/email.rb +5 -5
- data/lib/urbanairship/devices/email_notification.rb +11 -4
- data/lib/urbanairship/devices/named_user.rb +6 -6
- data/lib/urbanairship/devices/open_channel.rb +22 -23
- data/lib/urbanairship/devices/segment.rb +5 -5
- data/lib/urbanairship/devices/sms.rb +40 -9
- data/lib/urbanairship/devices/static_lists.rb +12 -12
- data/lib/urbanairship/push/location.rb +7 -7
- data/lib/urbanairship/push/push.rb +23 -13
- data/lib/urbanairship/push/schedule.rb +9 -0
- data/lib/urbanairship/reports/response_statistics.rb +9 -9
- data/lib/urbanairship/version.rb +1 -1
- metadata +16 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 169148502585341b7938add240f3595e2124e56228916a1ad73b72f4e457885e
|
4
|
+
data.tar.gz: da1a1067c809c43bed0b0df1ebfc55d28443c2adcb1d5c0c8f3311dbd070b378
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6f04b2d733ed47e8bf8779cf3844d67962b0b7815c9450b5112cb706b81e8c8f566660034f21a8762a6ddc9ac6c547e43fdbc11d083e881096bac53315d9f8d2
|
7
|
+
data.tar.gz: fdd59798309c0dca97e596c35684ccab4f1cf04d9ffe7fb72eb6964a5466c126c6d47c236f9b50f784b4b1ba1e5a455b00950353aa9c77ffb62aa48ace89a2ee
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,33 @@
|
|
1
|
+
--------------------
|
2
|
+
6.0.0
|
3
|
+
--------------------
|
4
|
+
- Creates custom base url, and refactors urls within classes
|
5
|
+
- Adds support for sending custom events
|
6
|
+
|
7
|
+
--------------------
|
8
|
+
5.9.0
|
9
|
+
--------------------
|
10
|
+
- Adds support for bearer token auth
|
11
|
+
- Updates broken code for static lists
|
12
|
+
- Adds support for update sms channel
|
13
|
+
|
14
|
+
--------------------
|
15
|
+
5.8.0
|
16
|
+
--------------------
|
17
|
+
- Adds scheudling support for PTSO
|
18
|
+
- Adds attribute support
|
19
|
+
|
20
|
+
--------------------
|
21
|
+
5.7.0
|
22
|
+
--------------------
|
23
|
+
- Adds Automation support
|
24
|
+
- Adds A/B test support
|
25
|
+
|
26
|
+
--------------------
|
27
|
+
5.6.1
|
28
|
+
--------------------
|
29
|
+
- Updates EmailNotification templating
|
30
|
+
|
1
31
|
--------------------
|
2
32
|
5.6.0
|
3
33
|
--------------------
|
data/README.rst
CHANGED
@@ -58,6 +58,7 @@ In your app initialization, you can do something like the following:
|
|
58
58
|
|
59
59
|
>>> require 'urbanairship'
|
60
60
|
>>> Urbanairship.configure do |config|
|
61
|
+
>>> config.server = 'go.airship.eu'
|
61
62
|
>>> config.log_path = '/path/to/your/logfile'
|
62
63
|
>>> config.log_level = Logger::WARN
|
63
64
|
>>> config.timeout = 60
|
data/docs/ab_tests.rst
ADDED
@@ -0,0 +1,162 @@
|
|
1
|
+
A/B Tests
|
2
|
+
=========
|
3
|
+
|
4
|
+
In this client, we format A/B tests with three nesting components. The first is the Variant,
|
5
|
+
the difference between one kind of push and another. The Variant is a part of the Experiment
|
6
|
+
object, with many variants in an array. Lastly. AbTest handles what Experiments along with their Variants
|
7
|
+
get sent to the various API endpoints. Basic pushes can be added straight to the Variant object
|
8
|
+
on the push instance variable, or a Push object can be created, and the payload applied to the
|
9
|
+
Variant object. For more information on this please visit: https://docs.airship.com/api/ua/#tag/a/b-tests
|
10
|
+
|
11
|
+
List Existing A/B Tests
|
12
|
+
-----------------------
|
13
|
+
|
14
|
+
This endpoint will return the existing A/B tests on a project.
|
15
|
+
|
16
|
+
.. code-block:: ruby
|
17
|
+
|
18
|
+
require 'urbanairship'
|
19
|
+
UA = Urbanairship
|
20
|
+
airship = UA::Client.new(key:'<app_key>', secret:'<secret_key>')
|
21
|
+
ab_test = UA::AbTest.new(client: airship)
|
22
|
+
ab_test.limit = 5
|
23
|
+
ab_test.list_ab_test
|
24
|
+
|
25
|
+
.. note::
|
26
|
+
|
27
|
+
Should return a 200 HTTP status code as well as a list of existing A/B tests with a
|
28
|
+
default offset and a limit of 5. The limit and offset are optional here.
|
29
|
+
|
30
|
+
Create A/B Test
|
31
|
+
----------------
|
32
|
+
|
33
|
+
As described above, the creation of an A/B Test consists of creating a few objects, grabbing
|
34
|
+
pertinent data out of them, and creating an A/B Test that is as complicated or as simple as you
|
35
|
+
like. In some cases, it might be easier to assign the payload values yourself, but as pushes,
|
36
|
+
and the tests themselves get more complicated, it is easier to let the objects do the work for you.
|
37
|
+
|
38
|
+
|
39
|
+
.. code-block:: ruby
|
40
|
+
|
41
|
+
require 'urbanairship'
|
42
|
+
UA = Urbanairship
|
43
|
+
airship = UA::Client.new(key:'<app_key>', secret:'<secret_key>')
|
44
|
+
variant_one = UA::Variant.new(client: airship)
|
45
|
+
variant_one.push = {
|
46
|
+
"notification": {
|
47
|
+
"alert": "I love cereal"
|
48
|
+
}
|
49
|
+
}
|
50
|
+
variant_two = UA::Variant.new(client: airship)
|
51
|
+
variant_two.push = {
|
52
|
+
"notification": {
|
53
|
+
"alert": "I prefer oatmeal"
|
54
|
+
}
|
55
|
+
}
|
56
|
+
experiment = UA::Experiment.new(client: airship)
|
57
|
+
experiment.name = 'Neat experiment'
|
58
|
+
experiment.description = 'See how neat we can get'
|
59
|
+
experiment.audience = 'all'
|
60
|
+
experiment.device_types = 'all'
|
61
|
+
experiment.variants << variant_one.payload
|
62
|
+
experiment.variants << variant_two.payload
|
63
|
+
ab_test = UA::AbTest.new(client: airship)
|
64
|
+
ab_test.experiment_object = experiment.payload
|
65
|
+
ab_test.create_ab_test
|
66
|
+
|
67
|
+
.. note::
|
68
|
+
|
69
|
+
Should return a 201 HTTP status code as well as other information detailing specific
|
70
|
+
information (such as push_id) for the newly created A/B Test.
|
71
|
+
|
72
|
+
List Scheduled A/B Tests
|
73
|
+
------------------------
|
74
|
+
|
75
|
+
This will list all the scheduled A/B Tests for a project.
|
76
|
+
|
77
|
+
.. code-block:: ruby
|
78
|
+
|
79
|
+
require 'urbanairship'
|
80
|
+
UA = Urbanairship
|
81
|
+
airship = UA::Client.new(key:'<app_key>', secret:'<secret_key>')
|
82
|
+
ab_test = UA::AbTest.new(client: airship)
|
83
|
+
ab_test.list_scheduled_ab_test
|
84
|
+
|
85
|
+
.. note::
|
86
|
+
|
87
|
+
Should return a 200 HTTP status code. Here, you can also apply limit and offset by assigning
|
88
|
+
values to the instance variables on the AbTest object.
|
89
|
+
|
90
|
+
Delete A/B Test
|
91
|
+
----------------
|
92
|
+
|
93
|
+
This will delete an A/B Test with a given experiment ID.
|
94
|
+
|
95
|
+
.. code-block:: ruby
|
96
|
+
|
97
|
+
require 'urbanairship'
|
98
|
+
UA = Urbanairship
|
99
|
+
airship = UA::Client.new(key:'<app_key>', secret:'<secret_key>')
|
100
|
+
ab_test = UA::AbTest.new(client: airship)
|
101
|
+
ab_test.experiment_id = '<experiment_id>'
|
102
|
+
ab_test.delete_ab_test
|
103
|
+
|
104
|
+
.. note::
|
105
|
+
|
106
|
+
Response should be a 200 HTTP Response
|
107
|
+
|
108
|
+
Validate A/B Test
|
109
|
+
------------------
|
110
|
+
|
111
|
+
Very similar to the create A/B Test endpoint, this will validate an A/B Test to
|
112
|
+
see if it is formatted properly.
|
113
|
+
|
114
|
+
.. code-block:: ruby
|
115
|
+
|
116
|
+
require 'urbanairship'
|
117
|
+
UA = Urbanairship
|
118
|
+
airship = UA::Client.new(key:'<app_key>', secret:'<secret_key>')
|
119
|
+
variant_one = UA::Variant.new(client: airship)
|
120
|
+
variant_one.push = {
|
121
|
+
"notification": {
|
122
|
+
"alert": "I love cereal"
|
123
|
+
}
|
124
|
+
}
|
125
|
+
variant_two = UA::Variant.new(client: airship)
|
126
|
+
variant_two.push = {
|
127
|
+
"notification": {
|
128
|
+
"alert": "I prefer oatmeal"
|
129
|
+
}
|
130
|
+
}
|
131
|
+
experiment = UA::Experiment.new(client: airship)
|
132
|
+
experiment.name = 'Neat experiment'
|
133
|
+
experiment.description = 'See how neat we can get'
|
134
|
+
experiment.audience = 'all'
|
135
|
+
experiment.device_types = 'all'
|
136
|
+
experiment.variants << variant_one.payload
|
137
|
+
experiment.variants << variant_two.payload
|
138
|
+
ab_test = UA::AbTest.new(client: airship)
|
139
|
+
ab_test.experiment_object = experiment.payload
|
140
|
+
ab_test.validate_ab_test
|
141
|
+
|
142
|
+
.. note::
|
143
|
+
|
144
|
+
Should return a 200 HTTP status code.
|
145
|
+
|
146
|
+
Individual A/B Test Lookup
|
147
|
+
--------------------------
|
148
|
+
|
149
|
+
This will lookup a specific A/B Test with a given experiment_id
|
150
|
+
|
151
|
+
.. code-block:: ruby
|
152
|
+
|
153
|
+
require 'urbanairship'
|
154
|
+
UA = Urbanairship
|
155
|
+
airship = UA::Client.new(key:'<app_key>', secret:'<secret_key>')
|
156
|
+
ab_test = UA::AbTest.new(client: airship)
|
157
|
+
ab_test.experiment_id = '<experiment_id>'
|
158
|
+
ab_test.lookup_ab_test
|
159
|
+
|
160
|
+
.. note::
|
161
|
+
|
162
|
+
Should return a 200 HTTP status code
|
data/docs/attributes.rst
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
Attributes
|
2
|
+
==========
|
3
|
+
|
4
|
+
Set Attribute for a Channel
|
5
|
+
---------------------------
|
6
|
+
|
7
|
+
The following will set an attribute for a given channel ID.
|
8
|
+
|
9
|
+
.. code-block:: ruby
|
10
|
+
|
11
|
+
require 'urbanairship'
|
12
|
+
UA = Urbanairship
|
13
|
+
airship = UA::Client.new(key:'app_key', secret:'secret_key')
|
14
|
+
channel_info = UA::ChannelInfo.new(client: airship)
|
15
|
+
channel_info.audience = {"ios_channel": "b8f9b663-0a3b-cf45-587a-be880946e881"}
|
16
|
+
channel_info.attributes = {
|
17
|
+
"action": "set",
|
18
|
+
"key": "favorite_food",
|
19
|
+
"value": "cake"
|
20
|
+
}
|
21
|
+
channel_info.set_attributes
|
22
|
+
|
23
|
+
.. note::
|
24
|
+
|
25
|
+
This should return a 200 response
|
26
|
+
|
27
|
+
Send Push to Audience with Attribute Specifications
|
28
|
+
---------------------------------------------------
|
29
|
+
|
30
|
+
This will send a push to an audience who meet the specifications of attribute we
|
31
|
+
set here. This example is using a text attribute where we are looking for audience
|
32
|
+
members whose favorite food includes 'apple'. Some examples of what this could return
|
33
|
+
would be 'apple', 'pineapple', or 'apple pie'.
|
34
|
+
|
35
|
+
.. code-block:: ruby
|
36
|
+
|
37
|
+
require 'urbanairship'
|
38
|
+
UA = Urbanairship
|
39
|
+
airship = UA::Client.new(key:'app_key', secret:'secret_key')
|
40
|
+
new_attribute = UA::Attribute.new(client: airship)
|
41
|
+
new_attribute.attribute = 'favorite_food'
|
42
|
+
new_attribute.operator = 'contains'
|
43
|
+
new_attribute.value = 'apple'
|
44
|
+
push = airship.create_push
|
45
|
+
push.audience = new_attribute.payload
|
46
|
+
push.notification = UA.notification(alert: 'Hello')
|
47
|
+
push.device_types = ['android', 'ios', 'web']
|
48
|
+
push.send_push
|
49
|
+
|
50
|
+
.. note::
|
51
|
+
|
52
|
+
This should return a 202 response
|
@@ -0,0 +1,212 @@
|
|
1
|
+
Automations
|
2
|
+
===========
|
3
|
+
|
4
|
+
The Automation class harnesses the Pipeline class in order to provide functionality
|
5
|
+
for creating, listing, validating, updating, and deleting pipelines. There are a lot
|
6
|
+
of moving parts that go into creating a pipeline, so please view our docs on that
|
7
|
+
topic here: https://docs.airship.com/api/ua/#schemas%2fpipelineobject
|
8
|
+
|
9
|
+
List Existing Automations
|
10
|
+
-------------------------
|
11
|
+
|
12
|
+
This is for viewing existing pipeleines for a project. There are optional parameters
|
13
|
+
that can be passed into the URI to have control over what pipelines are returned. In the
|
14
|
+
following example a limit query of 5 will be added to the URI.
|
15
|
+
|
16
|
+
.. code-block:: ruby
|
17
|
+
|
18
|
+
require 'urbanairship'
|
19
|
+
UA = Urbanairship
|
20
|
+
airship = UA::Client.new(key:'<app_key>', secret:'<secret_key>')
|
21
|
+
automation = UA::Automation.new(client: airship)
|
22
|
+
automation.limit = 5
|
23
|
+
automation.list_automations
|
24
|
+
|
25
|
+
.. note::
|
26
|
+
|
27
|
+
Should return a 200 HTTP status code, and 5 of the most recent Automations
|
28
|
+
|
29
|
+
Create Automation
|
30
|
+
-----------------
|
31
|
+
|
32
|
+
This will use the Pipeline model to create an automation. You may add several
|
33
|
+
pipelines objects to create several automations/pipelines at once. The example
|
34
|
+
below adds two. If you would like to just add one pipeline, forgo the array,
|
35
|
+
and assign the pipeline payload directly to automation.pipeline_object.
|
36
|
+
|
37
|
+
.. code-block:: ruby
|
38
|
+
|
39
|
+
require 'urbanairship'
|
40
|
+
UA = Urbanairship
|
41
|
+
airship = UA::Client.new(key:'<app_key>', secret:'<app_secret>')
|
42
|
+
pipeline_one = UA::Pipeline.new(client: airship)
|
43
|
+
pipeline_one.enabled = true
|
44
|
+
pipeline_one.immediate_trigger = {
|
45
|
+
"tag_added": {
|
46
|
+
"tag": "new_customer",
|
47
|
+
"group": "crm"
|
48
|
+
}
|
49
|
+
}
|
50
|
+
pipeline_one.outcome = {
|
51
|
+
"push": {
|
52
|
+
"audience": "triggered",
|
53
|
+
"device_types": "all",
|
54
|
+
"notification": {
|
55
|
+
"alert": "Hello new customer!"
|
56
|
+
}
|
57
|
+
}
|
58
|
+
}
|
59
|
+
pipeline_two = UA::Pipeline.new(client: airship)
|
60
|
+
pipeline_two.enabled = true
|
61
|
+
pipeline_two.immediate_trigger = {
|
62
|
+
"tag_added": {
|
63
|
+
"tag": "new_customer",
|
64
|
+
"group": "crm"
|
65
|
+
}
|
66
|
+
}
|
67
|
+
pipeline_two.outcome = {
|
68
|
+
"push": {
|
69
|
+
"audience": "triggered",
|
70
|
+
"device_types": "all",
|
71
|
+
"notification": {
|
72
|
+
"alert": "Here is a different second alert!"
|
73
|
+
}
|
74
|
+
}
|
75
|
+
}
|
76
|
+
pipelines = [pipeline_one.payload, pipeline_two.payload]
|
77
|
+
automation = UA::Automation.new(client: airship)
|
78
|
+
automation.pipeline_object = pipelines
|
79
|
+
automation.create_automation
|
80
|
+
|
81
|
+
.. note::
|
82
|
+
|
83
|
+
Should return a 201 HTTP status code.
|
84
|
+
|
85
|
+
List Deleted Automations
|
86
|
+
------------------------
|
87
|
+
|
88
|
+
This is for viewing deleted pipeleines for a project. The optional param here is for "start";
|
89
|
+
a timestamp of the starting element for paginating results in the format of YYYY-MM-DD.
|
90
|
+
|
91
|
+
.. code-block:: ruby
|
92
|
+
|
93
|
+
require 'urbanairship'
|
94
|
+
UA = Urbanairship
|
95
|
+
airship = UA::Client.new(key:'<app_key>', secret:'<secret_key>')
|
96
|
+
automation = UA::Automation.new(client: airship)
|
97
|
+
automation.start = 2020-02-20
|
98
|
+
automation.list_deleted_automations
|
99
|
+
|
100
|
+
.. note::
|
101
|
+
|
102
|
+
Should return a 200 HTTP status code, and the deleted automations from either most current
|
103
|
+
or from a given start date.
|
104
|
+
|
105
|
+
Validate Automation
|
106
|
+
-------------------
|
107
|
+
|
108
|
+
This endpoint is a lot like the create automation endpoint, the basic set up is the same,
|
109
|
+
only difference here is the method selected.
|
110
|
+
|
111
|
+
.. code-block:: ruby
|
112
|
+
|
113
|
+
require 'urbanairship'
|
114
|
+
UA = Urbanairship
|
115
|
+
airship = UA::Client.new(key:'<app_key>', secret:'<app_secret>')
|
116
|
+
pipeline = UA::Pipeline.new(client: airship)
|
117
|
+
pipeline.enabled = true
|
118
|
+
pipeline.immediate_trigger = {
|
119
|
+
"tag_added": {
|
120
|
+
"tag": "new_customer",
|
121
|
+
"group": "crm"
|
122
|
+
}
|
123
|
+
}
|
124
|
+
pipeline.outcome = {
|
125
|
+
"push": {
|
126
|
+
"audience": "triggered",
|
127
|
+
"device_types": "all",
|
128
|
+
"notification": {
|
129
|
+
"alert": "Hello new customer!"
|
130
|
+
}
|
131
|
+
}
|
132
|
+
}
|
133
|
+
automation = UA::Automation.new(client: airship)
|
134
|
+
automation.pipeline_object = pipeline.payload
|
135
|
+
automation.validate_automation
|
136
|
+
|
137
|
+
.. note::
|
138
|
+
|
139
|
+
Should return a 200 HTTP status code.
|
140
|
+
|
141
|
+
Individual Automation Lookup
|
142
|
+
----------------------------
|
143
|
+
|
144
|
+
This is for looking up a single automation with a given ID.
|
145
|
+
|
146
|
+
.. code-block:: ruby
|
147
|
+
|
148
|
+
require 'urbanairship'
|
149
|
+
UA = Urbanairship
|
150
|
+
airship = UA::Client.new(key:'<app_key>', secret:'<secret_key>')
|
151
|
+
automation = UA::Automation.new(client: airship)
|
152
|
+
automation.pipeline_id = '86ad9239-373d-d0a5-d5d8-04fed18f79bc'
|
153
|
+
automation.lookup_automation
|
154
|
+
|
155
|
+
.. note::
|
156
|
+
|
157
|
+
Should return a 200 HTTP status code, and the payload for the automation in question.
|
158
|
+
|
159
|
+
Update Automation
|
160
|
+
-----------------
|
161
|
+
|
162
|
+
This is for updating an existing automation. You must include the full payload from a POST
|
163
|
+
response, with the updates that you want to make within the payload.
|
164
|
+
|
165
|
+
.. code-block:: ruby
|
166
|
+
|
167
|
+
require 'urbanairship'
|
168
|
+
UA = Urbanairship
|
169
|
+
airship = UA::Client.new(key:'<app_key>', secret:'<secret_key>')
|
170
|
+
pipeline = UA::Pipeline.new(client: airship)
|
171
|
+
pipeline.enabled = true
|
172
|
+
pipeline.immediate_trigger = {
|
173
|
+
"tag_added": {
|
174
|
+
"tag": "new_tag_update",
|
175
|
+
"group": "Locale"
|
176
|
+
}
|
177
|
+
}
|
178
|
+
pipeline.outcome = {
|
179
|
+
"push": {
|
180
|
+
"audience": "triggered",
|
181
|
+
"device_types": "all",
|
182
|
+
"notification": {
|
183
|
+
"alert": "Newly created alert message!"
|
184
|
+
}
|
185
|
+
}
|
186
|
+
}
|
187
|
+
automation = UA::Automation.new(client: airship)
|
188
|
+
automation.pipeline_id = '0f927674-918c-31ef-51ca-e96fdd234da4'
|
189
|
+
automation.pipeline_object = pipeline.payload
|
190
|
+
automation.update_automation
|
191
|
+
|
192
|
+
.. note::
|
193
|
+
|
194
|
+
Should return a 200 HTTP status code.
|
195
|
+
|
196
|
+
Delete Automation
|
197
|
+
-----------------
|
198
|
+
|
199
|
+
This is for deleting a pipeline with a given ID.
|
200
|
+
|
201
|
+
.. code-block:: ruby
|
202
|
+
|
203
|
+
require 'urbanairship'
|
204
|
+
UA = Urbanairship
|
205
|
+
airship = UA::Client.new(key:'<app_key>', secret:'<secret_key>')
|
206
|
+
automation = UA::Automation.new(client: airship)
|
207
|
+
automation.pipeline_id = '86ad9239-373d-d0a5-d5d8-04fed18f79bc'
|
208
|
+
automation.delete_automation
|
209
|
+
|
210
|
+
.. note::
|
211
|
+
|
212
|
+
Response should be a 204 No Content
|