2012-04-13 4 views
0

Ich schrieb eine wirklich grundlegende Wrapper-Klasse für Highrise API. Es funktioniert perfekt für Lesen (GET), und ich fange gerade an, es für Creates (POST) zu testen. Soweit ich das beurteilen kann, sind diese beiden Anfragen (eine auf der Kommandozeile, eine über die cURL-Bibliothek von PHP) identisch. Gleiches XML, gleiche Optionen gesetzt ... nur eines funktioniert, das andere nicht.Warum funktioniert diese cURL-Anfrage in der Befehlszeile, aber nicht in PHP?

Jede Hilfe wird geschätzt. Ich habe diese Frage auch an 37signals Entwickler-Mailing-Liste geschrieben, aber stackoverflow ist im Allgemeinen schneller bei der Erkennung meiner dummen Fehler ...

Dies ist der Fehler, den ich mit PHP cURL (macht mich denken, Highrise hat ein Problem beim Parsen der XML-Zeichenfolge):

<?xml version="1.0" encoding="UTF-8"?> <errors> <error>First name can't be blank</error> </errors> 

Dies ist, was auf der Kommandozeile funktioniert:

curl -u 'my_api_key:X' 
    -H 'Content-type: application/xml' 
    -d '<?xml version="1.0" encoding="UTF-8"?> <person><first-name>Savos</first-name><last-name>Aren</last-name><title>Archmage</title><company-name>Winterhold College</company-name><contact-data><email-addresses/><phone-numbers><phone-number><number>555-555-5555</number><location>Home</location></phone-number><phone-number><number>555-555-5555</number><location>Work</location></phone-number><phone-number><number>555-555-5555</number><location>Mobile</location></phone-number></phone-numbers><addresses><address><city>Winterhold</city><country>Tamriel</country><state>Skyrim</state><street>Hall of the Elements, College of Winterhold</street><zip>99999</zip><location>Work</location></address></addresses></contact-data></person>' 
    https://myuserid.highrisehq.com/people.xml 

Hier ist meine Wrapper-Klasse:

class HighriseAPICall { 
    protected $_timeout = 120; 
    protected $_url_prefix = 'https://'; 
    protected $_url_suffix = '.highrisehq.com'; 
    protected $_password = 'X'; 

    protected $_userpwd; 
    protected $_url; 

    public function __construct($api_key, $username) { 
     $this->_userpwd= $api_key . ':' . $this->_password; 
     $this->_url = $this->_url_prefix . $username . $this->_url_suffix; 
    } 

    /** 
    * Make the specified API call. 
    * @param string $action one of the four HTTP verbs supported by Highrise 
    * @param string $resource_name the Highrise resource to be accessed 
    * @param string $xml a well-formed XML string for a Highrise create, update, or delete request 
    * 
    * $xml parameter should include any query parameters as suggested by Highrise API documentation 
    * eg, if you want to GET all People, pass in "/people.xml" 
    * and if you want to get People by search term where field=value, 
    * then pass in "/people/search.xml?criteria[field]=value" 
    */ 
    public function makeAPICall($action,$resource_name,$xml=null) { 
     /* initialize curl session and set defaults for new API call */ 
     $curl = curl_init(); 
     curl_setopt($curl, CURLOPT_URL, $this->_url . $resource_name); 
     curl_setopt($curl, CURLOPT_USERPWD, $this->_userpwd); 
     curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
     curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $this->_timeout); 
     /* if xml was passed in, set header and postfields */ 
     if (isset($xml)) { 
      curl_setopt($curl, CURLOPT_HTTPHEADER, 'Content-type: application/xml'); 
      curl_setopt($curl, CURLOPT_POSTFIELDS, "$xml"); 
     } 
     /* set action as custom request */ 
     curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $action); 
     /* get the string response from executing the curl session */ 
     $result = curl_exec($curl); 
     curl_close($curl); 

     // return the response as a simpleXMLElement 
     try { 
       $result_simplexml = new SimpleXMLElement($result); 
     } 
     catch (Exception $e) { 
       throw new Exception("Highrise API Call Error: " . $e->getMessage() . ", Response: " . $result); 
     } 
     if (!is_object($result_simplexml)) { 
       throw new Exception("Highrise API Call Error: Could not parse XML, Response: " . $result); 
     } 
     return $result_simplexml; 
    } 

} 
?> 

Und die einfache Testseite Ich verwende:

<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title></title> 
    </head> 
    <body> 
     <?php 
      require_once('HighriseAPICall.class.php'); 
      $highrise_api_key = 'OBSCURED'; 
      $highrise_username = 'OBSCURED'; 
      $highrise_api = new HighriseAPICall($highrise_api_key, $highrise_username); 

      $person_xml ='<?xml version="1.0" encoding="UTF-8"?> <person><first-name>Savos</first-name><last-name>Aren</last-name><title>Archmage</title><company-name>Winterhold College</company-name><contact-data><email-addresses/><phone-numbers><phone-number><number>555-555-5555</number><location>Home</location></phone-number><phone-number><number>555-555-5555</number><location>Work</location></phone-number><phone-number><number>555-555-5555</number><location>Mobile</location></phone-number></phone-numbers><addresses><address><city>Winterhold</city><country>Tamriel</country><state>Skyrim</state><street>Hall of the Elements, College of Winterhold</street><zip>99999</zip><location>Work</location></address></addresses></contact-data></person>'; 

      $response = $highrise_api->makeAPICall('POST', '/people.xml', $person_xml); 
      echo htmlentities($response->asXML()); 
     ?> 
    </body> 
</html> 
+0

Könnten Sie die Option d und CURLOPT_WRITEHEADER von curl verwenden, um die Header in beiden Fällen auszugeben und sie hier zu posten? –

+0

@ SebastiánGrignoli, habe das gerade gesehen. Ich werde das Montagmorgen tun, danke für den Tipp. Aus anderen Lektüren, denke ich, könnte das sein, wo das Problem liegt. –

Antwort

1

In meiner Wrapper-Klasse, die Zeile:

curl_setopt($curl, CURLOPT_HTTPHEADER, 'Content-type: application/xml'); 

sollte sein:

curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-type: application/xml')); 
2

versuchen, diese Linien statt, was Sie in Ihrem Skript haben

if (isset($xml)) { 
     curl_setopt($curl, CURLOPT_POST, true); 
     curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-type: application/xml')); 
     curl_setopt($curl, CURLOPT_POSTFIELDS, $xml); 
     curl_setopt($curl, CURLOPT_SSL_VERIFYPEER,false); 
     curl_setopt($curl, CURLOPT_SSL_VERIFYHOST ,false); 
    } 
+0

Ich habe das schon versucht und dachte, es sei ein Problem mit der Kundenanfrage. Ich habe es gerade noch einmal gemacht, um nochmals zu überprüfen, die Kundenanforderung der Zeileneinstellung zu übernehmen und eine Zeile hinzuzufügen, um CURL_POST auf true zu setzen, aber nichts hat sich geändert, der gleiche Fehler. –

+0

Was ist der Fehler, den Sie bekommen? fügen Sie diese Zeile nach der 'curl_exec' Zeile hinzu: ' if ($ result === false) die (curl_error ($ curl)); ' –

+0

Der Fehler, den ich bekomme, ist die erste Zeile von XML in meinem ursprünglichen Beitrag. –

Verwandte Themen