Using HTTP in NoETL (Widget-based and Tasks)
Note: The new widget-based DSL lets you call HTTP directly from a step without defining a workbook task. Example:
- step: call_api
tool: http
method: GET
endpoint: "https://httpbin.org/get"
headers:
Authorization: "Bearer {{ env.API_TOKEN }}"
params:
id: "{{ workload.id }}"
as: response
next: end
The rest of this document describes HTTP as a workbook task (supported for backward compatibility).
Using HTTP Tasks with Headers in NoETL
This document explains how to use the HTTP task type with headers in NoETL to make API calls directly without using Python code.
Overview
The HTTP task type allows you to make HTTP requests directly from your workflow configuration. This is more declarative and often simpler than writing Python code to make the same requests.
Key benefits:
- More declarative approach
- Simpler configuration
- Better separation of concerns
- Easier to maintain and understand
HTTP Task Structure
A basic HTTP task has the following structure:
- name: my_http_task
type: http
method: GET # HTTP method (GET, POST, PUT, DELETE, PATCH)
endpoint: "https://api.example.com/endpoint" # API endpoint URL
headers: # HTTP headers
Content-Type: "application/json"
Authorization: "Bearer {{ api_key }}"
params: # Query parameters (for GET requests)
param1: "value1"
param2: "value2"
payload: # Request body (for POST, PUT, PATCH requests)
key1: "value1"
key2: "value2"
args: # Variables to use in the task
api_key: "{{ api_key }}"
return: | # Template to format the response
{% if status == 'success' %}
{
"status": "success",
"data": "{{ result.data }}"
}
{% else %}
{
"status": "error",
"message": "API Error: {{ result.error }}"
}
{% endif %}
Examples
1. Process Natural Language Task (OpenAI API)
This task sends a POST request to the OpenAI API to convert natural language to Amadeus SDK code:
- name: process_natural_language_task
type: http
method: POST
endpoint: "https://api.openai.com/v1/chat/completions"
headers:
Content-Type: "application/json"
Authorization: "Bearer {{ openai_api_key }}"
payload:
model: "gpt-4o"
messages:
- role: "system"
content: "Your system prompt here..."
- role: "user"
content: "{{ query }}"
args:
query: "{{ query }}"
openai_api_key: "{{ openai_api_key }}"
return: |
{% if status == 'success' %}
{
"status": "success",
"result": "{{ result.data.choices[0].message.content }}"
}
{% else %}
{
"status": "error",
"message": "OpenAI API Error: {{ result.error }}"
}
{% endif %}
2. Execute Amadeus Query Task (Amadeus API)
This task sends a GET request to the Amadeus API:
- name: execute_amadeus_query_task
type: http
method: GET
endpoint: "https://test.api.amadeus.com/v1/{{ endpoint_path }}"
headers:
Authorization: "Bearer {{ access_token }}"
Content-Type: "application/json"
params: "{{ query_params }}"
args:
endpoint_path: "{{ endpoint_path }}"
query_params: "{{ query_params }}"
access_token: "{{ access_token }}"
return: |
{% if status == 'success' %}
{
"status": "success",
"amadeus_response": "{{ result.data.data | tojson }}"
}
{% else %}
{
"status": "error",
"message": "Amadeus API Error: {{ result.error }}"
}
{% endif %}
Complete Workflow Example
See the complete_amadeus_workflow_example.yaml file for a complete example of how to use these HTTP tasks in a workflow.
The workflow demonstrates:
- Getting the current year
- Processing a natural language query to Amadeus SDK code
- Parsing the Amadeus SDK code to extract endpoint and parameters
- Getting an Amadeus API token
- Executing the Amadeus API query
- Processing the Amadeus response to natural language
Converting Python Tasks to HTTP Tasks
To convert a Python task that makes HTTP requests to an HTTP task:
- Identify the HTTP method, endpoint, headers, parameters, and payload in the Python code
- Create an HTTP task with these components
- Use the
withsection to pass variables to the task - Use the
returnsection to format the response
For example, this Python code:
import requests
def main(api_key, query):
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {api_key}"
}
payload = {
"model": "gpt-4o",
"messages": [
{"role": "user", "content": query}
]
}
response = requests.post("https://api.openai.com/v1/chat/completions", headers=headers, json=payload)
response_data = response.json()
return {
"status": "success",
"result": response_data["choices"][0]["message"]["content"]
}
Can be converted to this HTTP task:
- name: my_api_task
type: http
method: POST
endpoint: "https://api.openai.com/v1/chat/completions"
headers:
Content-Type: "application/json"
Authorization: "Bearer {{ api_key }}"
payload:
model: "gpt-4o"
messages:
- role: "user"
content: "{{ query }}"
args:
api_key: "{{ api_key }}"
query: "{{ query }}"
return: |
{% if status == 'success' %}
{
"status": "success",
"result": "{{ result.data.choices[0].message.content }}"
}
{% else %}
{
"status": "error",
"message": "API Error: {{ result.error }}"
}
{% endif %}
Conclusion
Using HTTP tasks with headers provides a more declarative and maintainable way to make API calls in your workflows. It separates the configuration from the implementation and makes it easier to understand and modify your workflows.