为啥响应总是 "detail":"Unsupported media type \"text/plain\" in request." 在

Posted

技术标签:

【中文标题】为啥响应总是 "detail":"Unsupported media type \\"text/plain\\" in request." 在 swift 中?【英文标题】:Why response is always "detail":"Unsupported media type \"text/plain\" in request." in swift?为什么响应总是 "detail":"Unsupported media type \"text/plain\" in request." 在 swift 中? 【发布时间】:2021-10-05 18:36:05 【问题描述】:

我在 Django 中创建了一个示例应用程序,它从 App 中删除了一个问题。并在使用 POSTMAN 使用时提供正确的输出。

class Questions(APIView):
  def delete(self,request):
        received_id = request.POST["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)

但是,当我尝试从 ios 应用程序中实现它时,它返回 "detail":"Unsupported media type "text/plain" in request."

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)
    let postString = "id=15"
    request.httpBody = postString.data(using: String.Encoding.utf8);
    request.httpMethod = "DELETE"
    URLSession.shared.dataTask(with: request)  data, response, error in
        let str = String(decoding: data!, as: UTF8.self)
        print(str)
        if error == nil 
            self.fetcOrganizatinData()
        
    .resume()

无法真正理解问题到底出在哪里?

【问题讨论】:

缺少 Content-Type 标头? request.setValue("charset=utf-8", forHTTPHeaderField: "Content-Type") 我添加了这个,但它仍然显示 "detail":"Unsupported media type \"charset=utf- 8\" 在请求中。" 状态码:415,我真的不明白它在服务器端的期望是什么 如果它与 POSTMAN 一起工作,你能要求 POSTMAN 生成 cURL 代码吗?还是 Swift 代码?另外,你是一个“DELETE”,但在代码中我看到一个“POST”? 通常删除是对特定端点资源的命令。如果没有 httpBody,以下工作是否有效? URL(string: "https://127.0.0.1:8000/V1/API/questions/\(id)") 【参考方案1】:

如果 api 需要 Json,那么您发送的正文不是 Json,它是编码的纯文本。如果它应该是 Json,您可以将正文字符串更改为 Json 格式,如:

“\”id\”:15”
// you may want to tell it what you’re sending
request.setValue("application/json", forHTTPHeaderField: "Accept-Encoding")

另一件事可能是请求缺少 Accept-Encoding 标头,该标头告诉 api 您要发送的内容,而 Content-Type 是 api 通常发送的内容。

当我通过并不总是正确的特定网关发送请求时,我经历过标头注入。我希望标题不存在,一路上可以尝试帮助您并添加标题。这给我带来了过去的问题。我仍然不知道它发生在我们堆栈中的确切位置,但添加标题解决了我的问题。

你可以像这样添加标题:

request.setValue("charset=utf-8", forHTTPHeaderField: "Accept-Encoding")

【讨论】:

我假设您正在考虑 request.setValue("charset=utf-8", forHTTPHeaderField: "Accept-Encoding") ,但没有产生结果 我明白问题出在代码 received_id = self.request.GET["id"],,现在我想知道如何在 DELETE 方法 @Jake 上解析正文 试试这个答案。 ***.com/a/29781023/9333764我不熟悉DJango,我熟悉swift 您可能会忽略该答案的 body["content"] 部分【参考方案2】:

DELETE 请求的正文将被忽略,我可以从 Is an entity body allowed for an HTTP DELETE request? 帖子中猜到。因此最好发送完整的 URL 或标题本身,

所以我做了如下功能

def delete(self,request):
        received_id = request.headers['id']
        place = Question.objects.get(pk=received_id)
        place.delete()
        return HttpResponse("DELETE view is working fine ")

迅速

 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)
        //let postString = "id=\(id)"
       // request.httpBody =  postString.data(using: String.Encoding.utf8);
        request.httpMethod = "DELETE"
        request.setValue("charset=utf-8", forHTTPHeaderField: "Accept-Encoding")
        request.setValue("charset=utf-8", forHTTPHeaderField: "Content-Type")
        request.setValue("\(id)", forHTTPHeaderField: "id")
        URLSession.shared.dataTask(with: request)  data, response, error in
            let str = String(decoding: data!, as: UTF8.self)
            print(str)
            if error == nil 
                self.fetcOrganizatinData()
            
        .resume()
    

【讨论】:

【参考方案3】:

在您的标题中添加Content-Type application/json 原因 发生这种情况是因为邮递员有一些默认标题,通常是 8。 其中之一是 Content-Typetext/plain 通过写"Content-Type": "application/json",我们可以覆盖该规则。 因此,每当您想像 JSON 一样传递数据时,都可以这样做。 了解更多 postman 的默认设置 我建议您阅读此official documentation of postman。 它发生在我身上,我通过覆盖默认 Content-Type

解决了这个问题

【讨论】:

以上是关于为啥响应总是 "detail":"Unsupported media type \"text/plain\" in request." 在 的主要内容,如果未能解决你的问题,请参考以下文章

为啥不总是使用 android:configChanges="keyboardHidden|orientation"?

为啥 Qt 样式表 "Foo:hover * " 总是适用?

OAuth2:Discord API 总是以 "error": "invalid_grant" 响应

为啥我的jsp 中radio得到的总是第一个

asp编程问题--为啥注册会员时总是说帐号重复

为啥即使另一个活动在顶部,launchMode="singleTask" 的启动器活动总是被推到后台堆栈的顶部? [复制]