下面的列表和示例中描述了针对 ADO.NET 数据服务对 POST 方法的使用的协议。通用 HTTP 要求(ADO.NET 数据服务框架)和 PUT、POST 和 DELETE(ADO.NET 数据服务框架)中描述了超文本传输协议 (RFC 2616) 所需的其他行为。
下列协议适用于使用 POST 方法的 HTTP 请求。
- 对 ADO.NET 数据服务资源执行的 POST 方法必须包含由请求 URI 的叶节点标识的实体集或实体类型的序列化(包含在请求正文中)。此请求的语义指示将数据放置到一个新的 ADO.NET 数据服务资源中。 
- POST 请求可能会在请求正文中包含在要创建的实体的实体键属性的值。如果与数据服务关联的存储提供程序自动分配键值,则此类请求可能失败并返回响应代码“422 无法处理的实体”。 
- POST 请求不得指定要添加的实体的 URI。如果请求指定了此 URI,则将返回响应代码“400 错误的请求”,并且将不会添加该实体。 
- 所有成功的 POST 请求都会在实体集中插入一个新实体。这些请求会返回响应代码“201 已创建”,并在响应中包含一个位置标头和新创建实体的 URI。 
- 请求负载中任何延迟的内容批注都将被忽略。 
- 如果 HTTP 标头中的请求 URI 与请求负载中的关联 URI 不匹配,则请求 URI 优先,并将负载视为包含请求 URI 的值的情况进行处理。 
- 如果执行操作时出错,例如,出现 DataServiceException 之外的运行时异常,则针对服务操作的 POST 请求可能返回响应代码“500 内部服务器错误”。 
支持 POST 方法的类型
下面的示例演示 HTTP URI 语法中的结束元素和这些元素支持 POST 方法的条件。每个示例都包含对 POST 请求和可预知的结果的描述。
/<EntitySet>
下面的 URI 示例将一个实体集显示为结束元素:
/Customers
说明:
- 支持的 POST 方法。 
- 将请求正文指定的单个实体类型实例插入实体集中。 
- 要插入的实体的 URI 不得在请求正文中出现。如果出现了此 URI,则将返回响应代码“400 错误的请求”。 
- 请求负载可能包含通过导航或链接属性与此实体集关联的实体集的新内容。没有为此类更新定义最大深度限制。 
- 启用新创建的顶级实体与现有实体或其他新创建的实体的绑定: - 如果资源 1 仅包含现有资源 2 的 URI 作为资源导航或链接属性的值,则将资源 1 绑定到资源 2。 
- 如果资源 1 包含新的相关资源的 URI 和正文,则将返回响应代码“400 错误的请求”,原因是在插入过程中不得指定 URI 属性。 
- 如果资源 1 仅包含新的相关资源 2 的正文而不包含其 URI,则将插入资源 1 和资源 2,并将二者进行绑定。 
 
示例:
下面的示例插入一个新的 Customer,并将其绑定到现有订单 1 和 3。
请求 URI 以/Customers结束。其格式为 JSON 格式。
{
Company Name:"Contoso"
City: "Seattle"
Orders : [   
{ __metadata: {uri:"/Orders(1)" }},
{ __metadata: {uri:"/Orders(3)" }}
]
}
下面的示例插入一个新的 Customer 和一个新的相关订单。
请求 URI 以/Customers结束。其格式为 JSON 格式。
{
Company Name:"Contoso Widgets"
City: "Seattle"
Orders : [   
{ 
    OrderName: "NewOrder",
    // additional property values go here
}
]
}
| .gif) 注意 | 
|---|
| 如果实体类型不是继承层次结构的一部分,则 JSON 序列化规则(ADO.NET 数据服务框架)中描述的 __metadata 对象中的类型参数是可选的。如果未指定类型,则假定为实体集的基类型。如果此类型是继承层次结构的一部分,则必须指定类型参数。 | 
/EntitySet(keyPredicate)
下面的 URI 示例将一个键谓词显示为结束元素:
/Customers('ALFKI')
说明:
不支持 POST 方法。
/<NavigationProperty> 或 /<LinkProperty>
下面的 URI 示例将一个导航属性显示为结束元素:
/Customers('ALFKI')/Orders
/Products(1)/Category
说明:
- 如果关系方具有一个大于 1 的基数,则导航属性和链接属性支持 POST 方法。 
- 导航属性和链接属性必须指向具有大于 1 的基数的关系方,否则将返回响应代码“405 不支持的方法”。 
- 这些属性使用的语义与先前描述的 - /<EntitySet>使用的语义相同,只不过在前者中新插入的资源将绑定到倒数第二个 URI 段标识的资源。
/<ComplexType>
下面的 URI 示例将一个复杂类型显示为结束元素:
/Customers('ALFKI’)/Address
说明:
- 不支持 POST 方法。
/<Property>
下面的 URI 示例将一个属性显示为结束元素:
/Customers('ALFKI’)/FirstName
说明:
- 不支持 POST 方法。
<Property>/$value
下面的 URI 示例将一个属性值显示为结束元素:
/Customers('ALFKI’)/FirstName/$value
说明:
- 不支持 POST 方法。
/<ServiceOperationName>
下面的 URI 示例将一个服务操作名称显示为结束元素:
/CustomersByCity?city=London
说明:
- 支持的 POST 方法。 
- 在服务器上调用服务操作。 
- 使用请求正文将参数传递给服务操作。 
- 使用 - application/x-www-form-urlencoding对参数进行编码。
- 通过使用 GET 或 POST 谓词可以调用服务操作;服务的元数据文档指定每项服务操作支持的内容。基于每项服务操作启用 POST。