21
Consuming SAP NetWeaver Gateway Services from Objective C Applications

Consuming SAP NetWeaver Gateway Services from Objective C

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Consuming SAP NetWeaver Gateway Services from Objective C

Consuming SAP NetWeaver Gateway Services from Objective C Applications

Page 2: Consuming SAP NetWeaver Gateway Services from Objective C

Copyright/Trademark

Copyright

© Copyright 2011 SAP AG. All rights reserved. SAP Library document classification: PUBLIC No part of this publication may be reproduced or transmitted in any form or for any purpose without the express permission of SAP AG. The information contained herein may be changed without prior notice. Some software products marketed by SAP AG and its distributors contain proprietary software components of other software vendors. Microsoft, Windows, Excel, Outlook, and PowerPoint are registered trademarks of Microsoft Corporation. IBM, DB2, DB2 Universal Database, System i, System i5, System p, System p5, System x, System z, System z10, System z9, z10, z9, iSeries, pSeries, xSeries, zSeries, eServer, z/VM, z/OS, i5/OS, S/390, OS/390, OS/400, AS/400, S/390 Parallel Enterprise Server, PowerVM, Power Architecture, POWER6+, POWER6, POWER5+, POWER5, POWER, OpenPower, PowerPC, BatchPipes, BladeCenter, System Storage, GPFS, HACMP, RETAIN, DB2 Connect, RACF, Redbooks, OS/2, Parallel Sysplex, MVS/ESA, AIX, Intelligent Miner, WebSphere, Netfinity, Tivoli and Informix are trademarks or registered trademarks of IBM Corporation. Linux is the registered trademark of Linus Torvalds in the U.S. and other countries. Adobe, the Adobe logo, Acrobat, PostScript, and Reader are either trademarks or registered trademarks of Adobe Systems Incorporated in the United States and/or other countries. Oracle is a registered trademark of Oracle Corporation. UNIX, X/Open, OSF/1, and Motif are registered trademarks of the Open Group. Citrix, ICA, Program Neighborhood, MetaFrame, WinFrame, VideoFrame, and MultiWin are trademarks or registered trademarks of Citrix Systems, Inc. HTML, XML, XHTML and W3C are trademarks or registered trademarks of W3C®, World Wide Web Consortium, Massachusetts Institute of Technology. Java is a registered trademark of Sun Microsystems, Inc. JavaScript is a registered trademark of Sun Microsystems, Inc., used under license for technology invented and implemented by Netscape. SAP, R/3, SAP NetWeaver, Duet, PartnerEdge, ByDesign, SAP BusinessObjects Explorer, StreamWork, and other SAP products and services mentioned herein as well as their respective logos are trademarks or registered trademarks of SAP AG in Germany and other countries. Business Objects and the Business Objects logo, BusinessObjects, Crystal Reports, Crystal Decisions, Web Intelligence, Xcelsius, and other Business Objects products and services mentioned herein as well as their respective logos are trademarks or registered trademarks of Business Objects Software Ltd. Business Objects is an SAP company. Sybase and Adaptive Server, iAnywhere, Sybase 365, SQL Anywhere, and other Sybase products and services mentioned herein as well as their respective logos are trademarks or registered trademarks of Sybase, Inc. Sybase is an SAP company. All other product and service names mentioned are the trademarks of their respective companies. Data contained in this document serves informational purposes only. National product specifications may vary. These materials are subject to change without notice. These materials are provided by SAP AG and its affiliated companies ("SAP Group") for informational purposes only, without representation or warranty of any kind, and SAP Group shall not be liable for errors or omissions with respect to the materials. The only warranties for SAP Group products and services are those that are set forth in the express warranty statements accompanying such products and services, if any. Nothing herein should be construed as constituting an additional warranty.

Page 3: Consuming SAP NetWeaver Gateway Services from Objective C

Copyright/Trademark

Table of Contents

Consuming SAP NetWeaver Gateway Services from Objective C Applications ....................... 4

Prerequisites .................................................................................................................................................... 5 Building an iOS Application ........................................................................................................................... 6

Function Import Example .......................................................................................................................... 6 Read Example ............................................................................................................................................ 9 Create Example........................................................................................................................................ 10 Creation of Request Body for Create Method ..................................................................................... 11

Authentication and Cookies ........................................................................................................................ 12 Known issues for Microsoft OData SDK V1.3 .......................................................................................... 12

Appendix 1 - RMTSAMPLEFLIGHT Service Metadata Description ............................................ 13

Appendix 2 – Code Snippets .......................................................................................................... 19

Get Available Flights .................................................................................................................................... 19 Get Carrier by ID ........................................................................................................................................... 20 Create a Flight Booking ............................................................................................................................... 20

Page 4: Consuming SAP NetWeaver Gateway Services from Objective C

Copyright/Trademark

CONSUMING SAP NETWEAVER GATEWAY SERVICES

FROM OBJECTIVE C APPLICATIONS

SAP NetWeaver Gateway technology provides a simple way to interact with SAP applications through variety of devices, environments and platforms based on market standards. The framework enables development of innovative, people-centric solutions that bring the power of SAP business software into new experiences, such as: social networking and collaboration environments; mobile and tablet devices; and rich internet applications. The framework supports rapid innovation while ensuring security, integrity, management and optimized maintenance of the core SAP systems. Completely flexible, the software offers connectivity to SAP applications using any programming language or model without the need for SAP knowledge by taking advantage of REST services and OData/ATOM protocols.

Note: There is added value in using the SAP OData Mobile SDK (which comes with the usage of SUP). This added value is not included when using the code snippets.

This guide provides information on how to consume SAP NetWeaver Gateway services from iOS applications based on the following scenario:

The user wants to fly from New York to San Francisco.

He goes online and searches for the different flights available. He enters his search parameters: city of origin, destination city, departure date, and arrival date (Function Import).

From the SAP NetWeaver Gateway, he receives the information for the option(s) that meet(s) his search parameters (Get Function).

He can now select the one that suits him the most and book his flight (Create Function).

The links to access the service document and metadata document are provided the in table below.

Service Document

http://<Gateway_host>:<Gateway_port>/sap/opu/sdata/iwfnd/RMTSAMPLEFLIGHT/

Metadata Document

http://<Gateway_host>:<Gateway_port>/sap/opu/sdata/iwfnd/RMTSAMPLEFLIGHT/ $metadata?$format=xml

Each service URL should contain the following information:

Gateway host

Port

SAP Client – no need to specify client if connecting to the default client.

Example:

http://<Gateway_Host>:<Gateway_Port>/sap/opu/sdata/iwfnd/RMTSAMPLEFLIGHT?sap-client=100

To obtain information on the selected service (its properties, function imports, associations, etc.), refer to Appendix 1, were we show the Metadata description of the RMTSAMPLEFLIGHT service.

To view the code snippets in a format that can be copied into new code, refer to Appendix 2 – Code Snippets.

Page 5: Consuming SAP NetWeaver Gateway Services from Objective C

Copyright/Trademark

The Flight service contains the following collections:

Collection URL

FlightCollection (list of flights)

http://<Gateway_host>:<Gateway_port>/sap/opu/sdata/ iwfnd/RMTSAMPLEFLIGHT/FlightCollection

CarrierCollection (list of carriers http://<Gateway_host>:<Gateway_port>/ sap/opu/sdata/iwfnd/RMTSAMPLEFLIGHT/CarrierCollection

BookingsCollection (list of Bookings) http://<Gateway_host>:<Gateway_port>/sap/opu/sdata/ iwfnd/RMTSAMPLEFLIGHT/BookingCollection

The operation GetAvailableFlights on FlightCollection is used to get a list of flights. The following is the URL

for the same:

http://<Gateway_host>:<Gateway_port>/sap/opu/sdata/iwfnd/RMTSAMPLEFLIGHT/GetAvailableFlights?

Each collection supports some or all of the operations listed below. The table below provides the list of

operations supported and the methods that each of this operations map to respectively:

Operation Method

Create HTTP POST

Read GET

Update PUT

Delete DELETE

Prerequisites

The following tools are required for developing an iOS application:

Software Version

SAP NetWeaver Gateway 2.0

Microsoft OData SDK for Objective C 1.3

To download go to: http://odataobjc.codeplex.com/

Contact your system administrator for landscape details to connect to the SAP NetWeaver Gateway system.

Page 6: Consuming SAP NetWeaver Gateway Services from Objective C

Copyright/Trademark

Make sure you have performed the following procedures:

Add proxies for the RMTSAMPLEFLIGHT service to your iOS project as described in the OData SDK documentation.

Add the following imports:

#import "WindowsCredential.h"

#import "RMTSAMPLEFLIGHT.h"

#import "Constants.h"

Building an iOS Application

Function Import Example

To get a list of the available flights based on filter criteria, trigger the “GetAvailableFlights” function import

with cityFrom, cityTo, fromDate and toDate parameters. The response will contain a list of flights that meet

the criteria.

Note: For more information on Function Import (also called Service Operation), refer to OData

documentation at http://www.odata.org/developers/protocols/uri-conventions under the Addressing

Service Operations section.

Refer to the code snippet below for details on how to do it from an iOS application:

1. The RMTSAMPLEFLIGHT service requires basic authentication. For this, you need to initiate a WindowsCredential object containing your user name and password.

WindowsCredential *credential = nil;

NSString *userName = @"UserName";

NSString *password = @"Password";

credential = [[[WindowsCredential alloc] initWithUserName:userName password:password] autorelease];

2. Initialize the service proxy object, for example RMTSAMPLEFLIGHT, using the service URL and credentials.

RMTSAMPLEFLIGHT *flightServiceEntities = [[RMTSAMPLEFLIGHT alloc] initWithUri:@"http://<Gateway_host>:<Gateway_port>/sap/opu/sdata/IWFND/RMTSAMPLEFLIGHT" credential:credential];

3. Add the XMLHttpRequest http header needed for Post requests. To work around issue# to add HTTP headers to the request implement the ODataDelegate protocol:

-(void) onBeforeSend: (HttpRequest*)request{

[request.m_httpHeaders.m_httpHeaders addEntriesFromDictionary:[NSDictionary dictionaryWithObject:@"XMLHttpRequest" forKey:@"X-Requested-With"]];

}

-(void) onAfterReceive: (HttpResponse*)response{

}

And then set the delegate in the proxy object:

flightServiceEntities.m_oDataDelegate = self;

Page 7: Consuming SAP NetWeaver Gateway Services from Objective C

Copyright/Trademark

4. Call the GetAvailableFlights method which uses the following parameters: flight departure date, arrival

date, and cities.

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

[dateFormatter setDateFormat:@"yyyyMMdd"];

NSDate *dateFrom = [dateFormatter dateFromString:@"20110105"];

NSDate *dateTo = [dateFormatter dateFromString:@"20110728"];

[dateFormatter release];

NSArray *flights = [flightServiceEntities GetAvailableFlightsWithfromdate:dateFrom todate:dateTo cityfrom:@"NEW YORK" cityto:@"SAN FRANCISCO"];

5. The method returns an array of flight objects. Go over all the flights in the array and print their carrier

ID.

for (RMTSAMPLEFLIGHT_Flight *flight in flights) {

NSLog(@"Carrier ID: %@", flight.m_carrid);

}

Response

<?xml version="1.0" encoding="utf-8" ?> - <atom:feed xml:base="<Gateway_Host>:<Gateway_Port>/sap/opu/sdata/iwfnd/RMTSAMPLEFLIGHT/"

xmlns:atom="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:sap="http://www.sap.com/Protocols/SAPData"> <atom:id>http://<host name>:<port>/sap/opu/sdata/iwfnd/RMTSAMPLEFLIGHT/FlightCollection</atom:id> <atom:link href="FlightCollection" rel="self" type="application/atom+xml;type=feed" title="FlightCollection" /> <atom:title>FlightCollection</atom:title> <atom:updated>2011-09-27T06:32:42Z</atom:updated>

- <atom:entry> <atom:author /> - <atom:content type="application/xml">

- <m:properties> <d:carrid>AA</d:carrid> <d:connid>0017</d:connid> <d:fldate m:Type="Edm.DateTime">2011-01-05T00:00:00</d:fldate> <d:PRICE m:Type="Edm.Decimal">889.00</d:PRICE> <d:CURRENCY>USD</d:CURRENCY> <d:PLANETYPE>747-400</d:PLANETYPE> <d:SEATSMAX>385</d:SEATSMAX> <d:SEATSOCC>367</d:SEATSOCC> <d:PAYMENTSUM m:Type="Edm.Decimal">185742.73</d:PAYMENTSUM> <d:SEATSMAX_B>31</d:SEATSMAX_B> <d:SEATSOCC_B>22</d:SEATSOCC_B> <d:SEATSMAX_F>21</d:SEATSMAX_F> <d:SEATSOCC_F>21</d:SEATSOCC_F> - <d:flightDetails> <d:countryFrom>US</d:countryFrom> <d:cityFrom>new york</d:cityFrom> <d:airportFrom>JFK</d:airportFrom> <d:countryTo>US</d:countryTo> <d:cityTo>SAN FRANCISCO</d:cityTo> <d:airportTo>SFO</d:airportTo> <d:flightTime>361</d:flightTime> <d:departureTime m:Type="Edm.Time">PT11H00M00S</d:departureTime> <d:arrivalTime m:Type="Edm.Time">PT14H01M00S</d:arrivalTime> <d:distance m:Type="Edm.Decimal">2574.0000</d:distance> <d:distanceUnit>SMI</d:distanceUnit> <d:flightType /> <d:period m:Type="Edm.Byte">0</d:period>

</d:flightDetails> </m:properties>

</atom:content>

Page 8: Consuming SAP NetWeaver Gateway Services from Objective C

Copyright/Trademark

<atom:id>http://<Gateway_Host>:<Gateway_Port>/sap/opu/sdata/iwfnd/RMTSAMPLEFLIGHT/FlightCollection(carrid='AA',connid='0017',fldate='20110105')</atom:id>

<atom:link href="FlightCollection(carrid='AA',connid='0017',fldate='20110105')" rel="edit" type="application/atom+xml;type=entry" />

<atom:link href="FlightCollection(carrid='AA',connid='0017',fldate='20110105')/flightbooking" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/flightbooking" type="application/atom+xml;type=entry" title="RMTSAMPLEFLIGHT.BookingFlight" />

<atom:link href="FlightCollection(carrid='AA',connid='0017',fldate='20110105')/flightBookings" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/flightBookings" type="application/atom+xml;type=feed" title="RMTSAMPLEFLIGHT.FlightBookings" />

<atom:link href="FlightCollection(carrid='AA',connid='0017',fldate='20110105')/FlightCarrier" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/FlightCarrier" type="application/atom+xml;type=entry" title="RMTSAMPLEFLIGHT.CarrierToFlight" />

<atom:title>Flight</atom:title> <atom:updated>2011-09-27T06:32:42Z</atom:updated>

</atom:entry> - <atom:entry> <atom:author /> - <atom:content type="application/xml"> - <m:properties>

<d:carrid>AA</d:carrid> <d:connid>0017</d:connid> <d:fldate m:Type="Edm.DateTime">2011-03-16T00:00:00</d:fldate> <d:PRICE m:Type="Edm.Decimal">422.94</d:PRICE> <d:CURRENCY>USD</d:CURRENCY> <d:PLANETYPE>747-400</d:PLANETYPE> <d:SEATSMAX>385</d:SEATSMAX> <d:SEATSOCC>371</d:SEATSOCC> <d:PAYMENTSUM m:Type="Edm.Decimal">192129.22</d:PAYMENTSUM> <d:SEATSMAX_B>31</d:SEATSMAX_B> <d:SEATSOCC_B>30</d:SEATSOCC_B> <d:SEATSMAX_F>21</d:SEATSMAX_F> <d:SEATSOCC_F>20</d:SEATSOCC_F> - <d:flightDetails> <d:countryFrom>US</d:countryFrom> <d:cityFrom>new york</d:cityFrom> <d:airportFrom>JFK</d:airportFrom> <d:countryTo>US</d:countryTo> <d:cityTo>SAN FRANCISCO</d:cityTo> <d:airportTo>SFO</d:airportTo> <d:flightTime>361</d:flightTime> <d:departureTime m:Type="Edm.Time">PT11H00M00S</d:departureTime> <d:arrivalTime m:Type="Edm.Time">PT14H01M00S</d:arrivalTime> <d:distance m:Type="Edm.Decimal">2574.0000</d:distance> <d:distanceUnit>SMI</d:distanceUnit> <d:flightType /> <d:period m:Type="Edm.Byte">0</d:period>

</d:flightDetails> </m:properties>

</atom:content> <atom:id>http://<Gateway_Host>:<Gateway_Port>/sap/opu/sdata/iwfnd/RMTSAMPLEFLIGHT/FlightCollection(carrid='AA',connid='0017',

fldate='20110316')</atom:id> <atom:link href="FlightCollection(carrid='AA',connid='0017',fldate='20110316')" rel="edit"

type="application/atom+xml;type=entry" /> <atom:link href="FlightCollection(carrid='AA',connid='0017',fldate='20110316')/flightbooking"

rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/flightbooking" type="application/atom+xml;type=entry" title="RMTSAMPLEFLIGHT.BookingFlight" />

<atom:link href="FlightCollection(carrid='AA',connid='0017',fldate='20110316')/flightBookings" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/flightBookings" type="application/atom+xml;type=feed" title="RMTSAMPLEFLIGHT.FlightBookings" />

<atom:link href="FlightCollection(carrid='AA',connid='0017',fldate='20110316')/FlightCarrier" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/FlightCarrier" type="application/atom+xml;type=entry" title="RMTSAMPLEFLIGHT.CarrierToFlight" />

<atom:title>Flight</atom:title> <atom:updated>2011-09-27T06:32:42Z</atom:updated>

</atom:entry>

Page 9: Consuming SAP NetWeaver Gateway Services from Objective C

Copyright/Trademark

Read Example

To read the carrier details, you must call the “CarrierCollection” using the Carrier ID parameter.

Refer to the code snippet below for details on how to do it from an iOS application:

Create a Get Specific carrier query string and execute it using the service proxy object. The result

returned in the response is an array containing the specific Carrier object.

NSString *carrierById = [NSString stringWithFormat:@"CarrierCollection(carrid=\'%@\')",flight.m_carrid];

QueryOperationResponse *response = [flightServiceEntities execute:carrierById];

RMTSAMPLEFLIGHT_Carrier *carrier = [[response getResult] objectAtIndex:0];

NSLog(@"carrier name: %@",carrier.m_CARRNAME);

Response

<?xml version="1.0" encoding="utf-8" ?> - <atom:entry xml:base="<Gateway_Host>:<Gateway_Port>/sap/opu/sdata/iwfnd/RMTSAMPLEFLIGHT/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:sap="http://www.sap.com/Protocols/SAPData"> <atom:author /> <atom:content src="http://www.aa.com" /> - <m:properties> <d:carrid>AA</d:carrid> <d:CARRNAME>American Airlines</d:CARRNAME> <d:CURRCODE>USD</d:CURRCODE> <d:URL>http://www.aa.com</d:URL> <d:mimeType /> </m:properties> <atom:id><Gateway_Host>:<Gateway_Port>/sap/opu/sdata/iwfnd/RMTSAMPLEFLIGHT/CarrierCollection(carrid='AA')</atom:id> <atom:link href="CarrierCollection(carrid='AA')" rel="self" type="application/atom+xml;type=entry" /> <atom:link href="CarrierCollection(carrid='AA')/carrierFlights" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/carrierFlights" type="application/atom+xml;type=feed" title="RMTSAMPLEFLIGHT.CarrierToFlight" /> <atom:title>Carrier</atom:title> <atom:updated>2011-09-27T10:00:38Z</atom:updated> </atom:entry>

Page 10: Consuming SAP NetWeaver Gateway Services from Objective C

Copyright/Trademark

Create Example

To book a flight, trigger an HTTP POST method on the Booking Collection (with the Booking details in the request body). Check for the HTTP response code. If the response code is 201, then the HTTP-POST is successful. The response contains the newly created Booking ID in the bookid field, as well as the entire information that was part of the request body.

Refer to the code snippet below for details on how to invoke a create request from an iOS application:

1. Initialize a new Booking object.

RMTSAMPLEFLIGHT_Booking *booking = [[RMTSAMPLEFLIGHT_Booking alloc] init];

booking.m_carrid = @"AA";

booking.m_connid = @"0017";

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

[dateFormatter setDateFormat:@"yyyyMMdd"];

NSDate *date = [dateFormatter dateFromString:@"20111221"];

booking.m_fldate = date;

booking.m_CUSTOMID = @"00004617";

booking.m_PASSNAME = @"Joe Smith";

booking.m_PASSFORM = @"1234567";

booking.m_CUSTTYPE = @"P";

booking.m_WUNIT = @"KG";

booking.m_LUGGWEIGHT = [NSDecimalNumber decimalNumberWithString:@"14.4000"];

booking.m_CLASS = @"Y";

booking.m_FORCURAM = [NSDecimalNumber decimalNumberWithString:@"879.82"];

booking.m_FORCURKEY = @"USD";

booking.m_LOCCURAM = [NSDecimalNumber decimalNumberWithString:@"803.58"];

booking.m_LOCCURKEY = @"USD";

NSDate *date2 = [dateFormatter dateFromString:@"20110522"];

booking.m_ORDER_DATE = date2;

booking.m_AGENCYNUM = @"00000325";

booking.m_PASSBIRTH = [dateFormatter dateFromString:@"19901010"];

booking.m_COUNTER = @"00000000";

[dateFormatter release];

2. Add an XMLHttpRequest http header. Implement the ODataDelegate protocol as described in the Function Import example, then set the delegate in the proxy object:

flightServiceEntities.m_oDataDelegate = self;

3. Add the new Booking object to the BookingCollection and call the saveChanges method to trigger the

request.

[flightServiceEntities addToBookingCollection:booking];

[flightServiceEntities setSaveChangesOptions:None];

[flightServiceEntities saveChanges];

4. Use the updated Booking object after the server response.

NSLog(@"Booking ID: %@", booking.m_bookid);

[booking release];

Page 11: Consuming SAP NetWeaver Gateway Services from Objective C

Copyright/Trademark

Creation of Request Body for Create Method

The Request body can be easily created by looking at the tags in the collection’s metadata. For example,

the metadata for Booking Collection provides information about the various fields (tags) that are needed

for booking:

<Property Name="carrid" Type="Edm.String" Nullable="false" MaxLength="3" sap:label="Airline" sap:filterable="false"/>

<Property Name="connid" Type="Edm.String" Nullable="false" MaxLength="4" sap:label="Flight Number" sap:filterable="false"/>

<Property Name="fldate" Type="Edm.DateTime" Nullable="false" Precision="10" sap:label="Date" sap:filterable="false"/>

<Property Name="bookid" Type="Edm.String" Nullable="false" MaxLength="8" sap:label="Booking number" sap:filterable="false"/>

<Property Name="CUSTOMID" Type="Edm.String" MaxLength="8" sap:label="Customer Number" sap:filterable="false"/>

<Property Name="CUSTTYPE" Type="Edm.String" MaxLength="1" sap:label="B/P customer" sap:filterable="false"/>

<Property Name="SMOKER" Type="Edm.String" MaxLength="1" sap:label="Smoker" sap:filterable="false"/>

<Property Name="WUNIT" Type="Edm.String" MaxLength="3" sap:label="Unit of measure" sap:filterable="false"/>

<Property Name="LUGGWEIGHT" Type="Edm.Decimal" Precision="10" Scale="4" sap:label="Luggage Weight" sap:filterable="false" sap:unit="WUNIT"/>

<Property Name="INVOICE" Type="Edm.String" MaxLength="1" sap:label="Invoice pty." sap:filterable="false"/>

<Property Name="CLASS" Type="Edm.String" MaxLength="1" sap:label="Class" sap:filterable="false"/>

<Property Name="FORCURAM" Type="Edm.Decimal" Precision="20" Scale="2" sap:label="Amount" sap:filterable="false"/>

<Property Name="FORCURKEY" Type="Edm.String" MaxLength="5" sap:label="Paymnt currency" sap:filterable="false"/>

<Property Name="LOCCURAM" Type="Edm.Decimal" Precision="20" Scale="2" sap:label="Amount" sap:filterable="false"/>

<Property Name="LOCCURKEY" Type="Edm.String" MaxLength="5" sap:label="Airline Currency" sap:filterable="false"/>

<Property Name="ORDER_DATE" Type="Edm.DateTime" Precision="10" sap:label="Booking date" sap:filterable="false"/>

<Property Name="COUNTER" Type="Edm.String" MaxLength="8" sap:label="Sales office" sap:filterable="false"/>

<Property Name="AGENCYNUM" Type="Edm.String" MaxLength="8" sap:label="Agency No." sap:filterable="false"/>

<Property Name="CANCELLED" Type="Edm.String" MaxLength="1" sap:label="Cancelation flag" sap:filterable="false"/>

<Property Name="RESERVED" Type="Edm.String" MaxLength="1" sap:label="Reserved" sap:filterable="false"/>

<Property Name="PASSNAME" Type="Edm.String" MaxLength="25" sap:label="Passenger Name" sap:filterable="false"/>

<Property Name="PASSFORM" Type="Edm.String" MaxLength="15" sap:label="Title" sap:filterable="false"/>

<Property Name="PASSBIRTH" Type="Edm.DateTime" Nullable="true" Precision="10" sap:label="DOB of Passeng." sap:filterable="false"/>

Page 12: Consuming SAP NetWeaver Gateway Services from Objective C

Copyright/Trademark

Authentication and Cookies

The authentication of the OData client using the NetWeaver service is performed using the credentials

entered in steps 1 and 2 of the Building an iOS Application procedure above.

When the credentials are successfully authenticated, a cookie is returned from the NetWeaver Gateway

service and saved in the service proxy object. When this service proxy object is used, it sends the cookie

and not the user name and password. If the cookie is not valid anymore, the credentials are sent again.

Known issues for Microsoft OData SDK V1.3

1. When the odatagen is used to generate classes for services that have a complex type inside the

FunctionImport section, the generated class inherited from the ObjectContext does not compile.

Each time the complex type name appears (in the h and m files), there is a namespace prefix missing.

For example:

- (FlightAvailability *) CheckFlightAvailabilityWithairlineid:(NSString *)airlineid

connectionid:(NSString *)connectionid flightdate:(NSDate *)flightdate;

Should be:

- (RMTAMPLEFLIGHT_FlightAvailability *) CheckFlightAvailabilityWithairlineid:(NSString

*)airlineid connectionid:(NSString *)connectionid flightdate:(NSDate *)flightdate;

For more details, refer to http://odataobjc.codeplex.com/workitem/11307

2. When reading a property of type Edm.Time, the returned value is always nil regardless of the real value

returned from the service.

For more details, refer to http://odataobjc.codeplex.com/workitem/11311

3. After adding a new object to a collection and performing saveChanges, the object is not updated with values from the server. For example, when creating a new booking object and performing saveChanges, the booking_id value returned from the service is not included in the booking object. For more details refer to http://odataobjc.codeplex.com/workitem/11310

4. When reading a property of type Edm.Byte, the returned value is always 0 regardless of the real value

returned from the service. Setting the property to 1 and performing saveChanges will cause the application to crash. For more details refer to http://odataobjc.codeplex.com/workitem/11309

5. The addHeader:headerValue: method does not work in the objectContext class.

For more details refer to http://odataobjc.codeplex.com/workitem/11308

Page 13: Consuming SAP NetWeaver Gateway Services from Objective C

Copyright/Trademark

Appendix 1 - RMTSAMPLEFLIGHT Service Metadata

Description

<?xml version="1.0" encoding="utf-8"?> <edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx" xmlns:gp="http://www.sap.com/Protocols/SAPData/GenericPlayer" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:sap="http://www.sap.com/Protocols/SAPData"> <edmx:DataServices m:DataServiceVersion="2.0"> <Schema Namespace="RMTSAMPLEFLIGHT" xmlns="http://schemas.microsoft.com/ado/2008/09/edm"> <EntityType Name="Subscription" sap:content-version="1"> <Key> <PropertyRef Name="ID"/> </Key> <Property Name="ID" Type="Edm.String" Nullable="false" MaxLength="32" sap:label="Sub. ID"

sap:filterable="false"/> <Property Name="user" Type="Edm.String" MaxLength="12" sap:label="User Name"

sap:filterable="false" m:FC_TargetPath="SyndicationAuthorName" m:FC_KeepInContent="false"/>

<Property Name="updated" Type="Edm.DateTime" Precision="19" sap:label="Time Stamp" sap:filterable="false" m:FC_TargetPath="SyndicationUpdated" m:FC_KeepInContent="false"/>

<Property Name="title" Type="Edm.String" MaxLength="255" sap:label="Title" sap:creatable="true" sap:filterable="false" m:FC_TargetPath="SyndicationTitle" m:FC_KeepInContent="false"/>

<Property Name="deliveryAddress" Type="Edm.String" sap:label="Delivery Address" sap:creatable="true" sap:filterable="false"/>

<Property Name="collection" Type="Edm.String" MaxLength="40" sap:label="Collection" sap:creatable="true" sap:filterable="false"/>

<Property Name="filter" Type="Edm.String" sap:label="Filter" sap:creatable="true" sap:filterable="false"/>

<Property Name="select" Type="Edm.String" MaxLength="255" sap:label="Select" sap:creatable="true" sap:filterable="false"/>

</EntityType> <EntityType Name="Notification" sap:content-version="1"> <Key> <PropertyRef Name="ID"/> </Key> <Property Name="ID" Type="Edm.String" Nullable="false" MaxLength="32"

sap:label="Notification ID" sap:filterable="false"/> <Property Name="collection" Type="Edm.String" MaxLength="40" sap:label="Collection"

sap:filterable="false"/> <Property Name="title" Type="Edm.String" sap:label="Notif. Text" sap:filterable="false"/> <Property Name="updated" Type="Edm.DateTime" Precision="19" sap:label="Time Stamp"

sap:filterable="false"/> </EntityType> <EntityType Name="Flight" sap:content-version="1"> <Key> <PropertyRef Name="carrid"/> <PropertyRef Name="connid"/> <PropertyRef Name="fldate"/> </Key> <Property Name="carrid" Type="Edm.String" Nullable="false" MaxLength="3"

sap:label="Airline" sap:filterable="false"/> <Property Name="connid" Type="Edm.String" Nullable="false" MaxLength="4"

sap:label="Flight Number" sap:filterable="false"/> <Property Name="fldate" Type="Edm.DateTime" Nullable="false" Precision="10"

sap:label="Date" sap:filterable="false"/>

Page 14: Consuming SAP NetWeaver Gateway Services from Objective C

Copyright/Trademark

<Property Name="PRICE" Type="Edm.Decimal" Precision="20" Scale="2" sap:label="Airfare" sap:filterable="false"/>

<Property Name="CURRENCY" Type="Edm.String" MaxLength="5" sap:label="Airline Currency" sap:filterable="false"/>

<Property Name="PLANETYPE" Type="Edm.String" MaxLength="10" sap:label="Plane Type" sap:filterable="false"/>

<Property Name="SEATSMAX" Type="Edm.Int32" sap:label="Max. capacity econ." sap:filterable="false"/>

<Property Name="SEATSOCC" Type="Edm.Int32" sap:label="Occupied econ." sap:filterable="false"/>

<Property Name="PAYMENTSUM" Type="Edm.Decimal" Precision="22" Scale="2" sap:label="Total" sap:filterable="false"/>

<Property Name="SEATSMAX_B" Type="Edm.Int32" sap:label="Max. capacity bus." sap:filterable="false"/>

<Property Name="SEATSOCC_B" Type="Edm.Int32" sap:label="Occupied bus." sap:filterable="false"/>

<Property Name="SEATSMAX_F" Type="Edm.Int32" sap:label="Max. capacity 1st" sap:filterable="false"/>

<Property Name="SEATSOCC_F" Type="Edm.Int32" sap:label="Occupied 1st" sap:filterable="false"/>

<Property Name="flightDetails" Type="RMTSAMPLEFLIGHT.FlightDetails" Nullable="false" sap:label="FlightDetails" sap:creatable="true" sap:updatable="true" sap:filterable="false"/>

<NavigationProperty Name="flightbooking" Relationship="RMTSAMPLEFLIGHT.BookingFlight" FromRole="FromRole_Flight_Booking" ToRole="ToRole_Booking_Flight"/>

<NavigationProperty Name="flightBookings" Relationship="RMTSAMPLEFLIGHT.FlightBookings" FromRole="FromRole_Flight_Booking" ToRole="ToRole_Booking_Flight"/>

</EntityType> <EntityType Name="Booking" sap:content-version="1" sap:semantics="FLIGHT_BOOKING"> <Key> <PropertyRef Name="carrid"/> <PropertyRef Name="connid"/> <PropertyRef Name="fldate"/> <PropertyRef Name="bookid"/> </Key> <Property Name="carrid" Type="Edm.String" Nullable="false" MaxLength="3"

sap:label="Airline" sap:filterable="false"/> <Property Name="connid" Type="Edm.String" Nullable="false" MaxLength="4"

sap:label="Flight Number" sap:filterable="false"/> <Property Name="fldate" Type="Edm.DateTime" Nullable="false" Precision="10"

sap:label="Date" sap:filterable="false"/> <Property Name="bookid" Type="Edm.String" Nullable="false" MaxLength="8"

sap:label="Booking number" sap:filterable="false"/> <Property Name="CUSTOMID" Type="Edm.String" MaxLength="8" sap:label="Customer Number"

sap:filterable="false"/> <Property Name="CUSTTYPE" Type="Edm.String" MaxLength="1" sap:label="B/P customer"

sap:filterable="false"/> <Property Name="SMOKER" Type="Edm.String" MaxLength="1" sap:label="Smoker"

sap:filterable="false"/> <Property Name="WUNIT" Type="Edm.String" MaxLength="3" sap:label="Unit of measure"

sap:filterable="false"/> <Property Name="LUGGWEIGHT" Type="Edm.Decimal" Precision="10" Scale="4"

sap:label="Luggage Weight" sap:filterable="false" sap:unit="WUNIT"/> <Property Name="INVOICE" Type="Edm.String" MaxLength="1" sap:label="Invoice pty."

sap:filterable="false"/> <Property Name="CLASS" Type="Edm.String" MaxLength="1" sap:label="Class"

sap:filterable="false"/> <Property Name="FORCURAM" Type="Edm.Decimal" Precision="20" Scale="2" sap:label="Amount"

sap:filterable="false"/> <Property Name="FORCURKEY" Type="Edm.String" MaxLength="5" sap:label="Paymnt currency"

sap:filterable="false"/> <Property Name="LOCCURAM" Type="Edm.Decimal" Precision="20" Scale="2" sap:label="Amount"

sap:filterable="false"/>

Page 15: Consuming SAP NetWeaver Gateway Services from Objective C

Copyright/Trademark

<Property Name="LOCCURKEY" Type="Edm.String" MaxLength="5" sap:label="Airline Currency" sap:filterable="false"/>

<Property Name="ORDER_DATE" Type="Edm.DateTime" Precision="10" sap:label="Booking date" sap:filterable="false"/>

<Property Name="COUNTER" Type="Edm.String" MaxLength="8" sap:label="Sales office" sap:filterable="false"/>

<Property Name="AGENCYNUM" Type="Edm.String" MaxLength="8" sap:label="Agency No." sap:filterable="false"/>

<Property Name="CANCELLED" Type="Edm.String" MaxLength="1" sap:label="Cancelation flag" sap:filterable="false"/>

<Property Name="RESERVED" Type="Edm.String" MaxLength="1" sap:label="Reserved" sap:filterable="false"/>

<Property Name="PASSNAME" Type="Edm.String" MaxLength="25" sap:label="Passenger Name" sap:filterable="false"/>

<Property Name="PASSFORM" Type="Edm.String" MaxLength="15" sap:label="Title" sap:filterable="false"/>

<Property Name="PASSBIRTH" Type="Edm.DateTime" Nullable="true" Precision="10" sap:label="DOB of Passeng." sap:filterable="false"/>

<NavigationProperty Name="bookedFlight" Relationship="RMTSAMPLEFLIGHT.BookingFlight" FromRole="ToRole_Booking_Flight" ToRole="FromRole_Flight_Booking"/>

</EntityType> <EntityType Name="Carrier" sap:content-version="1"> <Key> <PropertyRef Name="carrid"/> </Key> <Property Name="carrid" Type="Edm.String" Nullable="false" MaxLength="3"

sap:label="Airline" sap:filterable="false"/> <Property Name="CARRNAME" Type="Edm.String" MaxLength="20" sap:label="Airline"

sap:filterable="false"/> <Property Name="CURRCODE" Type="Edm.String" MaxLength="5" sap:label="Airline Currency"

sap:filterable="false"/> <Property Name="URL" Type="Edm.String" MaxLength="255" sap:label="URL"

sap:filterable="false"/> <NavigationProperty Name="carrierFlights" Relationship="RMTSAMPLEFLIGHT.CarrierToFlight"

FromRole="FromRole_Carrier_Flight" ToRole="ToRole_Flight_Carrier"/> </EntityType> <EntityType Name="Travelagency" m:HasStream="true" sap:content-version="1"> <Key> <PropertyRef Name="agencynum"/> </Key> <Property Name="agencynum" Type="Edm.String" Nullable="false" MaxLength="8"

sap:label="Agency No." sap:filterable="false"/> <Property Name="NAME" Type="Edm.String" MaxLength="25" sap:label="Travel agency name"

sap:filterable="false"/> <Property Name="STREET" Type="Edm.String" MaxLength="30" sap:label="Street"

sap:filterable="false"/> <Property Name="POSTBOX" Type="Edm.String" MaxLength="10" sap:label="PO Box"

sap:filterable="false"/> <Property Name="POSTCODE" Type="Edm.String" MaxLength="10" sap:label="Postal Code"

sap:filterable="false"/> <Property Name="CITY" Type="Edm.String" MaxLength="25" sap:label="City"

sap:filterable="false"/> <Property Name="COUNTRY" Type="Edm.String" MaxLength="3" sap:label="Country"

sap:filterable="false"/> <Property Name="REGION" Type="Edm.String" MaxLength="3" sap:label="Region"

sap:filterable="false"/> <Property Name="TELEPHONE" Type="Edm.String" MaxLength="30" sap:label="Tel."

sap:filterable="false"/> <Property Name="URL" Type="Edm.String" MaxLength="255" sap:label="Travel agency URL"

sap:filterable="false"/> <Property Name="LANGU" Type="Edm.String" MaxLength="2" sap:label="Language"

sap:filterable="false"/>

Page 16: Consuming SAP NetWeaver Gateway Services from Objective C

Copyright/Trademark

<Property Name="CURRENCY" Type="Edm.String" MaxLength="5" sap:label="Trav.Agency.Curr" sap:filterable="false"/>

<Property Name="mimeType" Type="Edm.String" MaxLength="128" sap:label="MIME Type" sap:filterable="false"/>

</EntityType> <ComplexType Name="FlightDetails"> <Property Name="countryFrom" Type="Edm.String" MaxLength="3" sap:label="Country"

sap:filterable="false"/> <Property Name="cityFrom" Type="Edm.String" MaxLength="20" sap:label="Depart.city"

sap:filterable="false"/> <Property Name="airportFrom" Type="Edm.String" MaxLength="3" sap:label="Dep. airport"

sap:filterable="false"/> <Property Name="countryTo" Type="Edm.String" MaxLength="3" sap:label="Country"

sap:filterable="false"/> <Property Name="cityTo" Type="Edm.String" MaxLength="20" sap:label="Arrival city"

sap:filterable="false"/> <Property Name="airportTo" Type="Edm.String" MaxLength="3" sap:label="Dest. airport"

sap:filterable="false"/> <Property Name="flightTime" Type="Edm.Int32" sap:label="Flight time"

sap:filterable="false"/> <Property Name="departureTime" Type="Edm.Time" Precision="8" sap:label="Departure"

sap:filterable="false"/> <Property Name="arrivalTime" Type="Edm.Time" Precision="8" sap:label="Arrival Time"

sap:filterable="false"/> <Property Name="distance" Type="Edm.Decimal" Precision="11" Scale="4"

sap:label="Distance" sap:filterable="false"/> <Property Name="distanceUnit" Type="Edm.String" MaxLength="3" sap:label="Distance in"

sap:filterable="false"/> <Property Name="flightType" Type="Edm.String" MaxLength="1" sap:label="Charter"

sap:filterable="false"/> <Property Name="period" Type="Edm.Byte" sap:label="n day(s) later"

sap:filterable="false"/> </ComplexType> <ComplexType Name="FlightAvailability"> <Property Name="ECONOMAX" Type="Edm.Int32" sap:label="Max. capacity econ."

sap:filterable="false"/> <Property Name="ECONOFREE" Type="Edm.Int32" sap:label="Free seats"

sap:filterable="false"/> <Property Name="BUSINMAX" Type="Edm.Int32" sap:label="Max. capacity bus."

sap:filterable="false"/> <Property Name="BUSINFREE" Type="Edm.Int32" sap:label="Free seats"

sap:filterable="false"/> <Property Name="FIRSTMAX" Type="Edm.Int32" sap:label="Max. capacity 1st"

sap:filterable="false"/> <Property Name="FIRSTFREE" Type="Edm.Int32" sap:label="Free seats"

sap:filterable="false"/> </ComplexType> <ComplexType Name="FlightAvailability2" BaseType="RMTSAMPLEFLIGHT.FlightAvailability"/> <Association Name="FlightBookings" sap:content-version="1"> <End Type="RMTSAMPLEFLIGHT.Flight" Multiplicity="1" Role="FromRole_Flight_Booking"/> <End Type="RMTSAMPLEFLIGHT.Booking" Multiplicity="*" Role="ToRole_Booking_Flight"/> </Association> <Association Name="BookingFlight" sap:content-version="1"> <End Type="RMTSAMPLEFLIGHT.Flight" Multiplicity="1" Role="FromRole_Flight_Booking"/> <End Type="RMTSAMPLEFLIGHT.Booking" Multiplicity="1" Role="ToRole_Booking_Flight"/> <ReferentialConstraint> <Principal Role="FromRole_Flight_Booking"> <PropertyRef Name="carrid"/> <PropertyRef Name="connid"/> <PropertyRef Name="fldate"/> </Principal> <Dependent Role="ToRole_Booking_Flight"> <PropertyRef Name="carrid"/>

Page 17: Consuming SAP NetWeaver Gateway Services from Objective C

Copyright/Trademark

<PropertyRef Name="connid"/> <PropertyRef Name="fldate"/> </Dependent> </ReferentialConstraint> </Association> <Association Name="CarrierToFlight" sap:content-version="1"> <End Type="RMTSAMPLEFLIGHT.Carrier" Multiplicity="1" Role="FromRole_Carrier_Flight"/> <End Type="RMTSAMPLEFLIGHT.Flight" Multiplicity="*" Role="ToRole_Flight_Carrier"/> </Association> <EntityContainer Name="RMTSAMPLEFLIGHT" m:IsDefaultEntityContainer="true"> <EntitySet Name="SubscriptionCollection" EntityType="RMTSAMPLEFLIGHT.Subscription"

sap:content-version="1"/> <EntitySet Name="NotificationCollection" EntityType="RMTSAMPLEFLIGHT.Notification"

sap:content-version="1"/> <EntitySet Name="FlightCollection" EntityType="RMTSAMPLEFLIGHT.Flight" sap:content-

version="1"/> <EntitySet Name="BookingCollection" EntityType="RMTSAMPLEFLIGHT.Booking" sap:content-

version="1" sap:semantics="FLIGHT_BOOKING"/> <EntitySet Name="CarrierCollection" EntityType="RMTSAMPLEFLIGHT.Carrier" sap:content-

version="1" sap:creatable="false" sap:updatable="false" sap:deletable="false"/> <EntitySet Name="TravelagencyCollection" EntityType="RMTSAMPLEFLIGHT.Travelagency"

sap:content-version="1" sap:searchable="true"/> <EntitySet Name="TravelAgencies" EntityType="RMTSAMPLEFLIGHT.Travelagency" sap:content-

version="1" sap:searchable="true"/> <AssociationSet Name="AssocSet_FlightBookings"

Association="RMTSAMPLEFLIGHT.FlightBookings" sap:content-version="1"> <End EntitySet="FlightCollection" Role="FromRole_Flight_Booking"/> <End EntitySet="BookingCollection" Role="ToRole_Booking_Flight"/> </AssociationSet> <AssociationSet Name="AssocSet_BookingFlight" Association="RMTSAMPLEFLIGHT.BookingFlight"

sap:content-version="1"> <End EntitySet="FlightCollection" Role="FromRole_Flight_Booking"/> <End EntitySet="BookingCollection" Role="ToRole_Booking_Flight"/> </AssociationSet> <AssociationSet Name="AssocSet_CarrierToFlight"

Association="RMTSAMPLEFLIGHT.CarrierToFlight" sap:content-version="1" sap:creatable="false" sap:updatable="false" sap:deletable="false">

<End EntitySet="CarrierCollection" Role="FromRole_Carrier_Flight"/> <End EntitySet="FlightCollection" Role="ToRole_Flight_Carrier"/> </AssociationSet> <FunctionImport Name="CheckFlightAvailability"

ReturnType="RMTSAMPLEFLIGHT.FlightAvailability" m:HttpMethod="GET" sap:action-for="RMTSAMPLEFLIGHT.Flight">

<Parameter Name="airlineid" Type="Edm.String" Mode="In"> <Documentation> <Summary/> <LongDescription>Airline</LongDescription> </Documentation> </Parameter> <Parameter Name="connectionid" Type="Edm.String" Mode="In"> <Documentation> <Summary/> <LongDescription>Flight Number</LongDescription> </Documentation> </Parameter> <Parameter Name="flightdate" Type="Edm.DateTime" Mode="In"> <Documentation> <Summary/> <LongDescription>Date</LongDescription> </Documentation> </Parameter> </FunctionImport>

Page 18: Consuming SAP NetWeaver Gateway Services from Objective C

Copyright/Trademark

<FunctionImport Name="GetAvailableFlights" ReturnType="Collection(RMTSAMPLEFLIGHT.Flight)" EntitySet="FlightCollection" m:HttpMethod="POST">

<Parameter Name="fromdate" Type="Edm.DateTime" Mode="In"> <Documentation> <Summary/> <LongDescription>Date</LongDescription> </Documentation> </Parameter> <Parameter Name="todate" Type="Edm.DateTime" Mode="In"> <Documentation> <Summary/> <LongDescription>Date</LongDescription> </Documentation> </Parameter> <Parameter Name="cityfrom" Type="Edm.String" Mode="In"> <Documentation> <Summary/> <LongDescription>Depart.city</LongDescription> </Documentation> </Parameter> <Parameter Name="cityto" Type="Edm.String" Mode="In"> <Documentation> <Summary/> <LongDescription>Arrival city</LongDescription> </Documentation> </Parameter> </FunctionImport> </EntityContainer> </Schema> </edmx:DataServices> </edmx:Edmx>

Page 19: Consuming SAP NetWeaver Gateway Services from Objective C

Copyright/Trademark

APPENDIX 2 – CODE SNIPPETS

Get Available Flights

#import "WindowsCredential.h"

#import "RMTSAMPLEFLIGHT.h"

#import "Constants.h"

WindowsCredential *credential = nil;

NSString *userName = @"UserName";

NSString *password = @"Password";

credential = [[[WindowsCredential alloc] initWithUserName:userName password:password] autorelease];

RMTSAMPLEFLIGHT *flightServiceEntities = [[RMTSAMPLEFLIGHT alloc] initWithUri:@"http://host:port/sap/opu/sdata/IWFND/RMTSAMPLEFLIGHT" credential:credential];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

[dateFormatter setDateFormat:@"yyyyMMdd"];

NSDate *dateFrom = [dateFormatter dateFromString:@"20110105"];

NSDate *dateTo = [dateFormatter dateFromString:@"20110728"];

[dateFormatter release];

flightServiceEntities.m_oDataDelegate = self;

NSArray *flights = [flightServiceEntities GetAvailableFlightsWithfromdate:dateFrom todate:dateTo cityfrom:@"NEW YORK" cityto:@"SAN FRANCISCO"];

for (RMTSAMPLEFLIGHT_Flight *flight in flights) {

NSLog(@"Carrier ID: %@", flight.m_carrid);

}

ODataDelegate implementation

- (void) onBeforeSend: (HttpRequest*)request{

[request.m_httpHeaders.m_httpHeaders addEntriesFromDictionary:[NSDictionary dictionaryWithObject:@"XMLHttpRequest" forKey:@"X-Requested-With"]];

}

- (void) onAfterReceive: (HttpResponse*)response{

}

Page 20: Consuming SAP NetWeaver Gateway Services from Objective C

Copyright/Trademark

Get Carrier by ID

#import "WindowsCredential.h"

#import "RMTSAMPLEFLIGHT.h"

#import "Constants.h"

WindowsCredential *credential = nil;

NSString *userName = @"UserName";

NSString *password = @"Password";

credential = [[[WindowsCredential alloc] initWithUserName:userName password:password] autorelease];

RMTSAMPLEFLIGHT *flightServiceEntities = [[RMTSAMPLEFLIGHT alloc] initWithUri:@"http://host:port/sap/opu/sdata/IWFND/RMTSAMPLEFLIGHT" credential:credential];

NSString *carrierById = [NSString stringWithFormat:@"CarrierCollection(carrid=\'%@\')",flight.m_carrid];

QueryOperationResponse *response = [flightServiceEntities execute:carrierById];

RMTSAMPLEFLIGHT_Carrier *carrier = [[response getResult] objectAtIndex:0];

NSLog(@"carrier name: %@",carrier.m_CARRNAME);

Create a Flight Booking

#import "WindowsCredential.h"

#import "RMTSAMPLEFLIGHT.h"

#import "Constants.h"

WindowsCredential *credential = nil;

NSString *userName = @"UserName";

NSString *password = @"Password";

credential = [[[WindowsCredential alloc] initWithUserName:userName password:password] autorelease];

RMTSAMPLEFLIGHT *flightServiceEntities = [[RMTSAMPLEFLIGHT alloc] initWithUri:@"http://host:port/sap/opu/sdata/IWFND/RMTSAMPLEFLIGHT" credential:credential];

RMTSAMPLEFLIGHT_Booking *booking = [[RMTSAMPLEFLIGHT_Booking alloc] init];

booking.m_carrid = @"AA";

booking.m_connid = @"0017";

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

[dateFormatter setDateFormat:@"yyyyMMdd"];

NSDate *date = [dateFormatter dateFromString:@"20111221"];

Page 21: Consuming SAP NetWeaver Gateway Services from Objective C

Copyright/Trademark

booking.m_fldate = date;

booking.m_CUSTOMID = @"00004617";

booking.m_PASSNAME = @"Joe Smith";

booking.m_PASSFORM = @"1234567";

booking.m_CUSTTYPE = @"P";

booking.m_WUNIT = @"KG";

booking.m_LUGGWEIGHT = [NSDecimalNumber decimalNumberWithString:@"14.4000"];

booking.m_CLASS = @"Y";

booking.m_FORCURAM = [NSDecimalNumber decimalNumberWithString:@"879.82"];

booking.m_FORCURKEY = @"USD";

booking.m_LOCCURAM = [NSDecimalNumber decimalNumberWithString:@"803.58"];

booking.m_LOCCURKEY = @"USD";

NSDate *date2 = [dateFormatter dateFromString:@"20110522"];

booking.m_ORDER_DATE = date2;

booking.m_AGENCYNUM = @"00000325";

booking.m_PASSBIRTH = [dateFormatter dateFromString:@"19901010"];

booking.m_COUNTER = @"00000000";

flightServiceEntities.m_oDataDelegate = self;

[flightServiceEntities addToBookingCollection:booking];

[flightServiceEntities setSaveChangesOptions:None];

[flightServiceEntities saveChanges];

[booking release];

[dateFormatter release];

ODataDelegate implementation

- (void) onBeforeSend: (HttpRequest*)request{

[request.m_httpHeaders.m_httpHeaders addEntriesFromDictionary:[NSDictionary dictionaryWithObject:@"XMLHttpRequest" forKey:@"X-Requested-With"]];

}

- (void) onAfterReceive: (HttpResponse*)response{

}