blob: 0deb4a021c10e0796e244a09c1964484d758d2ab [file] [log] [blame]
.. Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
.. http://www.apache.org/licenses/LICENSE-2.0
.. Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
HTTP Operators
==============
The following code examples use the ``http_default`` connection which means the requests are sent against
`httpbin <https://www.httpbin.org/>`__ site to perform basic HTTP operations.
.. _howto/operator:HttpSensor:
HttpSensor
----------
Use the :class:`~airflow.providers.http.sensors.http.HttpSensor` to poke until the ``response_check`` callable evaluates
to ``true``.
Here we are poking until httpbin gives us a response text containing ``httpbin``.
.. exampleinclude:: /../../airflow/providers/http/example_dags/example_http.py
:language: python
:start-after: [START howto_operator_http_http_sensor_check]
:end-before: [END howto_operator_http_http_sensor_check]
.. _howto/operator:SimpleHttpOperator:
SimpleHttpOperator
------------------
Use the :class:`~airflow.providers.http.operators.http.SimpleHttpOperator` to call HTTP requests and get
the response text back.
.. warning:: Configuring ``https`` via SimpleHttpOperator is counter-intuitive
For historical reasons, configuring ``HTTPS`` connectivity via HTTP operator is, well, difficult and
counter-intuitive. The Operator defaults to ``http`` protocol and you can change the schema used by the
operator via ``scheme`` connection attribute. However this field was originally added to connection for
database type of URIs, where database schemes are set traditionally as first component of URI ``path``.
Therefore if you want to configure as ``https`` connection via URI, you need to pass ``https`` scheme
to the SimpleHttpOperator. AS stupid as it looks, your connection URI will look like this:
``http://your_host:443/https``. Then if you want to use different URL paths in SimpleHttpOperator
you should pass your path as ``endpoint`` parameter when running the task. For example to run a query to
``https://your_host:443/my_endpoint`` you need to set the endpoint parameter to ``my_endpoint``.
Alternatively, if you want, you could also percent-encode the host including the ``https://`` prefix,
and as long it contains ``://`` (percent-encoded ``%3a%2f%2f``), the first component of the path will
not be used as scheme. Your URI definition might then look like: ``http://https%3a%2f%2fyour_host:443/``
In this case however the ``path`` will not be used at all - you still need to use ``endpoint``
parameter in the task if wish to make a request with specific path. As counter-intuitive as it is, this
is historically the way how the operator/hook works and it's not easy to change without breaking
backwards compatibility because there are other operators build on top of the ``SimpleHttpOperator`` that
rely on that functionality and there are many users using it already.
In the first example we are calling a ``POST`` with json data and succeed when we get the same json data back
otherwise the task will fail.
.. exampleinclude:: /../../airflow/providers/http/example_dags/example_http.py
:language: python
:start-after: [START howto_operator_http_task_post_op]
:end-before: [END howto_operator_http_task_post_op]
Here we are calling a ``GET`` request and pass params to it. The task will succeed regardless of the response text.
.. exampleinclude:: /../../airflow/providers/http/example_dags/example_http.py
:language: python
:start-after: [START howto_operator_http_task_get_op]
:end-before: [END howto_operator_http_task_get_op]
SimpleHttpOperator returns the response body as text by default. If you want to modify the response before passing
it on the next task downstream use ``response_filter``. This is useful if:
- the API you are consuming returns a large JSON payload and you're interested in a subset of the data
- the API returns data in xml or csv and you want to convert it to JSON
- you're interested in the headers of the response instead of the body
Below is an example of retrieving data from a REST API and only returning a nested property instead of the full
response body.
.. exampleinclude:: /../../airflow/providers/http/example_dags/example_http.py
:language: python
:start-after: [START howto_operator_http_task_get_op_response_filter]
:end-before: [END howto_operator_http_task_get_op_response_filter]
In the third example we are performing a ``PUT`` operation to put / set data according to the data that is being
provided to the request.
.. exampleinclude:: /../../airflow/providers/http/example_dags/example_http.py
:language: python
:start-after: [START howto_operator_http_task_put_op]
:end-before: [END howto_operator_http_task_put_op]
In this example we call a ``DELETE`` operation to the ``delete`` endpoint. This time we are passing form data to the
request.
.. exampleinclude:: /../../airflow/providers/http/example_dags/example_http.py
:language: python
:start-after: [START howto_operator_http_task_del_op]
:end-before: [END howto_operator_http_task_del_op]
Here we pass form data to a ``POST`` operation which is equal to a usual form submit.
.. exampleinclude:: /../../airflow/providers/http/example_dags/example_http.py
:language: python
:start-after: [START howto_operator_http_task_post_op_formenc]
:end-before: [END howto_operator_http_task_post_op_formenc]