Splunk Dev

What is the correct way to POST data to a custom endpoint and handle it in a python script ?

twesthead
Path Finder

Dear Splunk genie,

I have configured a custom REST endpoint with a Python script.
When I call my endpoint with fields in the query string I am able to read them in my Python script.
However, if I try to use the POST method with data in the request body, I can't access this data in my Python script.

What is the correct way to POST data to a custom endpoint and handle it in a python script ?

This is my code so far :

Below : my_app/local/web.conf (Holds a stanza with the name of my endpoint)

[endpoint:my_script]

Below : my_app/appserver/controllers/my_script.py (Holds my script, with name matching the endpoint)

import splunk.appserver.mrsparkle.controllers as controllers
from splunk.appserver.mrsparkle.lib.decorators import expose_page

class Controller(controllers.BaseController):
    @expose_page(must_login=False) 
    def my_function(self, **kwargs) :
        arg1 = kwargs.get('arg1', 'default_val_arg1')
        arg2 = kwargs.get('arg2', 'default_val_arg2')
        return arg1 + arg2

Now using a REST client.
GET on the following url returns "onetwo", which is good.

http://localhost:8000/en-US/custom/my_app/my_script/my_function?arg1=one&arg2=two

POST on the following url returns "default_val_arg1default_val_arg2"
With Content-type : application/x-www-form-urlencoded
And Body : arg1=one&arg2=two

http://localhost:8000/en-US/custom/my_app/my_script/my_function
0 Karma
1 Solution

twesthead
Path Finder

I fixed this by specifying the HTTP POST method in the decorators.

@expose_page(must_login=False, methods=['POST']) 

If you don't, the method defaults to GET and doesn't read parameters from the body.
Also don't forget to specify a locale like en-US in the URL or else you will be slapped by a 405 Method Not Allowed error.

View solution in original post

0 Karma

twesthead
Path Finder

I fixed this by specifying the HTTP POST method in the decorators.

@expose_page(must_login=False, methods=['POST']) 

If you don't, the method defaults to GET and doesn't read parameters from the body.
Also don't forget to specify a locale like en-US in the URL or else you will be slapped by a 405 Method Not Allowed error.

0 Karma
Get Updates on the Splunk Community!

Introducing the 2024 SplunkTrust!

Hello, Splunk Community! We are beyond thrilled to announce our newest group of SplunkTrust members!  The ...

Introducing the 2024 Splunk MVPs!

We are excited to announce the 2024 cohort of the Splunk MVP program. Splunk MVPs are passionate members of ...

Splunk Custom Visualizations App End of Life

The Splunk Custom Visualizations apps End of Life for SimpleXML will reach end of support on Dec 21, 2024, ...