Отправить XML через Put с CakePHP - PullRequest
4 голосов
/ 10 января 2012

Я хочу отправить запрос на поставку в API, который хочет узнать подробности запроса в виде XML

Очевидно, мне нужно отправить XML в виде файла при использовании PUT с PHP.

Как я могу это сделать?

Вот что я пытаюсь:

$HttpSocket = new HttpSocket();
$result = $HttpSocket->put($put, $fh);

где $ put - это URL-адрес, а $ fh - файл, который я создал на лету, вот так

$xmlObject = Xml::fromArray($xmlArray);
$xmlString = $xmlObject->asXML();

$fh = fopen('php://memory', 'rw');  
fwrite($fh, $xmlString);  
rewind($fh);  

Ответы [ 2 ]

3 голосов
/ 19 января 2012

Я тестировал его на торте 2.0.5, и HttpSocket :: put может отправлять массивы значений ключей или необработанные строки в виде постданных.

Итак, вы можете отправить строку xml напрямую, и удаленный сервер прочитает ее в Raw Post Data i. е. file_get_contents("php://input")

Это работает:

$http = new HttpSocket();
$xml_data = Xml::fromArray($data);
$xml_string = $xml_data->asXML();
$response = $http->put('http://example.com', $xml_string);

Чтобы продемонстрировать это, я создал контроллер с именем RequestXmlTestController, поданный в 'Controllers/RequestXmlTestController.php' (код ниже), и пустой вид, поданный в 'RequestXmlTests/index.ctp'

Код контроллера:

<?php
App::uses('AppController', 'Controller');
/**
 * RequestXmlTest Controller
 *
 */
class RequestXmlTestController extends AppController {
/**
 * Use no Model
 */
  public $uses = array();

/**
 * index action
 */
  public function index(){
    App::uses('HttpSocket', 'Network/Http');
    App::uses('Xml', 'Utility');
    $http = new HttpSocket();

    $data = array(
      'type' => array('name' => 'Campaign', 'data' => array(
        array('name' => 'Come eat at Joe\'s', 'products' => array('adserver', 'analytics'))
      ))
    );
    $xml_data = Xml::fromArray($data);
    $xml_string = $xml_data->asXML();
    $response = $http->put(Router::url(array('action' => 'test'), true), $xml_string);
    debug($response);
  }

/**
 * test action
 *   Test the requests and dump Raw Post Data and Cake's Request object
 */
  public function test(){
    var_dump(array('raw_post_data' => file_get_contents("php://input")));
    echo "\n\n";
    var_dump($this->request);
    exit;
    $this->render('index');
  }

}

Ссылка: HttpSocket Documentation

0 голосов
/ 20 января 2012

Я закончил тем, что делал это, используя php, а не php помощники

# write data into a temporary file
$putData = "<subscription><productPath>$new_product_path</productPath></subscription>";
$putDataFile = tmpfile();
fwrite($putDataFile, "<subscription><productPath>$new_product_path</productPath></subscription>");
fseek($putDataFile, 0);

# initialize PUT call
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://api.example.com");
curl_setopt($ch, CURLOPT_PUT, true);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/xml"));
curl_setopt($ch, CURLOPT_INFILE, $putDataFile);
curl_setopt($ch, CURLOPT_INFILESIZE, strlen($putData));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

# executes PUT call and clean up
$result = curl_exec($ch);
$info = curl_getinfo($ch);
fclose($putDataFile);
curl_close($ch);

Я бы предпочел использовать классы Cake для аккуратности, но это работает с API, который я использовал.

...