API Reference - Examples

By Engineering SpecialOps

API Sections

Introduction
Contacts
Companies
Project Blogs
Activity Reports
Examples

Example using XML, JSON, Form Encoded

Every kind of item can be created, updated or destroyed with three supported Content-Type formats: XML, JSON and Form-Encoded.  The following example of creating web site activity for a contact demonstrates each format.

XML

<?xml version="1.0" encoding="utf-8"?>
<request>
  <
parent>{parentId}</parent>
    <
data>
        <
caption>website created from api</caption>
        <
url>http://test.site.com</url>
    
</data>
</
request

JSON:

{"parent":"{parentId}","data":{"caption":"website created from api","url":"http:\/\/test.site.com"}} 

Form-encoded (provided by html form):

parent={parentId}&data%5Bcaption%5D=website+created+from+api&data%5Burl%5D=http%3A%2F%2Ftest.site.com 

Example of Batch Processing Activities

This example demonstrates filtering Project Blogs by category tags then adding six new Section activities for each one if they don’t already exist.  Most of the example code is for handling communication with the server; the actual API logic is at the end and is fairly small.

<?php
    ini_set
('display_errors''1');
    
error_reporting(E_ALL);
    
define('USER''{userEmail}');
    
define('TOKEN''{userApiToken}');
    
define('HOST''https://secure.solve360.com');
    
define('TIMEOUT'30);
    
    
define('SECTION_TYPE_ID'57);
    
    
/*
     * Helper functions
     */
    
    /**
     * Helper function to convert our data array into xml format
     *
     * @param array $data
     * @param SimpleXmlElement $xml
     * @return XML
     */
    
function arrayToXml($data$xml null)
    
{
        
if ($xml == null{
            $xml 
simplexml_load_string('<?xml version="1.0" encoding="utf-8"?><data />');
        
}
        
foreach($data as $key => $value{
            
if (is_array($value)) {
                    $node 
$xml->addChild($key);
                
arrayToXml($value$node);
            
else {
                    $xml
->addChild($key$value);
            
}
        }
        
        
return $xml->asXML();
    
}

    
/**
     * Function that makes request to the api and return xml response
     *
     * @param string $uri
     * @param string $restVerb
     * @param array $data
     * @return SimpleXmlElement
     */
    
function getXmlResponse($uri$restVerb$data = array())
    
{
        
// Connect to the host
        
$errno null;
        
$errstr null;
        
$fp stream_socket_client("tcp://".HOST.":80"$errno$errstrTIMEOUT);
        
        if (!
$fp{
            
die("cannot connect to host " HOST);
        
else {
            
if (empty($data)) {
                $data 
'';
            
else {
                $data 
arrayToXml($data);
            
}
        }
        
        
// Prepare request body
        
$request "$restVerb $uri HTTP/1.1\r\n";
        
$request .= "Host: ".HOST."\r\n";
        
// Authorization header
        
$request .= "Authorization: Basic ".base64_encode(USER.":".TOKEN)."\r\n";
        
// We inform the server that we're sending data in xml format
        
$request .= "Content-Type: application/xml\r\n";
        
// We inform the server theat we are waiting for xml in response
        
$request .= "Accept: application/xml\r\n";
        
$request .= "Content-Length: ".strlen($data)."\r\n";
        
$request .= "Connection: close\r\n\r\n";
        
$request .= $data;
        
//echo $request;
        // Send request to the host
        
fwrite($fp$request); 
        
        
$result '';
        
stream_set_timeout($fpTIMEOUT);
        
$info stream_get_meta_data($fp);
        while (!
feof($fp) && !$info['timed_out']{
            $newLine 
stream_get_line($fp1024);
            if (
trim($newLine"\r\n ") === '0'{
                
break;
            
}
            $result 
.= $newLine;
            
$info stream_get_meta_data($fp);
        
}
        
        $headers 
substr($result0strpos($result"\r\n\r\n"));
        
$body substr($result, (strpos($result"\r\n\r\n") + 4));
        
$headers explode("\r\n"$headers);
        
        
// Get xml from response
        
$matches = array();
        
preg_match("/(<.*>)/s"$body$matches);
        
$xml $matches[1];

        if (
$xml{
            $xml 
simplexml_load_string($xml);
        
else {
            
// Something went wrong and we haven't got xml in the response
            
die('System error');
        
}

        
return $xml;
    
}
    
    
/*
     * Sections example main code
     */

    // We need to know how many blogs we have
    
$limit = (int) getXmlResponse('/projectblogs/''GET', array('limit' => 1))->count;

    
// Let's define categories ids for search
    
$categoriesIds = array({categoryId}{categoryId}); // NOTE: replace categories ids with yours!
    
    // Compose search options
    
$searchOptions = array(
        
'limit'       => $limit// we want to get all blogs that are needed at once
        
'filterMode'  => 'category'// we need data filtered by category
        
'filterValue' => implode(','$categoriesIds), // cagegories ids as value for filter
        
'special'     => 'AND'// we need both categories to be set for a blog
    
);
    
    
// Get xml with search results
    
$resultXml getXmlResponse('/projectblogs/''GET'$searchOptions);

    
// Quite if there was an error
    
if ($resultXml->status != 'success'{
        mail
(USER'Error while working with Solve360''Error: ' $resultXml->errors->asXml());
        die(
'Error while working with Solve360');
    
}

    
if (count($resultXml) > 2// If there are some blogs for our search conditions

        // Let's select blog ids for adding activities sections
        
$blogsIds = array();
        foreach (
$resultXml as $projectBlog{
            
if (isset($projectBlog->id)) // if it is not count or status field
                
$blogsIds[] = (int) $projectBlog->id;
            
}
        }

        
// Prepare sections titles
        
$sections = array(
            
'Calendar',
            
'Upcoming',
            
'Active',
            
'For Managment / Client Liason',
            
'For Booking Agents',
            
'Archive'
        
);
        
        
// To save the order, reverse the array
        
$sections array_reverse($sections);

        foreach (
$blogsIds as $blogId{
            $sectionsToAdd 
$sections;

            
// We should check if the seaction already exists
            
$blog getXmlResponse('/projectblogs/' . (string) $blogId'GET');
            foreach ((array) 
$blog->activities as $blogActivity{
                
if ((int) $blogActivity->typeid == SECTION_TYPE_ID{
                    
foreach ($sectionsToAdd as $sectionKey => $sectionTitle{
                        
if ((string) $blogActivity->fields->title == $sectionTitle{
                            
unset($sectionsToAdd[$sectionKey]);
                        
}
                    }
                }
            }

            
// Add activities to the blog
            
foreach ($sectionsToAdd as $sectionTitle{
                
(getXmlResponse('/projectblogs/separator/''POST', array(
                    
'parent' => $blogId
                    
'data'   => array('title' => $sectionTitle)
                )));
            
}
        }
        
        
echo 'success';