Swift alamofire请求得到text/html响应,而curl和postman得到json响应
================================= 注意:使用@Larme的技巧打印出请求的debugDescription,并与我的工作curl请求进行比较,我能够找出我犯下的愚蠢错误。1.在服务器请求处理程序中,当出现无法识别、非常混乱的内容时,我返回serializerError。2.我在swift的请求中犯了一个愚蠢的错误,将“GET_RECIPES”改为“GET_RECIPES” ================================ 我使用django rest框架实现了一个http服务,当我通过swift/alamofire发送请求时,它无法获得正确的json响应。但是,通过curl和postman发送的请求会得到正确的json响应。 所以我不知道问题出在哪里,django服务端还是swift请求端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
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
。