Получение пустого 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
Попытки решения
Проверенные заголовки и тип содержимого (
application/json
) в запросе.Попробовали разные форматы полезной нагрузки (строчный JSON и словари Python).
Обращались к официальной документации 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"})
- Пожалуйста, проверьте это Проблема с вызовом Python-сервисов в Dapr.