为啥响应总是 "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-Type
text/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" 响应
为啥即使另一个活动在顶部,launchMode="singleTask" 的启动器活动总是被推到后台堆栈的顶部? [复制]