# FastAPI POST endpoint returning "Field required" when sending dictionary from Jython

**URL:** <https://forum.inductiveautomation.com/t/fastapi-post-endpoint-returning-field-required-when-sending-dictionary-from-jython/111141>\
**Category:** Ignition\
**Tags:** scripting\
**Created:** [October 1, 2025, 6:04pm UTC](https://forum.inductiveautomation.com/t/fastapi-post-endpoint-returning-field-required-when-sending-dictionary-from-jython/111141 "2025-10-01T18:04:58Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![galeman](https://avatars.discourse-cdn.com/v4/letter/g/eb9ed0/32.png) [@galeman](https://forum.inductiveautomation.com/u/galeman)\
**Post date:** [October 1, 2025, 6:04pm UTC](https://forum.inductiveautomation.com/t/fastapi-post-endpoint-returning-field-required-when-sending-dictionary-from-jython/111141/1 "2025-10-01T18:04:58Z")

</div>

Hi everyone,

* * *

I'm trying to use a POST method:

```python
h = {"accept": "application/json", "Content-Type": "application/json"}

client = system.net.httpClient()
response = client.post(url, data=data, headers=h)
response.json

```

`data` is a dictionary.

I get this error:

```python
{'detail': [{'msg': 'Field required', 'loc': ['body'], 'type': 'missing', 'input': None}]}

```

For context, I’m using FastAPI for my API.

The endpoint is defined like this:

```python
@app.post("/item")
def update_item(new_item: Item):
    ... 

```

And the `Item` model looks like this:

```python
class Item(BaseModel):
    t_stamp: str
    temp_1: float
    hum_1: float
    temp_2: float
    hum_2: float
    temp_3: float
    hum_3: float
    temp_4: float
    hum_4: float
    temp_5: float
    hum_5: float
    temp_6: float
    hum_6: float

```

* * *

The perplexing part is that if I use `httpPost` instead, it works fine:

```python
import json

# Convert dictionary to JSON string
json_string = json.dumps(data)

# Use httpPost directly
response = system.net.httpPost(url, contentType="application/json", postData=json_string)

```

Thanks in advance for any help or advice

---

<div class="post-metadata">

**Author:** ![Leor\_Fishman](https://avatars.discourse-cdn.com/v4/letter/l/e19adc/32.png) [@Leor\_Fishman](https://forum.inductiveautomation.com/u/Leor_Fishman)\
**Post date:** [October 1, 2025, 6:31pm UTC](https://forum.inductiveautomation.com/t/fastapi-post-endpoint-returning-field-required-when-sending-dictionary-from-jython/111141/2 "2025-10-01T18:31:27Z")

</div>

what happens if you try passing in json.dumps(data) to httpClient?

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [October 1, 2025, 6:55pm UTC](https://forum.inductiveautomation.com/t/fastapi-post-endpoint-returning-field-required-when-sending-dictionary-from-jython/111141/3 "2025-10-01T18:55:28Z")

</div>

Can you share the actual dictionary you're sending?

What if you send your data to a testing tool like that echoes what you requested back to you?  
I like [http://httpbin.org/](http://httpbin.org/), though it appears to be down at the moment. It's self hostable via Docker: [https://hub.docker.com/r/kennethreitz/httpbin/](https://hub.docker.com/r/kennethreitz/httpbin/)

---

<div class="post-metadata">

**Author:** ![kaushik.shah](https://avatars.discourse-cdn.com/v4/letter/k/34f0e0/32.png) [@kaushik.shah](https://forum.inductiveautomation.com/u/kaushik.shah)\
**Post date:** [November 14, 2025, 3:14pm UTC](https://forum.inductiveautomation.com/t/fastapi-post-endpoint-returning-field-required-when-sending-dictionary-from-jython/111141/4 "2025-11-14T15:14:43Z")

</div>

Having same issue with put -

```python
client = system.net.httpClient()
response = client.put(url, params = {'record_id':1} data={"ValueToUpdate":1.00}, headers=h)
response.json

```

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [November 14, 2025, 3:21pm UTC](https://forum.inductiveautomation.com/t/fastapi-post-endpoint-returning-field-required-when-sending-dictionary-from-jython/111141/5 "2025-11-14T15:21:15Z")

</div>

Why would you expect PUT to have a response body at all?

---

<div class="post-metadata">

**Author:** ![kaushik.shah](https://avatars.discourse-cdn.com/v4/letter/k/34f0e0/32.png) [@kaushik.shah](https://forum.inductiveautomation.com/u/kaushik.shah)\
**Post date:** [November 14, 2025, 3:25pm UTC](https://forum.inductiveautomation.com/t/fastapi-post-endpoint-returning-field-required-when-sending-dictionary-from-jython/111141/6 "2025-11-14T15:25:13Z")

</div>

to see if the put was successful or was there any error.

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [November 14, 2025, 3:27pm UTC](https://forum.inductiveautomation.com/t/fastapi-post-endpoint-returning-field-required-when-sending-dictionary-from-jython/111141/7 "2025-11-14T15:27:24Z")

</div>

> [@kaushik.shah](#):
>
> `params = {'record_id':1} data={"ValueToUpdate":1.00},`

This code snippet doesn't have a comma between your two parameters.

---

<div class="post-metadata">

**Author:** ![kaushik.shah](https://avatars.discourse-cdn.com/v4/letter/k/34f0e0/32.png) [@kaushik.shah](https://forum.inductiveautomation.com/u/kaushik.shah)\
**Post date:** [November 14, 2025, 3:33pm UTC](https://forum.inductiveautomation.com/t/fastapi-post-endpoint-returning-field-required-when-sending-dictionary-from-jython/111141/8 "2025-11-14T15:33:03Z")

</div>

yes,

here is my function :

```python
def clientPut( path = '', id = None, payload = {}):
	if id is None:
		return
	headers = {
        "Content-Type": "application/json",
       "accept": "application/json"
        }
        
	client = system.net.httpClient()
	value = client.put(path, params = {'record_id':id}, data = payload, headers=headers)
	print value.request.headers
	print value.json		
	return value.json

```

Here is the call:

```python
clientPut(path = URL, id=411, payload = {"maximum":1.57})

```

this is what it prints when I use script console in designer:

```python
{u'accept': [application/json], u'Content-Type': [application/json], u'User-Agent': [Ignition]}
{'detail': [{'msg': u'Field required', 'loc': [u'body'], 'type': u'missing', 'input': None}]}
{'detail': [{'msg': u'Field required', 'loc': [u'body'], 'type': u'missing', 'input': None}]}

```

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [November 14, 2025, 3:39pm UTC](https://forum.inductiveautomation.com/t/fastapi-post-endpoint-returning-field-required-when-sending-dictionary-from-jython/111141/9 "2025-11-14T15:39:56Z")

</div>

Seems like a server problem to me; it works fine against an echo server:

```python
from pprint import pprint

URL = "https://httpbingo.org/put"

def clientPut( path = '', id = None, payload = {}):
	if id is None:
		return
	headers = {
        "Content-Type": "application/json",
       "accept": "application/json"
        }
        
	client = system.net.httpClient()
	value = client.put(URL, params = {'record_id':id}, data = payload, headers=headers)
	print value.request.headers
	return value.json
	
pprint(clientPut(path = URL, id=411, payload = {"maximum":1.57}))

```

```python
>>>
{u'accept': [application/json], u'Content-Type': [application/json], u'User-Agent': [Ignition]}
{'args': {'record_id': [u'411']},
 'data': u'{"maximum":1.57}',
 'files': {},
 'form': {},
 'headers': {'Accept': [u'application/json'],
             'Content-Length': [u'16'],
             'Content-Type': [u'application/json'],
             'Host': [u'httpbingo.org'],
             'User-Agent': [u'Ignition'],
             'Via': [u'2 fly.io'],
             'X-Forwarded-For': [u'207.173.137.144, 66.241.125.232'],
             'X-Forwarded-Port': [u'443'],
             'X-Forwarded-Proto': [u'https'],
             'X-Forwarded-Ssl': [u'on'],
             'X-Request-Start': [u't=1763134710144631']},
 'json': {'maximum': 1.57},
 'method': u'PUT',
 'origin': u'207.173.137.144',
 'url': u'https://httpbingo.org/put?record_id=411'}

```

---

<div class="post-metadata">

**Author:** ![kaushik.shah](https://avatars.discourse-cdn.com/v4/letter/k/34f0e0/32.png) [@kaushik.shah](https://forum.inductiveautomation.com/u/kaushik.shah)\
**Post date:** [November 14, 2025, 3:46pm UTC](https://forum.inductiveautomation.com/t/fastapi-post-endpoint-returning-field-required-when-sending-dictionary-from-jython/111141/10 "2025-11-14T15:46:53Z")

</div>

I messaged the full trace.

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [November 14, 2025, 4:22pm UTC](https://forum.inductiveautomation.com/t/fastapi-post-endpoint-returning-field-required-when-sending-dictionary-from-jython/111141/11 "2025-11-14T16:22:58Z")

</div>

Try this, because some servers are bad at negotiating HTTP\_2 downgrades.

Make this call:  
`client = system.net.httpClient()`

Into:  
`client = system.net.httpClient(version="HTTP_1_1")`

---

<div class="post-metadata">

**Author:** ![kaushik.shah](https://avatars.discourse-cdn.com/v4/letter/k/34f0e0/32.png) [@kaushik.shah](https://forum.inductiveautomation.com/u/kaushik.shah)\
**Post date:** [November 14, 2025, 4:24pm UTC](https://forum.inductiveautomation.com/t/fastapi-post-endpoint-returning-field-required-when-sending-dictionary-from-jython/111141/12 "2025-11-14T16:24:26Z")

</div>

that did indeed work
