[转]Open Data Protocol (OData) Basic Tutorial
本文转自:http://www.odata.org/getting-started/basic-tutorial/
Basic Tutorial
The Open Data Protocol (OData) is a data access protocol built on core protocols like HTTP and commonly accepted methodologies like REST for the web. There are various kinds of libraries and tools can be used to consume OData services. But for beginners and those who want to write their own libraries, the pure HTTP requests and responses are also very important. This documentation will not cover every feature details for OData V4 services but will try to cover various typical scenarios. If you want to have a more detailed understanding, please refer to OData Documentation.
Pleae be noted
- This is the Basic section. For topics like Singleton, Inheritance, Open Type, Containment and Batch, please refer to Advanced Section.
- All these are based on OData V4 sample service TripPin, please just replace the
serviceRoot
below with the URLhttp://services.odata.org/V4/TripPinServiceRW
. TripPin now supports ETag, so for data modification topics, you should first using GET on TripPin (eg. GET serviceRoot/People) to get the section information in the payload then use the URL with section for data modification examples. (something looks like http://services.odata.org/V4/(S(flat4rgegiueineatspfdku1))/TripPinServiceRW) - You may use Fiddler to run the request (especially the complex ones of data modification) and get the JSON response.
- In TripPin service, ETag is currently enabled on entity Person. We omit the ETag related headers in request headers for short, please go to the ETag Section for detailed information.
- We will keep improving this by adding contents and fixing bugs. You can provide your feedbacks and ask questions using OData Mailling List.
Requesting Data
OData services support requests for data via HTTP GET
requests.
Requesting Entity Collections
The request below returns the the collection of Person People. GET serviceRoot/People
Response Payload
{
"@odata.context": "serviceRoot/$metadata#People",
"@odata.nextLink": "serviceRoot/People?%24skiptoken=8",
"value": [
{
"@odata.id": "serviceRoot/People('russellwhyte')",
"@odata.etag": "W/\"08D1694BD49A0F11\"",
"@odata.editLink": "serviceRoot/People('russellwhyte')",
"UserName": "russellwhyte",
"FirstName": "Russell",
"LastName": "Whyte",
"Emails": [
"Russell@example.com",
"Russell@contoso.com"
],
"AddressInfo": [
{
"Address": "187 Suffolk Ln.",
"City": {
"CountryRegion": "United States",
"Name": "Boise",
"Region": "ID"
}
}
],
"Gender": "Male",
"Concurrency": 635404796846280400
},
......
,
{
"@odata.id": "serviceRoot/People('keithpinckney')",
"@odata.etag": "W/\"08D1694BD49A0F11\"",
"@odata.editLink": "serviceRoot/People('keithpinckney')",
"UserName": "keithpinckney",
"FirstName": "Keith",
"LastName": "Pinckney",
"Emails": [
"Keith@example.com",
"Keith@contoso.com"
],
"AddressInfo": [],
"Gender": "Male",
"Concurrency": 635404796846280400
}
]
}
Requesting an Individual Entity by ID
The request below returns an individual entity of type Person by the given UserName “russellwhyte” GET serviceRoot/People('russellwhyte')
Response Payload
{
"@odata.context": "serviceRoot/$metadata#People/$entity",
"@odata.id": "serviceRoot/People('russellwhyte')",
"@odata.etag": "W/\"08D1694BF26D2BC9\"",
"@odata.editLink": "serviceRoot/People('russellwhyte')",
"UserName": "russellwhyte",
"FirstName": "Russell",
"LastName": "Whyte",
"Emails": [
"Russell@example.com",
"Russell@contoso.com"
],
"AddressInfo": [
{
"Address": "187 Suffolk Ln.",
"City": {
"CountryRegion": "United States",
"Name": "Boise",
"Region": "ID"
}
}
],
"Gender": "Male",
"Concurrency": 635404797346655200
}
Requesting an Individual Property
To address an entity property clients append a path segment containing property name to the URL of the entity. If the property has a complex type, properties of that value can be addressed by further property name composition. First let’s take a look at how to get a simple property. The request below returns the Name property of an Airport.
GET serviceRoot/Airports('KSFO')/Name
Response Payload
{
"@odata.context": "serviceRoot/$metadata#Airports('KSFO')/Name",
"value": "San Francisco International Airport"
}
Then let’s see how to get a property value of a complex type. The request below returns the Address of the complex type Location in an Airport. GET serviceRoot/Airports('KSFO')/Location/Address
Response Payload
{
"@odata.context": "serviceRoot/$metadata#Airports('KSFO')/Location/Address",
"value": "South McDonnell Road, San Francisco, CA 94128"
}
Requesting an Individual Property Raw Value
To address the raw value of a primitive property, clients append a path segment containing the string $value
to the property URL. The request below returns the raw value of property Name of an Airport. GET serviceRoot/Airports('KSFO')/Name/$value
Response Payload
San Francisco International Airport
Querying Data
OData supports various kinds of query options for querying data. This section will help you go through the common scenarios for these query options.
System Query Option $filter
The $filter
system query option allows clients to filter a collection of resources that are addressed by a request URL. The expression specified with $filter
is evaluated for each resource in the collection, and only items where the expression evaluates to true are included in the response.
Basic predicates, built-in functions
There are several kinds of basic predicates and built-in functions for $filter
, including logical operators and arithmetic operators. For more detailed information, please refer to OData V4 URL Conventions Document. The request below using $filter
to get people with FirstName “Scott”. GET serviceRoot/People?$filter=FirstName eq 'Scott'
Response Payload
{
"@odata.context": "serviceRoot/$metadata#People",
"value": [
{
"@odata.id": "serviceRoot/People('scottketchum')",
"@odata.etag": "W/\"08D1694C7E510464\"",
"@odata.editLink": "serviceRoot/People('scottketchum')",
"UserName": "scottketchum",
"FirstName": "Scott",
"LastName": "Ketchum",
"Emails": [
"Scott@example.com"
],
"AddressInfo": [
{
"Address": "2817 Milton Dr.",
"City": {
"CountryRegion": "United States",
"Name": "Albuquerque",
"Region": "NM"
}
}
],
"Gender": "Male",
"Concurrency": 635404799693620400
}
]
}
Filter on Complex Type
$filter
can also work on complex type. The request below returns airports with “San Francisco” contained in its Address. And Address is property of complex type Location.
GET serviceRoot/Airports?$filter=contains(Location/Address, 'San Francisco')
Response Payload
{
"@odata.context": "serviceRoot/$metadata#Airports",
"value": [
{
"@odata.id": "serviceRoot/Airports('KSFO')",
"@odata.editLink": "serviceRoot/Airports('KSFO')",
"IcaoCode": "KSFO",
"Name": "San Francisco International Airport",
"IataCode": "SFO",
"Location": {
"Address": "South McDonnell Road, San Francisco, CA 94128",
"City": {
"CountryRegion": "United States",
"Name": "San Francisco",
"Region": "California"
},
"Loc": {
"type": "Point",
"coordinates": [
-122.374722222222,
37.6188888888889
],
"crs": {
"type": "name",
"properties": {
"name": "EPSG:4326"
}
}
}
}
}
]
}
Filter on Enum Properties
The request below returns all female People of entity type Person. The Gender is a property of Enum
type. GET serviceRoot/People?$filter=Gender eq Microsoft.OData.SampleService.Models.TripPin.PersonGender'Female'
Response Payload
{
"@odata.context": "serviceRoot/$metadata#People",
"@odata.nextLink": "serviceRoot/People?%24filter=Gender+eq+Microsoft.OData.SampleService.Models.TripPin.PersonGender%27Female%27&%24skiptoken=8",
"value": [
{
"@odata.id": "serviceRoot/People('elainestewart')",
"@odata.etag": "W/\"08D1694CCFB34453\"",
"@odata.editLink": "serviceRoot/People('elainestewart')",
"UserName": "elainestewart",
"FirstName": "Elaine",
"LastName": "Stewart",
"Emails": [
"Elaine@example.com",
"Elaine@contoso.com"
],
"AddressInfo": [],
"Gender": "Female",
"Concurrency": 635404801059013800
},
......
,
{
"@odata.id": "serviceRoot/People('ursulabright')",
"@odata.etag": "W/\"08D1694CCFB34453\"",
"@odata.editLink": "serviceRoot/People('ursulabright')",
"UserName": "ursulabright",
"FirstName": "Ursula",
"LastName": "Bright",
"Emails": [
"Ursula@example.com",
"Ursula@contoso.com"
],
"AddressInfo": [],
"Gender": "Female",
"Concurrency": 635404801059013800
}
]
}
Nested Filter in Expand
OData V4 supports nested filters in $expand
. The request below return People and all their trips with Name “Trip in US”. GET serviceRoot/People?$expand=Trips($filter=Name eq 'Trip in US')
Response Payload
{
"@odata.context": "serviceRoot/$metadata#People",
"@odata.nextLink": "serviceRoot/People?%24expand=Trips(%24filter%3dName+eq+%27Trip+in+US%27)&%24skiptoken=8",
"value": [
{
"@odata.id": "serviceRoot/People('russellwhyte')",
"@odata.etag": "W/\"08D1694D0DBBD9DB\"",
"@odata.editLink": "serviceRoot/People('russellwhyte')",
"UserName": "russellwhyte",
"FirstName": "Russell",
"LastName": "Whyte",
"Emails": [
"Russell@example.com",
"Russell@contoso.com"
],
"AddressInfo": [
{
"Address": "187 Suffolk Ln.",
"City": {
"CountryRegion": "United States",
"Name": "Boise",
"Region": "ID"
}
}
],
"Gender": "Male",
"Concurrency": 635404802099763700,
"Trips@odata.context": "serviceRoot/$metadata#People('russellwhyte')/Trips",
"Trips": [
{
"TripId": 1001,
"ShareId": "9d9b2fa0-efbf-490e-a5e3-bac8f7d47354",
"Description": "Trip from San Francisco to New York City",
"Name": "Trip in US",
"Budget": 3000,
"StartsAt": "2014-01-01T00:00:00Z",
"EndsAt": "2014-01-04T00:00:00Z",
"Tags": [
"business",
"New York meeting"
]
}
]
},
......
,
{
"@odata.id": "serviceRoot/People('keithpinckney')",
"@odata.etag": "W/\"08D1694D0DBBD9DB\"",
"@odata.editLink": "serviceRoot/People('keithpinckney')",
"UserName": "keithpinckney",
"FirstName": "Keith",
"LastName": "Pinckney",
"Emails": [
"Keith@example.com",
"Keith@contoso.com"
],
"AddressInfo": [],
"Gender": "Male",
"Concurrency": 635404802099763700,
"Trips@odata.context": "serviceRoot/$metadata#People('keithpinckney')/Trips",
"Trips": []
}
]
}
System Query Option $orderby
The $orderby
system query option allows clients to request resources in either ascending order using asc
or descending order using desc
. If asc
or desc
not specified, then the resources will be ordered in ascending order. The request below orders Trips on property EndsAt in descending order.
GET serviceRoot/People('scottketchum')/Trips?$orderby=EndsAt desc
Response Payload
{
"@odata.context": "serviceRoot/$metadata#People('scottketchum')/Trips",
"value": [
{
"TripId": 2004,
"ShareId": "f94e9116-8bdd-4dac-ab61-08438d0d9a71",
"Description": "Trip from Shanghai to Beijing",
"Name": "Trip in Beijing",
"Budget": 11000,
"StartsAt": "2014-02-01T00:00:00Z",
"EndsAt": "2014-02-04T00:00:00Z",
"Tags": [
"Travel",
"Beijing"
]
},
{
"TripId": 2002,
"ShareId": "9d9b2fa0-efbf-490e-a5e3-bac8f7d47354",
"Description": "Trip from San Francisco to New York City",
"Name": "Trip in US",
"Budget": 5000,
"StartsAt": "2014-01-01T00:00:00Z",
"EndsAt": "2014-01-04T00:00:00Z",
"Tags": [
"business",
"New York meeting"
]
}
]
}
System Query Option $top and $skip
The $top
system query option requests the number of items in the queried collection to be included in the result. The $skip query option requests the number of items in the queried collection that are to be skipped and not included in the result. The request below returns the first two people of the People entity set.
GET serviceRoot/People?$top=2
Response Payload
{
"@odata.context": "serviceRoot/$metadata#People",
"value": [
{
"@odata.id": "serviceRoot/People('russellwhyte')",
"@odata.etag": "W/\"08D1694D4AA4A8D1\"",
"@odata.editLink": "serviceRoot/People('russellwhyte')",
"UserName": "russellwhyte",
"FirstName": "Russell",
"LastName": "Whyte",
"Emails": [
"Russell@example.com",
"Russell@contoso.com"
],
"AddressInfo": [
{
"Address": "187 Suffolk Ln.",
"City": {
"CountryRegion": "United States",
"Name": "Boise",
"Region": "ID"
}
}
],
"Gender": "Male",
"Concurrency": 635404803121654000
},
{
"@odata.id": "serviceRoot/People('scottketchum')",
"@odata.etag": "W/\"08D1694D4AA4A8D1\"",
"@odata.editLink": "serviceRoot/People('scottketchum')",
"UserName": "scottketchum",
"FirstName": "Scott",
"LastName": "Ketchum",
"Emails": [
"Scott@example.com"
],
"AddressInfo": [
{
"Address": "2817 Milton Dr.",
"City": {
"CountryRegion": "United States",
"Name": "Albuquerque",
"Region": "NM"
}
}
],
"Gender": "Male",
"Concurrency": 635404803121654000
}
]
}
The request below returns people starting with the 19th people of the entity set People
GET serviceRoot/People?$skip=18
Response Payload
{
"@odata.context": "serviceRoot/$metadata#People",
"value": [
{
"@odata.id": "serviceRoot/People('genevievereeves')",
"@odata.etag": "W/\"08D1694D8B408D60\"",
"@odata.editLink": "serviceRoot/People('genevievereeves')",
"UserName": "genevievereeves",
"FirstName": "Genevieve",
"LastName": "Reeves",
"Emails": [
"Genevieve@example.com",
"Genevieve@contoso.com"
],
"AddressInfo": [],
"Gender": "Female",
"Concurrency": 635404804205612400
},
{
"@odata.id": "serviceRoot/People('kristakemp')",
"@odata.etag": "W/\"08D1694D8B408D60\"",
"@odata.editLink": "serviceRoot/People('kristakemp')",
"UserName": "kristakemp",
"FirstName": "Krista",
"LastName": "Kemp",
"Emails": [
"Krista@example.com"
],
"AddressInfo": [],
"Gender": "Female",
"Concurrency": 635404804205612400
}
]
}
System Query Option $count
The $count
system query option allows clients to request a count of the matching resources included with the resources in the response. The request below returns the total number of people in the collection.
GET serviceRoot/People/$count
Response Payload
20
System Query Option $expand
The $expand
system query option specifies the related resources to be included in line with retrieved resources. The request below returns people with navigation property Friends of a Person
GET serviceRoot/People('keithpinckney')?$expand=Friends
Response Payload
{
"@odata.context": "serviceRoot/$metadata#People/$entity",
"@odata.id": "serviceRoot/People('keithpinckney')",
"@odata.etag": "W/\"08D1694E2BB4317A\"",
"@odata.editLink": "serviceRoot/People('keithpinckney')",
"UserName": "keithpinckney",
"FirstName": "Keith",
"LastName": "Pinckney",
"Emails": [
"Keith@example.com",
"Keith@contoso.com"
],
"AddressInfo": [],
"Gender": "Male",
"Concurrency": 635404806897545600,
"Friends": [
{
"@odata.id": "serviceRoot/People('clydeguess')",
"@odata.etag": "W/\"08D1694E2BB4317A\"",
"@odata.editLink": "serviceRoot/People('clydeguess')",
"UserName": "clydeguess",
"FirstName": "Clyde",
"LastName": "Guess",
"Emails": [
"Clyde@example.com"
],
"AddressInfo": [],
"Gender": "Male",
"Concurrency": 635404806897545600
},
{
"@odata.id": "serviceRoot/People('marshallgaray')",
"@odata.etag": "W/\"08D1694E2BB4317A\"",
"@odata.editLink": "serviceRoot/People('marshallgaray')",
"UserName": "marshallgaray",
"FirstName": "Marshall",
"LastName": "Garay",
"Emails": [
"Marshall@example.com",
"Marshall@contoso.com"
],
"AddressInfo": [],
"Gender": "Male",
"Concurrency": 635404806897545600
}
]
}
System Query Option $select
The $select
system query option allows the clients to requests a limited set of properties for each entity or complex type. The request below returns Name and IcaoCode of all Airports.
GET serviceRoot/Airports?$select=Name, IcaoCode
Response Payload
{
"@odata.context": "serviceRoot/$metadata#Airports(Name,IcaoCode)",
"value": [
{
"@odata.id": "serviceRoot/Airports('KSFO')",
"@odata.editLink": "serviceRoot/Airports('KSFO')",
"Name": "San Francisco International Airport",
"IcaoCode": "KSFO"
},
......
,
{
"@odata.id": "serviceRoot/Airports('KJFK')",
"@odata.editLink": "serviceRoot/Airports('KJFK')",
"Name": "John F. Kennedy International Airport",
"IcaoCode": "KJFK"
}
]
}
System Query Option $search
The $search system query option restricts the result to include only those entities matching the specified search expression. The definition of what it means to match is dependent upon the implementation. The request below get all People who has ‘Boise’ in their contents.
serviceRoot/People?$search=Boise
Response Payload
{
"@odata.context": "serviceRoot/$metadata#People",
"value": [
{
"@odata.id": "serviceRoot/People('russellwhyte')",
"@odata.etag": "W/\"08D1694E90C0914C\"",
"@odata.editLink": "serviceRoot/People('russellwhyte')",
"UserName": "russellwhyte",
"FirstName": "Russell",
"LastName": "Whyte",
"Emails": [
"Russell@example.com",
"Russell@contoso.com"
],
"AddressInfo": [
{
"Address": "187 Suffolk Ln.",
"City": {
"CountryRegion": "United States",
"Name": "Boise",
"Region": "ID"
}
}
],
"Gender": "Male",
"Concurrency": 635404808592855400
}
]
}
Lambda Operators
OData defines two operators any
and all
that evaluate a Boolean expression on a collection. They can work on either collection properties or collection of entities.
The request below returns People with Emails containing “ll@contoso.com”. The Emails is a collection of primitive type string.
GET serviceRoot/People?$filter=Emails/any(s:endswith(s, 'contoso.com'))
Response Payload
{
"@odata.context": "serviceRoot/$metadata#People",
"value": [
{
"@odata.id": "serviceRoot/People('russellwhyte')",
"@odata.etag": "W/\"08D1694ECB6F8E7D\"",
"@odata.editLink": "serviceRoot/People('russellwhyte')",
"UserName": "russellwhyte",
"FirstName": "Russell",
"LastName": "Whyte",
"Emails": [
"Russell@example.com",
"Russell@contoso.com"
],
"AddressInfo": [
{
"Address": "187 Suffolk Ln.",
"City": {
"CountryRegion": "United States",
"Name": "Boise",
"Region": "ID"
}
}
],
"Gender": "Male",
"Concurrency": 635404809577402000
},
{
"@odata.id": "serviceRoot/People('marshallgaray')",
"@odata.etag": "W/\"08D1694ECB6F8E7D\"",
"@odata.editLink": "serviceRoot/People('marshallgaray')",
"UserName": "marshallgaray",
"FirstName": "Marshall",
"LastName": "Garay",
"Emails": [
"Marshall@example.com",
"Marshall@contoso.com"
],
"AddressInfo": [],
"Gender": "Male",
"Concurrency": 635404809577402000
}
]
}
The request below returns the friends of Me who have friends using “Scott” as their FirstName.
GET serviceRoot/Me/Friends?$filter=Friends/any(f:f/FirstName eq 'Scott')
Response Payload
{
"@odata.context": "serviceRoot/$metadata#People",
"value": [
{
"@odata.id": "serviceRoot/People('russellwhyte')",
"@odata.etag": "W/\"08D1694EE92CB5C3\"",
"@odata.editLink": "serviceRoot/People('russellwhyte')",
"UserName": "russellwhyte",
"FirstName": "Russell",
"LastName": "Whyte",
"Emails": [
"Russell@example.com",
"Russell@contoso.com"
],
"AddressInfo": [
{
"Address": "187 Suffolk Ln.",
"City": {
"CountryRegion": "United States",
"Name": "Boise",
"Region": "ID"
}
}
],
"Gender": "Male",
"Concurrency": 635404810076337700
},
{
"@odata.id": "serviceRoot/People('ronaldmundy')",
"@odata.etag": "W/\"08D1694EE92CB5C3\"",
"@odata.editLink": "serviceRoot/People('ronaldmundy')",
"UserName": "ronaldmundy",
"FirstName": "Ronald",
"LastName": "Mundy",
"Emails": [
"Ronald@example.com",
"Ronald@contoso.com"
],
"AddressInfo": [],
"Gender": "Male",
"Concurrency": 635404810076337700
}
]
}
Data Modification
Updatable OData services support Create, Update and Delete operation for some or all exposed entities.
Create an Entity
To create an entity in a collection, the client sends a POST request to that collection’s URL. The POST body MUST contain a single valid entity representation. The request below creates a Person which contains complex type and collection property.
POST serviceRoot/People OData-Version: 4.0 Content-Type: application/json;odata.metadata=minimal Accept: application/json
{ "@odata.type" : "Microsoft.OData.SampleService.Models.TripPin.Person", "UserName": "teresa", "FirstName" : "Teresa", "LastName" : "Gilbert", "Gender" : "Female", "Emails" : ["teresa@example.com", "teresa@contoso.com"], "AddressInfo" : [ { "Address" : "1 Suffolk Ln.", "City" : { "CountryRegion" : "United States", "Name" : "Boise", "Region" : "ID" } }] }
Response Payload
HTTP/1.1 201 Created
Content-Length: 468
Content-Type: application/json;odata.metadata=minimal;odata.streaming=true;IEEE754Compatible=false;charset=utf-8
Location: serviceRoot/People('teresa')
OData-Version: 4.0
{
"@odata.context":"serviceRoot/$metadata#People/$entity",
"@odata.id":"serviceRoot/People('teresa')",
"@odata.editLink":"serviceRoot/People('teresa')",
"UserName":"teresa",
"FirstName":"Teresa",
"LastName":"Gilbert",
"Emails":["teresa@example.com","teresa@contoso.com"],
"AddressInfo":[{"Address":"1 Suffolk Ln.","City":{"CountryRegion":"United States","Name":"Boise","Region":"ID"}}],
"Gender":"Female"
}
Remove an Entity
The request below deletes the Person with UserName ‘vincentcalabrese’. DELETE serviceRoot/People('vincentcalabrese')
Response Payload
HTTP/1.1 204 No Content
OData-Version: 4.0
Update an Entity
The OData services SHOULD support PATCH as the preferred means of updating an entity. But also services MAY additionally support PUT. The request below update the Emails of a person using PATCH.
PATCH serviceRoot/People('russellwhyte') OData-Version: 4.0 Content-Type: application/json;odata.metadata=minimal Accept: application/json
{ "@odata.type" : "Microsoft.OData.SampleService.Models.TripPin.Person", "Emails" : ["Russell@example.com", "Russell@contoso.com", "newRussell@contoso.com"] }
Response Payload
HTTP/1.1 204 No Content
Relationship Operations
Relationships from one entity to another are represented as navigation properties.
Link to Related Entities
A successful POST request to a navigation property’s references collection adds a relationship to an existing entity. The request below adds ‘vincentcalabrese’ to friends of ‘scottketchum’. POST serviceRoot/People('scottketchum')/Friends/$ref OData-Version: 4.0 Content-Type: application/json;odata.metadata=minimal Accept: application/json
{ "@odata.id": "serviceRoot/People('vincentcalabrese')" }
Response Payload
HTTP/1.1 204 No Content
Change a Link
A successful PUT request to a single-valued navigation property’s reference resource changes the related entity. The request below change the Airline of a Flight. PUT serviceRoot/People('russellwhyte')/Trips(1001)/PlanItems(11)/Microsoft.OData.SampleService.Models.TripPin.Flight/Airline/$ref
OData-Version: 4.0 Content-Type: application/json;odata.metadata=minimal Accept: application/json
{ "@odata.id": "serviceRoot/Airlines('FM')" }
Response Payload
HTTP/1.1 200 OK
{
"@odata.context":"serviceRoot/TripPinServiceRW/$metadata#$ref",
"@odata.id":"serviceRoot/People('russellwhyte')/Trips(1001)/PlanItems(11)/Microsoft.OData.SampleService.Models.TripPin.Flight/Airline"
}
Functions and Actions
OData supports custom operations (Actions and Functions). Functions are operations exposed by an OData service the MUST return data and MUST have no observable side effects. Actions are operations exposed by an OData service that MAY have side effects when invoked. Functions and actions both MAY bound to an entity type, primitive type, complex type, or a collection.
Invoking Unbound Functions
The function below returns the nearest airport with the input geography point. GET serviceRoot/GetNearestAirport(lat = 33, lon = -118)
Response Payload
Response 200 OK
{
"@odata.context": "serviceRoot/$metadata#Airports/$entity",
"IcaoCode": "KLAX",
"Name": "Los Angeles International Airport",
"IataCode": "LAX",
"Location": {
"Address": "1 World Way, Los Angeles, CA, 90045",
"City": {
"CountryRegion": "United States",
"Name": "Los Angeles",
"Region": "California"
},
"Loc": {
"type": "Point",
"coordinates": [
-118.408055555556,
33.9425
],
"crs": {
"type": "name",
"properties": {
"name": "EPSG:4326"
}
}
}
}
}
Invoking Bound Functions
The request below returns the favorite airline of a person, in TripPin service, “favorite airline” means airline which user choose most times. The function GetFavoriteAirline() is bound to Person. GET serviceRoot/People('russellwhyte')/Microsoft.OData.SampleService.Models.TripPin.GetFavoriteAirline()
Response Payload
Response 200 OK
{
"@odata.context": "serviceRoot/$metadata#Airlines/$entity",
"@odata.id": "serviceRoot/Airlines('AA')",
"@odata.editLink": "serviceRoot/Airlines('AA')",
"AirlineCode": "AA",
"Name": "American Airlines"
}
Invoking Unbound Actions
TripPin currently has no scenario supported for unbound actions.
Invoking Bound Actions
The action below shares a trip to one of his friend. In TripPin service, by “share a trip” we mean that the owner and his friend now both have the trip and the trip share the same ShareId property. POST serviceRoot/People('russellwhyte')/Microsoft.OData.SampleService.Models.TripPin.ShareTrip
OData-Version: 4.0 Content-Type: application/json;odata.metadata=minimal Accept: application/json
{ "userName": "scottketchum", "tripId": 1001 }
Response Payload
HTTP/1.1 204 No Content
ETag
OData V4 supports ETag for Data Modification Request and Action Request. This section demonstrates how to operate on entity with ETag enabled. Please be noted that the ETag value below may be out-of-date, so when you try these requests, please first use the GET
request to get the ETag of specified entity.
Update Entity with ETag
The request below shows how to update Person which has ETag supported. Please be noted that the value for If-Match
should be the same with the ETag
value of the specified Person. PATCH serviceRoot/People('clydeguess') OData-Version: 4.0 Content-Type: application/json;odata.metadata=minimal Accept: application/json If-Match: W/"08D15F3DD9126D84"
{ "@odata.type": "#Microsoft.OData.SampleService.Models.TripPin.Person", "FirstName" : "CLYDE" }
Response Payload
HTTP/1.1 204 No Content
Delete Entity with ETag
The request below shows how to delete Person which has ETag supported. Please be noted that the value for If-Match
should be the same with the ETag
value of the specified Person. DELETE serviceRoot/People(‘vincentcalabrese’) OData-Version: 4.0 Content-Type: application/json;odata.metadata=minimal Accept: application/json If-Match: W/”08D15F3DD9A61539″
Response Payload
HTTP/1.1 204 No Content
li>a {
display: block;
font-size: 15px;
font-weight: 500;
color: #bf3e11;
padding: 4px 20px;
}
.tutorial-sidebar .nav>li>a:hover, .tutorial-sidebar .nav>li>a:focus {
padding-left: 19px;
color: #563d7c;
text-decoration: none;
background-color: transparent;
border-left: 1px solid #563d7c;
}
.tutorial-sidebar .nav>.active>a, .tutorial-sidebar .nav>.active:hover>a, .tutorial-sidebar .nav>.active:focus>a {
padding-left: 18px;
font-weight: 700;
color: #563d7c;
background-color: transparent;
border-left: 2px solid #563d7c;
}
.tutorial-sidebar .nav .nav {
display: none;
padding-bottom: 10px;
}
.tutorial-sidebar .nav .nav>li>a {
padding-top: 1px;
padding-bottom: 1px;
padding-left: 30px;
font-size: 14px;
font-weight: 400;
}
.tutorial-sidebar .nav .nav>li>a:hover, .tutorial-sidebar .nav .nav>li>a:focus {
padding-left: 29px;
}
.tutorial-sidebar .nav .nav>.active>a, .tutorial-sidebar .nav .nav>.active:hover>a, .tutorial-sidebar .nav .nav>.active:focus>a {
font-weight: 500;
padding-left: 28px;
}
.tutorial-sidebar.affix, .tutorial-sidebar.affix-bottom {
width: 213px;
}
.tutorial-sidebar.affix {
position: fixed;
top: 20px;
}
.tutorial-sidebar.affix-bottom {
position: absolute;
}
.tutorial-sidebar.affix-bottom .tutorial-sidenav, .tutorial-sidebar.affix .tutorial-sidenav {
margin-top: 0;
margin-bottom: 0;
}
.tutorial-sidenav {
margin-top: 20px;
margin-bottom: 20px;
}
@media (min-width:992px) {
.tutorial-sidebar .nav>.active>ul {
display: block;
}
-->
© 2014 Open Data Protocol
[转]Open Data Protocol (OData) Basic Tutorial的更多相关文章
- Ogre学习笔记Basic Tutorial 前四课总结
转自:http://blog.csdn.net/yanonsoftware/article/details/1011195 OGRE Homepage:http://www.ogre3d.org/ ...
- Ogre1.8.1 Basic Tutorial 6 - The Ogre Startup Sequence
原文地址:http://www.ogre3d.org/tikiwiki/tiki-index.php?page=Basic+Tutorial+6&structure=Tutorials 1. ...
- pytorch例子学习-DATA LOADING AND PROCESSING TUTORIAL
参考:https://pytorch.org/tutorials/beginner/data_loading_tutorial.html DATA LOADING AND PROCESSING TUT ...
- Toward Scalable Systems for Big Data Analytics: A Technology Tutorial (I - III)
ABSTRACT Recent technological advancement have led to a deluge of data from distinctive domains (e.g ...
- Protocol Framework - SNMP Tutorial
30.4 Protocol Framework TCP/IP network management protocols2 divide the management problem into two ...
- Resumable Media Uploads in the Google Data Protocol
Eric Bidelman, Google Apps APIs team February 2010 Introduction The Resumable Protocol Initiating a ...
- [cmake] Basic Tutorial
Basic Project The most basic porject is an executable built from source code file. CMakeLists.txt cm ...
- [转]WCF Data Services OData
http://martinwilley.com/net/data/wcfds.html WCF Data Services About OData Server code Client For .ne ...
- Python Data Structure and Algorithms Tutorial
Python - Algorithm Design - Tutorialspoint https://www.tutorialspoint.com/python_data_structure/pyth ...
随机推荐
- 论持久战之PHPStorm Xdebug Remote 调试环境搭建(不依赖本地环境)
最近公司自己搭建了一个资源管理平台,哈哈,当然是我在github上找的,后台用PHP开发.个人觉得写得非常nice,web页面几乎模拟了真实OS,有兴趣的朋友下载部署体验https://github. ...
- 大话设计模式C++实现-第14章-观察者模式
一.UML图 关键词:Subject维护一个Observer列表.Subject运行Notify()时就运行列表中的每一个Observer的Update(). 二.概念 观察者模式:定义了一种一对多的 ...
- C项目实践--图书管理系统(1)
1.功能需求分析 图书管理系统主要用于对大量的图书信息,包括书名.作者.出版社.出版日期.ISBN(书号)等进行增.删.改.查以及保存等操作.同时也包括对用户的管理,用户包括管理员和普通用户两种权限, ...
- 头文件与cpp文件为什么要分开写
最表面的机制是: 头文件是程序的界面(是代码界面),提供给程序员以 类.模版.函数等一系列的声明,让程序员知道应该怎么调用里面的"东西". 从动态链接库的角度看: 头文件提供界面 ...
- 设计模式-(18)命令模式 (swift版)
一,概念: 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”.但在某些场合,比如要对行为进行“记录.撤销/重做.事务”等处理,这种无法抵御变化的紧耦合是不合适的.在这种情况下,如何将 ...
- 几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较(转)
几大最短路径算法比较 几个最短路径算法的比较:Floyd 求多源.无负权边(此处错误?应该可以有负权边)的最短路.用矩阵记录图.时效性较差,时间复杂度O(V^3). Floy ...
- bleve搜索引擎源码分析之索引——mapping真复杂啊
接下来看看下面index部分的源码实现: data := struct { Name string Des string }{ Name: "hello world this is bone ...
- python库学习笔记——BeautifulSoup处理子标签、后代标签、兄弟标签和父标签
首先,我们来看一个简单的网页https://www.pythonscraping.com/pages/page3.html,打开后: 右键"检查"(谷歌浏览器)查看元素: 用导航树 ...
- 并不对劲的bzoj4651:loj2084:uoj220:p1173:[NOI2016]网格
题目大意 有一个\(n*m\)(\(n,m\leq10^9\))的网格,每个格子是空地或障碍(\(障碍数\leq10^5\)) 定义两块空地连通,当且仅当它们是"相邻的两块空地"或 ...
- BZOJ_2844_albus就是要第一个出场_线性基
BZOJ_2844_albus就是要第一个出场_线性基 Description 已知一个长度为n的正整数序列A(下标从1开始), 令 S = { x | 1 <= x <= n }, S ...