- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
在使用 JSON 发布到 OData 服务时,我收到“错误 415:不支持的媒体类型”。
解决方案在这篇相当长的帖子底部。
我可以使用 JSON 获取,但一旦我尝试发布,我就会收到此错误。
我也可以使用 XML GET/POST,但是我需要使用 json。
我认为这个错误是指我的 header 中有问题,而不是我的请求正文的 json 格式,下面也可能不正确,我尝试了多种变体导致相同的错误。
我一直在尝试使用 Fiddler 进行调试,结果如下。
JSON POST
请求
POST http://scdb38:8888/bi.test/applicationdata.svc/Sharks HTTP/1.1
User-Agent: Fiddler
Host: scdb38:8888
Content-Length: 91
Accept: application/json;odata=verbose;
Content-Type: application/json;
{
"d":[
{
"Name":"Great White ",
"Food":"Surfers"
}
]
}
回应
HTTP/1.1 415 Unsupported Media Type
Cache-Control: private
Content-Length: 186
Content-Type: application/json;odata=verbose;charset=utf-8
Server: Microsoft-IIS/7.5
X-Content-Type-Options: nosniff
DataServiceVersion: 1.0;
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 16 Oct 2013 06:20:10 GMT
{"error":{"code":"1","message":{"lang":"en-AU","value":"<?xml version=\"1.0\" encoding=\"utf-16\"?><ExceptionInfo><Message>Unsupported media type requested.</Message></ExceptionInfo>"}}}
JSON 获取
请求 header
GET http://scdb38:8888/bi.test/applicationdata.svc/Sharks HTTP/1.1
User-Agent: Fiddler
Host: scdb38:8888
Content-Length: 0
Accept: application/json;odata=verbose;
Content-Type: application/json;
响应头
HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Length: 591
Content-Type: application/json;odata=verbose;charset=utf-8
Server: Microsoft-IIS/7.5
X-Content-Type-Options: nosniff
DataServiceVersion: 1.0;
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 16 Oct 2013 06:23:41 GMT
{"d":[{"__metadata":{"id":"http://scdb38:8888/BI.Test/ApplicationData.svc/Sharks(1)","uri":"http://scdb38:8888/BI.Test/ApplicationData.svc/Sharks(1)","etag":"W/\"X'00000000000007E4'\"","type":"LightSwitchApplication.Shark"},"Id":1,"RowVersion":"AAAAAAAAB+Q=","Name":"Tiger Shark","Food":"Penguins"},{"__metadata":{"id":"http://scdb38:8888/BI.Test/ApplicationData.svc/Sharks(2)","uri":"http://scdb38:8888/BI.Test/ApplicationData.svc/Sharks(2)","etag":"W/\"X'00000000000007E5'\"","type":"LightSwitchApplication.Shark"},"Id":2,"RowVersion":"AAAAAAAAB+U=","Name":"Grey Nurse","Food":"Lettuce"}]}
我不明白为什么当 GET 工作正常时,POST 不支持媒体类型。我意识到我正在使用 DataServiceVersion: 1.0 并已查找升级,但我正在使用 LightSwitch 2012 并且在引用较新版本时遇到问题而不会破坏 LightSwitch 应用程序。我认为 LightSwitch 2013 使用较新的版本(?)但是升级对我来说会带来新的(非技术)挑战。我觉得我在四处走动,这是我最后的手段,在与同事交谈后,我唯一失败的选择是在数据库上创建数据模型并在此基础上创建 OData 服务。
---- 更新 ----
我已经尝试了 Jen S 提供的两个修复程序,现在得到错误:400 错误请求。
使用 odata=verbose
POST http://scdb38:8888/bi.test/applicationdata.svc/Sharks HTTP/1.1
Accept: application/json;odata=verbose;
Content-Type: application/json;odata=verbose;
Content-Length: 98
Host: scdb38:8888
{
"d":[
{
"Name":"Great White ",
"Food":"Surfers"
}
]
}
HTTP/1.1 400 Bad Request
Cache-Control: private
Content-Length: 201
Content-Type: application/json;odata=verbose;charset=utf-8
Server: Microsoft-IIS/7.5
X-Content-Type-Options: nosniff
DataServiceVersion: 1.0;
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 16 Oct 2013 23:31:09 GMT
{"error":{"code":"1","message":{"lang":"en-AU","value":"<?xml version=\"1.0\" encoding=\"utf-16\"?><ExceptionInfo><Message>An error occurred while processing this request.</Message></ExceptionInfo>"}}}
使用 DataServiceVersion:1.0
POST http://scdb38:8888/bi.test/applicationdata.svc/Sharks HTTP/1.1
Accept: application/json;odata=verbose;
Content-Type: application/json;
Content-Length: 98
Host: scdb38:8888
DataServiceVersion: 1.0;
{
"d":[
{
"Name":"Great White ",
"Food":"Surfers"
}
]
}
HTTP/1.1 400 Bad Request
Cache-Control: private
Content-Length: 201
Content-Type: application/json;odata=verbose;charset=utf-8
Server: Microsoft-IIS/7.5
X-Content-Type-Options: nosniff
DataServiceVersion: 1.0;
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 16 Oct 2013 23:31:09 GMT
{"error":{"code":"1","message":{"lang":"en-AU","value":"<?xml version=\"1.0\" encoding=\"utf-16\"?><ExceptionInfo><Message>An error occurred while processing this request.</Message></ExceptionInfo>"}}}
使用 WebServiceVerion:2.0
POST http://scdb38:8888/bi.test/applicationdata.svc/Sharks HTTP/1.1
Accept: application/json;odata=verbose;
Content-Type: application/json;
Content-Length: 98
Host: scdb38:8888
DataServiceVersion: 2.0;
{
"d":[
{
"Name":"Great White ",
"Food":"Surfers"
}
]
}
HTTP/1.1 400 Bad Request
Cache-Control: private
Content-Length: 201
Content-Type: application/json;odata=verbose;charset=utf-8
Server: Microsoft-IIS/7.5
X-Content-Type-Options: nosniff
DataServiceVersion: 1.0;
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 16 Oct 2013 23:38:23 GMT
{"error":{"code":"1","message":{"lang":"en-AU","value":"<?xml version=\"1.0\" encoding=\"utf-16\"?><ExceptionInfo><Message>An error occurred while processing this request.</Message></ExceptionInfo>"}}}
我是否正在解决这个问题,这只是 json 请求正文结构不正确的问题吗?我尝试了一些变化但没有成功,但是使用 XML 发布是有效的。
----- 解决方案-----
感谢 Jen 帮助我使用 json 格式发布到 OData 服务。
POST http://scdb38:8888/bi.test/applicationdata.svc/Sharks HTTP/1.1
Accept: application/json;odata=verbose;
Content-Type: application/json;
Content-Length: 62
Host: scdb38:8888
DataServiceVersion: 1.0;
{
"Name":"Great White ",
"Food":"Surfers"
}
HTTP/1.1 201 Created
Cache-Control: no-cache
Content-Length: 298
Content-Type: application/json;odata=verbose;charset=utf-8
ETag: W/"X'00000000000007E7'"
Location: http://scdb38:8888/BI.Test/ApplicationData.svc/Sharks(4)
Server: Microsoft-IIS/7.5
X-Content-Type-Options: nosniff
DataServiceVersion: 1.0;
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Thu, 17 Oct 2013 23:22:12 GMT
{"d":{"__metadata":{"id":"http://scdb38:8888/BI.Test/ApplicationData.svc/Sharks(4)","uri":"http://scdb38:8888/BI.Test/ApplicationData.svc/Sharks(4)","etag":"W/\"X'00000000000007E7'\"","type":"LightSwitchApplication.Shark"},"Id":4,"RowVersion":"AAAAAAAAB+c=","Name":"Great White ","Food":"Surfers"}}
最佳答案
看起来这个问题与 Content-Type
和 Accept
header 之间的差异有关。在 HTTP 中,Content-Type
用于请求和响应负载中,以传达当前负载的媒体类型。 Accept
用于请求负载中,说明服务器可以在响应负载中使用哪些媒体类型。
因此,在没有正文的请求(如您的 GET 请求)中包含 Content-Type
没有任何意义。当您执行 POST 请求时,您正在发送消息正文,因此 Content-Type
确实很重要。
如果服务器无法处理请求的 Content-Type
,它将返回 415 HTTP 错误。 (如果服务器不能满足请求 Accept
header 中的任何媒体类型,它将返回 406 错误。)
在 OData v3 中,媒体类型“application/json”被解释为表示新的 JSON 格式(“JSON light”)。如果服务端不支持读取 JSON 灯,当看到传入的请求是 JSON 灯时会抛出 415 错误。在您的有效负载中,您的请求正文是详细的 JSON,而不是 JSON 轻量级,因此服务器应该能够处理您的请求。它只是没有,因为它看到的是 JSON 轻量级内容类型。
您可以通过以下两种方式之一解决此问题:
在请求中包含 DataServiceVersion header 并将其设置为小于 v3。例如:
DataServiceVersion: 2.0;
(选项 2 假设您没有在请求负载中使用任何 v3 功能。)
关于json - 415 不支持的媒体类型 - 在 lightswitch 2012 中将 json POST 到 OData 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19396696/
我在 LightSwitch 中有一个主/细节屏幕。我允许用户删除详细信息的项目。但是,允许用户删除除一个之外的所有内容。换句话说,只需要呈现一个细节项。 这在灯开关中可行吗? 问候 最佳答案 以下是
如果您使用 Lightswitch 项目来管理您的实体和数据库更改,您如何将实体更改部署到现有的、已部署的项目数据库?在两个数据库版本上运行模式比较的最佳方法是什么? 最佳答案 LightSwitch
我只简单地使用过 LightSwitch,虽然它看起来可能是一个很好的内部应用程序框架,但我担心它会像许多其他 promise 简单创建应用程序的工具一样,但一旦你完全改变作为最基本的应用程序,它变得
我可以看到 lightswitch 的内部数据库称为“ApplicationDatabase”,如果您查看 Vs10 外部的目录结构,数据库位于 bin 文件夹中。 有人知道我如何扩展 lightsw
我刚刚安装了 Visual Studio LightSwitch 2011。我创建的每个屏幕都有相同的红色 X 和消息“无法加载数据”。 我正在创建一个桌面应用程序,它将在同一台机器上包含所有组件,包
在 VS LightSwitch 中,查询可以有参数。创建屏幕时,查询参数显示在屏幕上。可以定义选择列表,在这种情况下,该字段在屏幕上显示为下拉列表。 不是定义静态选择列表,而是如何从表中读取选择列表
我有自动生成的 LightSwitch 类 //----------------------------------------------------------------------------
我使用在 Visual Studio 2010 Professional 上运行的 Visual Studio LightSwitch 2011 (v1) 创建了一个应用程序。它是一个桌面应用程序,我
在 Lightswitch 中,可以在桌面上发布应用程序,并在同一台计算机上使用本地数据库。在 Lightswitch 2012 中,发布向导要求提供有效的用户连接字符串。在 Lightswitch
我在 Lightswitch 中有一个默认的数据输入屏幕。问题是,当用户不希望输入新记录时,用户会关闭屏幕以导航到其他地方。关闭表单后,将向用户显示“在关闭前保存更改?”信息。在用户未在此屏幕中输入任
今天,当我尝试将 Lightswitch 应用程序部署到运行 IIS 7.5 的 Windows 2008 R2 服务器时,我已经将我的挫败感发挥到了极致。导航到应用程序后,我收到以下信息 execr
我试图了解自定义 LightSwitch 应用程序的外观和感觉的最简化方式是什么。 我已经构建了几个 WPF 和 Silverlight 应用程序,并且有一组通用的画笔、样式、 Storyboard、
我正在尝试在 lightswitch (vs2012) 中实现表单例份验证,但我无法显示登录页面。我不需要任何复杂的角色,我只是想设置一个可以访问整个应用程序的用户帐户。我使用了 Edu Lorenz
LightSwitch 的报告功能是什么?是否需要第三方控制,或者 Microsoft 是否会提供与 Reporting Services 的集成? 取自迈克尔的 blog DevExpress 为
我知道这在 C# 中是如何工作的,但在 javascript 中不太了解,所以我希望它是相似的。 使用 Javascript,我可以创建一个带有变量 (var defaultValue = "1234
在lightswitch中,我需要根据递归关系制作动态级联下拉列表: 表“类别”包括: ID 姓名 ParentId 这是所需的场景: 显示没有父类别的下拉列表的屏幕(父 ID = 空)。 一旦用户选
我正在使用简单的代码玩转 LightSwitch 自定义控件: myapp.Facility_Details.ScreenContent_render = function (element, con
FindControl 似乎只引用网格的名称,而不是网格内的列名称。我也找不到有关 FindControlInCollection 的任何文档或示例。 此时我没有任何复杂的逻辑来包装它。只需要隐藏列。
我想要一种方法来捕获控件上的按键事件,如果是 Enter,则将焦点设置到下一个控件。 我们必须在一个简单的 ASP.NET 应用程序中执行一次此操作,以允许用户通过在 Web 环境中按 Enter 键
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
我是一名优秀的程序员,十分优秀!