2014-01-06 1 views
2

Я использую Guzzle, чтобы делать запросы к веб-сервису.Могу ли я указать заголовки Accept и Content-Type в файле маршрутов Guzzle?

У меня есть JSON-файлы, которые выглядят примерно так:

{ 
    "name": "Webservice name", 
    "apiVersion": "1.0", 
    "description": "description", 
    "operations": { 
     "commandName1": { 
      "httpMethod": "POST", 
      "uri": "some/uri/to/some/resource/{value}", 
      "summary": "description", 
      "parameters": { 
       "value": { 
        "location": "uri", 
        "description": "description" 
       } 
      } 
     }, 
     "commandName2": { 
      "httpMethod": "POST", 
      "uri": "some/uri/to/some/resource/{value}", 
      "summary": "description", 
      "parameters": { 
       "value": { 
        "location": "uri", 
        "description": "description" 
       } 
      } 
     } 
    } 
} 

и код, который использует это выглядит примерно так:

$client = new Client(); // instance of Guzzle\Service\Client 

$this->client->setDefaultOption(
    'auth', 
    array('admin', 'admin', 'Basic') 
); 

$this->client->setDefaultOption(
    'headers', 
    array('Accept' => 'text/html', 'Content-Type' => 'text/html') 
); 

$description = ServiceDescription::factory('/path/to/json/file/with/routes'); 
$client->setDescription($description); 

$params = array(
    'command.request_options' = array(
     'timeout'   => 5, 
     'connect_timeout' => 2 
    ) 
); 

$command = $client->getCommand('commandName1', $params); 
$command->prepare(); 

$client->execute($command); 

Как вы можете видеть, я указать Content-Type и Accept заголовки в PHP-коде. Есть ли способ переместить эту информацию в файл JSON и указать разные значения для каждой операции? Например: я хочу, чтобы «commandName1» имел HTML как тип содержимого, но «commandName2» имел JSON.

Я хочу сделать это, чтобы избежать много дублирования кода.

Я смотрел в Интернете и в документации Guzzle последние 2 часа и подошел пустой. Однако, на мой взгляд, документация плохо написана , и я пропустил вещи в прошлом, читая ее. Так что это очень возможно, это произошло снова.

Неужели кому-нибудь приходилось делать что-то подобное? Как вы его решили? Заранее спасибо.

= «плохо написано» Я на самом деле означает, что каждая часть неполна. Кажется, что каждая глава затрагивает тему, но НИКОГДА не предоставляет фактически полного или подробного описания параметров, методов и т. Д. Или его полных возможностей. Существует NO CODE SNIPPET, который является SSCCE, так что вы можете видеть, как он работает перед вашими глазами менее чем за 2 минуты копирования. Но это еще один вопрос ...

+0

Согласитесь с плохо написанной документацией ... – drj201

ответ

5

Я посмотрел исходный код Гузл и, действительно, нет способа добавить такую ​​информацию в файл JSON.

Однако мне удалось это изменить:

$params = array(
    'command.request_options' = array(
     'timeout'   => 5, 
     'connect_timeout' => 2 
    ) 
); 

к этому:

$params = array(
    'command.request_options' => array(
     'timeout'   => 5, 
     'connect_timeout' => 2 
    ), 
    'command.headers' => array(
     'Accept'  => 'whatever value I want', 
     'Content-Type' => 'whatever value I want' 
    ) 
); 

, и она работала.

Поскольку эта часть кода находится в отдельном/общем классе, который использует каждый другой класс, нет дублирования кода, и поэтому он работает ... вроде.