-
Notifications
You must be signed in to change notification settings - Fork 347
Request and Response objects
Working with the eBay API normally involves the sending and receiving of XML, or JSON if using eBay's RESTful services. By using the SDK this is hidden from your projects and it allows you to instead work with PHP objects for both the request and the response.
Below is an example of a typical XML request to the Finding service.
<findItemsAdvancedRequest xmlns="http://www.ebay.com/marketplace/search/v1/services">
<keywords>Harry Potter</keywords>
<sortOrder>CurrentPriceHighest</sortOrder>
<outputSelector>PictureURLSuperSize</outputSelector>
<outputSelector>SellerInfo</outputSelector>
<paginationInput xmlns="http://www.ebay.com/marketplace/search/v1/services">
<pageNumber>1</pageNumber>
<entriesPerPage>10</entriesPerPage>
</paginationInput>
</findItemsAdvancedRequest>
Instead of constructing this XML you use the SDK to instantiate various objects. Information needed by the request is done by setting properties on the objects that you create. The above example would be handled by the code shown below.
<?php
use \DTS\eBaySDK\Finding\Services\FindingService;
use \DTS\eBaySDK\Finding\Types;
$service = new FindingService([
'globalId' => Constants\GlobalIds::US,
]);
$request = new Types\FindItemsAdvancedRequest();
$request->keywords = 'Harry Potter';
$request->sortOrder = 'CurrentPriceHighest';
$request->outputSelector = ['PictureURLSuperSize', 'SellerInfo'];
$request->paginationInput = new Types\PaginationInput();
$request->paginationInput->entriesPerPage = 10;
$request->paginationInput->pageNumber = 1;
Likewise, the SDK creates objects for you by parsing the XML/JSON response. The example below shows a response from the Finding service and how you would handle this in your projects.
<findItemsAdvancedResponse xmlns="http://www.ebay.com/marketplace/search/v1/services">
<ack>Success</ack>
<searchResult count="3">
<item>
<itemId>110175316136</itemId>
<title>Harry Potter and the Philosopher Stone</title>
</item>
<item>
<itemId>198120536046</itemId>
<title>Harry Potter and the Chamber of Secrets</title>
</item>
<item>
<itemId>258426506032</itemId>
<title>Harry Potter and the Prisoner of Azkaban</title>
</item>
</searchResult>
</findItemsAdvancedResponse>
// The SDK returns an object that was parsed from the XML response.
$response = $service->findItemsAdvanced($request);
// Iterate over the items returned in the response.
foreach ($response->searchResult->item as $item) {
printf(
"(%s) %s\n",
$item->itemId,
$item->title
);
}
Using the above examples the rest of this guide will explain a few things that you will need to know when working with the SDK.
Properties of the objects are named after the fields found in the offical eBay documentation. The SDK will throw a DTS\eBaySDK\Exceptions\UnknownPropertyException
if you get or set a property that does not exist.
use DTS\eBaySDK\Exceptions;
try {
$request->foo = 'foo';
} catch(Exceptions\UnknownPropertyException $e) {
// Unknown property foo
echo $e->getMessage();
}
Warning
Property names are case sensitive. The SDK will throw an exception if you use the wrong case as it will think the property does not exist. Care must be taken as the field names across the different eBay services are not consistent. As an example, the Trading service uses the field Title but the Finding service uses title.
The fields in a request and response have types, such as booleans and strings, that have been declared in the API schema. These types are mapped to their corresponding PHP types which allows the SDK to enforce that the correct type is used when assigning a value to an object's property.
// Boolean
$request->freeShipping = true;
// String
$request->keywords = "Harry Potter";
// Integer
$request->entriesPerPage = 20;
// Double/Float
$request->amount = 9.87;
// Dates can also be assigned
$request->date = new datetime('2016-01-01');
A DTS\eBaySDK\Exceptions\InvalidPropertyTypeException
is thrown if a value of the wrong type is assigned to a property.
use DTS\eBaySDK\Exceptions;
try {
$request->keywords = 123;
} catch(Exceptions\InvalidPropertyTypeException $e) {
// Invalid property type provided for keywords. Expected string but got integer
echo $e->getMessage();
}
You can disable this type checking by assigning false
to the static property \DTS\eBaySDK\Sdk::$STRICT_PROPERTY_TYPES
.
\DTS\eBaySDK\Sdk::$STRICT_PROPERTY_TYPES = false;
// No exception will be thrown.
$request->keywords = 123;
The eBay API allows some fields to be specified multiple times in the request or response.
<findItemsAdvancedRequest>
<outputSelector>PictureURLSuperSize</outputSelector>
<outputSelector>SellerInfo</outputSelector>
</findItemsAdvancedRequest>
The SDK handles these repeatable fields as arrays.
// Assign multiple values using an array.
$request->outputSelector = ['PictureURLSuperSize', 'SellerInfo'];
// Assign values one at a time.
$request->outputSelector[] = 'PictureURLSuperSize';
$request->outputSelector[] = 'SellerInfo';
// Iterate through an array in the response.
foreach ($response->searchResult->item as $item) {
printf(
"(%s) %s\n",
$item->itemId,
$item->title
);
}
// Access the first element of the array.
echo $response->searchResult->item[0]->title;
Passing an associative array when constructing an object allows you to specify multiple properties at a time. Use the property names as the keys of the array and pass in the values that you want assigned. You can nest associative arrays to assign properties of other complex properties.
// Assigning values directly to the properties.
$request = new Types\FindItemsAdvancedRequest();
$request->keywords = 'Harry Potter';
$request->categoryId = ['617', '171228'];
$request->paginationInput = new Types\PaginationInput();
$request->paginationInput->entriesPerPage = 10;
// Assigning properties during the construction.
$request = new Types\FindItemsAdvancedRequest([
'keywords' => 'Harry Potter',
'categoryId' => ['617', '171228'],
'paginationInput' => [
'entriesPerPage' => 10
]
]);
You can assign HTML to a property.
$request->Description = '<h1>Bits & Bobs</h1><p>Just some <stuff> I found.</p>';
The SDK will handle the escaping of it in the XML/JSON.
<Description>
<h1>Bits & Bobs</h1><p>Just some &lt;stuff&gt; I found.</p>
</Description>
The toArray
method returns an associate array of an object's properties. The array keys are the property names and the values are the property values.
$request = new Types\FindItemsAdvancedRequest();
$request->keywords = 'Harry Potter';
$request->categoryId = ['617', '171228'];
print_r($request->toArray());
/**
Array
(
[keywords] => Harry Potter
[categoryId] => Array
(
[0] => 617
[1] => 171228
)
)
*/
Note
The output from toArray can be passed to the constructor of a object to assign multiple properties.