Swift调用Django DELETE接口报Unsupported media type text/plain错误如何解决
问题成因
- 请求头
Content-Type不匹配:Swift代码中发送的是x-www-form-urlencoded格式的表单参数id=15,但未显式声明对应Content-Type,URLRequest默认会为纯文本类请求体自动设置Content-Type: text/plain,Django REST Framework默认解析器不支持该媒体类型,因此抛出报错。 - 后端参数取值方式不兼容
DELETE请求:Django原生的request.POST仅对POST请求的表单数据生效,即便前端修改了Content-Type,DELETE请求的参数也无法通过request.POST正常获取,会触发后续的取值报错。
解决方案
前端Swift代码修改
这里提供两种可选修改方案,选其中一种即可:
方案1:保留表单传参格式,补充请求头声明
func deleteQuestion(id: Int){ guard let url = URL(string: "http://127.0.0.1:8000/V1/API/questions/") else { return } var request = URLRequest(url: url) // 声明请求体为表单格式 request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") let postString = "id=\(id)" request.httpBody = postString.data(using: String.Encoding.utf8) request.httpMethod = "DELETE" URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data, error == nil else { return } let str = String(decoding: data, as: UTF8.self) print(str) self.fetcOrganizatinData() }.resume() }
方案2:改用更通用的JSON格式传参
func deleteQuestion(id: Int){ guard let url = URL(string: "http://127.0.0.1:8000/V1/API/questions/") else { return } var request = URLRequest(url: url) // 声明请求体为JSON格式 request.setValue("application/json", forHTTPHeaderField: "Content-Type") // 构造JSON参数 let params = ["id": id] request.httpBody = try? JSONSerialization.data(withJSONObject: params) request.httpMethod = "DELETE" URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data, error == nil else { return } let str = String(decoding: data, as: UTF8.self) print(str) self.fetcOrganizatinData() }.resume() }
后端Django代码适配
将参数取值方式改为DRF封装的request.data,它支持所有请求方法、所有常见媒体类型的参数解析,适配性更强:
class Questions(APIView): def delete(self,request): received_id = request.data["id"] print(received_id) place = Question.objects.get(pk=received_id) place.delete() questions = Question.objects.all() seriliazer = QuestionSerializer(questions,many = True) return Response({'Orgs': seriliazer.data})
内容的提问来源于stack exchange,提问作者Dipesh Pokhrel
相关产品推荐
相关产品推荐

