我应该使用 GET 还是 POST 来请求 DRF 中的正文?

问题描述 投票:0回答:1

我对网络开发相对较新,我正在为网络应用程序编写后端,用于在我们学校练习化学元素和化合物及其公式。我正在使用 Django 和 Django Rest Framework。我遇到了一个困境,无法决定是使用 GET 方法还是 POST 方法。在前端,它根据特定条件从服务器请求化合物和元素。在此视图中,它接收带有正文(标准)的请求,其中值是requested_count、used_ids(以排除已使用的化合物/元素)、requested_groups、requested_elements(以排除学生可能不知道的元素)。每个值(计数除外)可能是一个包含数百个项目的列表。然后,它过滤数据库以返回响应。我已经测试过很多次并且它工作正常。我唯一的问题是,在此视图中使用哪种方法。我知道当我想更改数据库中的某些内容时应该使用 POST ,而应该使用 GET 来从数据库中获取查询。据此我应该使用 GET 。但我想发送带有该请求的正文,这就是 POST 通常所做的事情。你有什么建议?谢谢

查看代码如下:

class RequestCompoundsView(views.APIView):
serializer_class = RequestCompoundsSerializer

def get(self, request):
    serializer = self.serializer_class(data=request.data)

    if serializer.is_valid():
        # Get the request data from serializer
        requested_count = serializer.validated_data.get("count", 10)
        used_ids = serializer.validated_data.get("used_ids", [])
        requested_groups = serializer.validated_data.get("groups", [])
        requested_elements = serializer.validated_data.get("elements", [])

        # Find the elements and groups objects
        groups, elements = find_requested_groups_elements(
            requested_groups, requested_elements
        )

        # Check if the group and element names are correct
        if groups.count() == 0:
            context = {"error": "invalid group name"}
            return Response(context, status=status.HTTP_400_BAD_REQUEST)

        if elements.count() == 0:
            context = {"error": "invalid element name"}
            return Response(context, status=status.HTTP_400_BAD_REQUEST)

        # Make a query and filter it out the database
        query = ~Q(id__in=used_ids) & Q(group__in=groups) & Q(elements__in=elements)
        samples = (
            Compound.objects.filter(query)
            .order_by("?")[:requested_count]
            .select_related("group")
        )
        count = Compound.objects.filter(query).count()

        # Check if the wanted conditions are correct
        if count == 0:
            context = {"error": "query returned no results"}
            return Response(context, status=status.HTTP_204_NO_CONTENT)

        # Return the results
        serializer = SendCompoundsSerializer(samples, many=True)
        context = {"data": serializer.data, "count": count}
        return Response(context, status=status.HTTP_200_OK)

    # If there is a problem, return bad request
    else:
        print(serializer.errors)
        context = {"error": "invalid request data"}
        return Response(context, status=status.HTTP_400_BAD_REQUEST)

这是序列化器:

# Serializer for the incomming requests
class RequestCompoundsSerializer(serializers.Serializer):
    used_ids = serializers.ListField(child=serializers.IntegerField())
    groups = serializers.ListField(child=serializers.CharField())
    elements = serializers.ListField(child=serializers.CharField())
    count = serializers.IntegerField(max_value=100, min_value=1)

    class Meta:
        fields = ("used_ids", "groups", "elements", "count")


# Response of the server for the frontend
class SendCompoundsSerializer(serializers.ModelSerializer):

    class Meta:
        model = Compound
        fields = ("id", "formula", "name")
python django django-rest-framework django-views http-method
1个回答
0
投票

获取

get方法用于从服务器获取。例如,元素列表(通常也是列表)可以通过某种标准进行过滤,GET 方法就足够了,只需将参数传递给查询参数即可,例如像这样

example.com/elements?category=random

query-params 还可以用于排序和分页。

发帖

当您需要在表单请求正文中向服务器发送某些数据(如果您使用 django 模板)、在数据库中创建记录等时,最常使用 post 方法。

因此,为了自己决定向服务器发送什么请求,只需问自己一个问题“客户端现在可以做什么?” - 如果您接收一个列表/一个元素,那么您需要发送GET,如果客户端需要发送服务器上的某些内容,则需要POST。

最后,有这样一个规则,如果你不知道要发送什么请求,当你有疑问时,那么你需要发送一个 POST 请求,例如注销的情况。

© www.soinside.com 2019 - 2024. All rights reserved.