Swift alamofire请求得到text/html响应,而curl和postman得到json响应

Swift alamofire请求得到text/html响应,而curl和postman得到json响应,swift,django-rest-framework,alamofire,Swift,Django Rest Framework,Alamofire,================================= 注意:使用@Larme的技巧打印出请求的debugDescription,并与我的工作curl请求进行比较,我能够找出我犯下的愚蠢错误。1.在服务器请求处理程序中,当出现无法识别、非常混乱的内容时,我返回serializerError。2.我在swift的请求中犯了一个愚蠢的错误,将“GET_RECIPES”改为“GET_RECIPES” ================================ 我使用django re

=================================

注意:使用@Larme的技巧打印出请求的debugDescription,并与我的工作curl请求进行比较,我能够找出我犯下的愚蠢错误。1.在服务器请求处理程序中,当出现无法识别、非常混乱的内容时,我返回serializerError。2.我在swift的请求中犯了一个愚蠢的错误,将“GET_RECIPES”改为“GET_RECIPES”

================================

我使用django rest框架实现了一个http服务,当我通过swift/alamofire发送请求时,它无法获得正确的json响应。但是,通过curl和postman发送的请求会得到正确的json响应。 所以我不知道问题出在哪里,django服务端还是swift请求端

  • 我已经尝试在swift中使用.responseString而不是.responseJSON来打印response,但是数据仍然不在响应中,基本上,当请求到达服务器端时,错误就会发生
  • 从django服务器端,错误显示为“TypeError:类型为'property'的对象不可JSON序列化”。好的,看来问题来自django方面
  • 但是从curl和postman那里,我可以毫无问题地得到json响应,响应头包含“Content-Type”:“application/json”,对于django端,一切都还可以。那么这是否意味着django服务器可以处理json响应,而这应该是swift请求的问题呢
  • 用swift编码

    let parameters: [String: Any] = [
        "type": "GET_RECIPE",
        "details": ["ingredients" : ["egg", "bread"]]
    ]
    let headers = ["Content-Type": "application/json"]
    Alamofire.request(url, mothod: .post, parameters: parameters, 
                      headers: headers, encoding: JSONEncoding.default)
                    .responseJSON {response in
                    if let data = response.result.value {
                        print(data)
                    }
    }
    
    请求处理程序的代码

    class RecipeSerializer(serializers.ModelSerializer):
    类元:
    模型=配方
    字段=('id','url','author','category','title','description',
    ‘说明’、‘提示’、‘原始’、‘分数’)
    def获取配方给定配料(数据):
    logger.info('Get recipes for{}'。格式(data.Get('details'))
    details=data.get('details')
    配料=详细信息。获取(‘配料’)
    info('GET_RECIPE for配料{}'。格式(配料))
    菜谱=查询。获取菜谱建议给定的配料(配料)
    序列化器=配方序列化器(配方,多个=真)
    返回响应(serializer.data)
    
    从服务器端跟踪堆栈:

    Internal Server Error: /get-recipes/
    Traceback (most recent call last):
      File "C:\Users\Yuanjun\Anaconda2\envs\online_bid\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
        response = get_response(request)
      File "C:\Users\Yuanjun\Anaconda2\envs\online_bid\lib\site-packages\django\core\handlers\base.py", line 145, in _get_response
        response = self.process_exception_by_middleware(e, request)
      File "C:\Users\Yuanjun\Anaconda2\envs\online_bid\lib\site-packages\django\core\handlers\base.py", line 143, in _get_response
        response = response.render()
      File "C:\Users\Yuanjun\Anaconda2\envs\online_bid\lib\site-packages\django\template\response.py", line 106, in render
        self.content = self.rendered_content
      File "C:\Users\Yuanjun\Anaconda2\envs\online_bid\lib\site-packages\rest_framework\response.py", line 72, in rendered_content
        ret = renderer.render(self.data, accepted_media_type, context)
      File "C:\Users\Yuanjun\Anaconda2\envs\online_bid\lib\site-packages\rest_framework\renderers.py", line 733, in render
        context = self.get_context(data, accepted_media_type, renderer_context)
      File "C:\Users\Yuanjun\Anaconda2\envs\online_bid\lib\site-packages\rest_framework\renderers.py", line 688, in get_context
        'content': self.get_content(renderer, data, accepted_media_type, renderer_context),
      File "C:\Users\Yuanjun\Anaconda2\envs\online_bid\lib\site-packages\rest_framework\renderers.py", line 424, in get_content
        content = renderer.render(data, accepted_media_type, renderer_context)
      File "C:\Users\Yuanjun\Anaconda2\envs\online_bid\lib\site-packages\rest_framework\renderers.py", line 107, in render
        allow_nan=not self.strict, separators=separators
      File "C:\Users\Yuanjun\Anaconda2\envs\online_bid\lib\site-packages\rest_framework\utils\json.py", line 28, in dumps
        return json.dumps(*args, **kwargs)
      File "C:\Users\Yuanjun\Anaconda2\envs\online_bid\lib\json\__init__.py", line 238, in dumps
        **kw).encode(obj)
      File "C:\Users\Yuanjun\Anaconda2\envs\online_bid\lib\json\encoder.py", line 201, in encode
        chunks = list(chunks)
      File "C:\Users\Yuanjun\Anaconda2\envs\online_bid\lib\json\encoder.py", line 437, in _iterencode
        o = _default(o)
      File "C:\Users\Yuanjun\Anaconda2\envs\online_bid\lib\site-packages\rest_framework\utils\encoders.py", line 68, in default
        return super(JSONEncoder, self).default(obj)
      File "C:\Users\Yuanjun\Anaconda2\envs\online_bid\lib\json\encoder.py", line 180, in default
        o.__class__.__name__)
    TypeError: Object of type 'property' is not JSON serializable
    [14/May/2019 08:29:32] "POST /get-recipes/ HTTP/1.1" 500 124585
    
    

    我认为你的问题是你试图发送一个帖子给get请求

    尝试按以下方式更改您的alamofire请求:

    let parameters: [String: Any] = [
        "type": "GET_RECIPE",
        "details": ["ingredients" : ["egg", "bread"]]
    ]
    let headers = ["Content-Type": "application/json"]
    Alamofire.request(url, mothod: .get, parameters: parameters, 
                      headers: headers, encoding: JSONEncoding.default)
                    .responseJSON {response in
                    if let data = response.result.value {
                        print(data)
                    }
    }
    

    可能是服务器在处理您的请求时崩溃,或者找不到给定的URL(因为后面有斜杠)。 如果服务器在
    DEBUG
    模式下运行时崩溃,通常会返回
    text/html
    。这就是它如何通过堆栈跟踪以一种漂亮的方式显示崩溃原因


    很难说出你的情况。如果您提供了错误的堆栈跟踪,那就太好了。

    我以前见过这种情况,它取决于url上是否有尾随斜杠。这将是一个快速测试,看看这是否能解决您的问题。@Don谢谢您的建议。我在url上有尾随的斜杠。删除尾部斜杠确实会在http响应中引发500个代码,但它是另一个,django端出现运行时错误。对不起,我帮不了你什么忙。我的后端开发人员从未解释过它的重要性。希望有人会来,谁知道呢。你能给我看一下邮递员要求的细节吗?你有卷发吗?然后,不要执行
    Alamofire.request(…).responseJSON{…}
    ,而是执行
    let request=Alamofire.request(…);打印(请求.调试说明);request.responseJSON{…}
    ,比较输出。我在那里()解释了技巧,我实现了django post处理程序,尽管我承认端点的名称有点误导。我可以通过curl或postman使用post请求获得响应。没错,服务器正在调试模式下运行。这不是因为后面的斜杠。我编辑原始问题,从服务器端发布跟踪堆栈
    TypeError:type'property'的对象不是JSON可序列化的
    会显示出来,但是当使用curl或postman发送相同的post请求时,它可以正常工作。这让我很困惑。@YuanjunZhou似乎这个语句返回了错误和意外的数据
    recipes=querys.get\u recipe\u recommendance\u given\u配料(配料)
    。你能知道结果吗?另外,我建议使用
    rest\u框架
    中基于类的视图,如
    APIView