You need to enable JavaScript to run this app. Swift调用Django DELETE接口报Unsupported media type text/plain错误如何解决
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 03:54:03