Python3でリクエストパラメータ付のPOST通信をしたときに、リクエストパラメータが抜け落ちる

tkfric.hatenablog.com

この記事でやったことの続き

def http_post(url, headers, body):
    req = urllib.request.Request(url, json.dumps(body).encode(), headers, 'POST')
    try:
        with urllib.request.urlopen(req) as res:
            body = res.read().decode()

でbodyの中身が

{
    'id' : 1
}

という形だったのだが、

POST先のAPIから「idは必須です」というメッセージが返ってきた。

かなりはまって、かなり検索しまくって、

結果的にどの記事を見たかは覚えてないが、

(たしかStackoverflowだった)

以下のように書き直したら動いた

def http_post(url, headers, body):
    data = urllib.parse.urlencode(body).encode('utf-8')
    request = urllib.request.Request(url, data, headers)
    
    try:
        with urllib.request.urlopen(url=url, data=data) as response:
            body = response.read().decode("utf-8")

リクエストパラメータの処理の仕方を json.dumps(body).encode() から urllib.parse.urlencode(body).encode('utf-8') に書き換えた。

これでタイトルの問題は解決したのだが、非常に謎。