Я пытаюсь вызвать службу на основе Java, которая использует объект-манипулятор Jackson из приложения PHP (Magento). В обоих из них я отправляю одни и те же заголовки и одинаковые параметры, но вызов CURL отлично работает там, где сбой PHP-вызова с последующим сообщением,
'No content to map to Object due to end of input'
Мой локон выглядит следующим образом:
curl -v -k -X POST -H "Content-Type:application/json;charset=UTF-8" -d '{"name":"john","email":"john@doe.com"}' https://localhost:8080/webapps/api/
Запрос PHP выглядит следующим образом:
$iClient = new Varien_Http_Client(); $iClient->setUri('https://localhost:8080/webapps/api/') ->setMethod('POST') ->setConfig(array( 'maxredirects'=>0, 'timeout'=>30, )); $iClient->setHeaders($headers); $iClient->setParameterPost(json_encode(array( "name"=>"John", "email"=>"john@doe.com" ))); $response = $iClient->request();
-$iClient = new Varien_Http_Client(); $iClient->setUri('https://localhost:8080/webapps/api/') ->setMethod('POST') ->setConfig(array( 'maxredirects'=>0, 'timeout'=>30, )); $iClient->setHeaders($headers); $iClient->setParameterPost(json_encode(array( "name"=>"John", "email"=>"john@doe.com" ))); $response = $iClient->request();
Я не являюсь владельцем java-сервиса, использующего карту-манипулятор Jackson, поэтому я понятия не имею, что происходит с другой стороны
Любые предложения по отладке или исправлению этого будут оценены
Ну, наконец, это сработало. Проблема была в неправильной реализации в конце кода, если вы ссылаетесь на Zend_Http_Client
. Пожалуйста, обратитесь к приведенным ниже методам из Zend_Http_Client,
/** * Set a POST parameter for the request. Wrapper around _setParameter * * @param string|array $name * @param string $value * @return Zend_Http_Client */ public function setParameterPost($name, $value = null) { if (is_array($name)) { foreach ($name as $k => $v) $this->_setParameter('POST', $k, $v); } else { $this->_setParameter('POST', $name, $value); } return $this; } /** * Set a GET or POST parameter - used by SetParameterGet and SetParameterPost * * @param string $type GET or POST * @param string $name * @param string $value * @return null */ protected function _setParameter($type, $name, $value) { $parray = array(); $type = strtolower($type); switch ($type) { case 'get': $parray = &$this->paramsGet; break; case 'post': $parray = &$this->paramsPost; break; } if ($value === null) { if (isset($parray[$name])) unset($parray[$name]); } else { $parray[$name] = $value; } }
Таким образом, setParameterPost как-то чтит только параметры массива (пары значений ключа), а моя полезная нагрузка POST была json-строкой. Поэтому, чтобы решить проблему, я изменил код, как показано ниже,
$iClient = new Varien_Http_Client(); $iClient->setUri('https://localhost:8080/webapps/api/') ->setMethod('POST') ->setConfig(array( 'maxredirects'=>0, 'timeout'=>30, )); $iClient->setHeaders($headers); $iClient->setRawData(json_encode(array( "name"=>"John", "email"=>"john@doe.com" )), "application/json;charset=UTF-8"); $response = $iClient->request();
-$iClient = new Varien_Http_Client(); $iClient->setUri('https://localhost:8080/webapps/api/') ->setMethod('POST') ->setConfig(array( 'maxredirects'=>0, 'timeout'=>30, )); $iClient->setHeaders($headers); $iClient->setRawData(json_encode(array( "name"=>"John", "email"=>"john@doe.com" )), "application/json;charset=UTF-8"); $response = $iClient->request();
Это решило проблему. Я не уверен в лучшем способе, но если что-то лучше будет рад его использовать.