Получение пустого request.data при вызове службы Python с помощью Dapr: плохой синтаксис запроса (400)

Я столкнулся с проблемой при вызове службы Python с помощью Dapr. Вызов постоянно приводит к следующей ошибке:

код 400, сообщение Плохой синтаксис запроса ('4')

Проведя расследование, я обнаружил, что ошибка может быть связана с неполной или отсутствующей информацией о заказе. Однако, несмотря на применение примера кода, приведенного в документации Dapr, и внесение нескольких изменений, проблема сохраняется.

Замеченная проблема

При вызове службы request.data на принимающей стороне всегда пусто.
В качестве временного обходного пути я направил запрос через шлюз, и это сработало. Однако это не является надежным решением в долгосрочной перспективе.

Детали окружения

  • Dapr SDK version: 1.12.1 (Python)

  • Dapr runtime version: 1.12.5

  • Платформа развертывания: Контейнеры Azure

  • Метод вызова: Service-to-service using Dapr HTTP API

Попытки решения

  1. Проверенные заголовки и тип содержимого (application/json) в запросе.

  2. Попробовали разные форматы полезной нагрузки (строчный JSON и словари Python).

  3. Обращались к официальной документации Dapr и коду примеров.

Вопрос

  • Что может быть причиной того, что request.data пуст на принимающей стороне?

  • Есть ли конкретная конфигурация или шаг, который я могу пропустить для вызова сервиса на сервис с использованием Dapr в этой среде?

Дополнительная информация

Я перепробовал множество решений:

  • Изменение кода.

  • Использование прямой информации вместо библиотеки Dapr.

  • Модификация метода получения данных.

Несмотря на все эти попытки, запрос приходит, но без каких-либо данных в request.data.

Спасибо за любые идеи и рекомендации, которые вы можете предоставить!

вот мой код :

from dapr.clients import DaprClient
import json

with DaprClient() as d:
    if method.lower() == "get":
        response = d.invoke_method(
            appid="filemanagement",
            path="api/file_management/test_update",
            data='{"message":"Hello World"}',
            metadata=None,
            content_type="application/json",
        )
    else:
        response = d.invoke_method(
            appid="filemanagement",
            path="api/file_management/test_update",
            data=json.dumps(payload),
            metadata=None,
            http_verb="post"
        )
from rest_framework.views import APIView
from rest_framework.parsers import JSONParser
from rest_framework.response import Response

class Test1(APIView):
    parser_classes = [JSONParser]

    def post(self, request, *args, **kwargs):
        print("Received data:", request.data)
        return Response({"status": "success"})

При вызове DaprClient.invoke_method необходимо установить content_type как для GET, так и для POST запросов.

Установите content_type в обоих случаях:

from dapr.clients import DaprClient
import json

with DaprClient() as d:
    if method.lower() == "get":
        response = d.invoke_method(
            appid="filemanagement",
            path="api/file_management/test_update",
            data='{"message":"Hello World"}',
            metadata=None,
            content_type="application/json",  # Ensure it's set
        )
    else:
        response = d.invoke_method(
            appid="filemanagement",
            path="api/file_management/test_update",
            data=json.dumps(payload),
            metadata=None,
            content_type="application/json",  # Add this here
            http_verb="post"
        )
  • Dapr по умолчанию может отправлять запросы в виде application/octet-stream, что может быть неправильно разобрано JSONParser в Django.

Разрешить парсинг сырых данных в Django:

from rest_framework.views import APIView
from rest_framework.parsers import JSONParser, MultiPartParser, FormParser
from rest_framework.response import Response

class Test1(APIView):
    parser_classes = [JSONParser, MultiPartParser, FormParser]

    def post(self, request, *args, **kwargs):
        print("Received data:", request.data)
        return Response({"status": "success"})
Вернуться на верх