2

PHP(Magento)アプリケーションからJacksonオブジェクトマッパーを使用するJavaベースのサービスを呼び出そうとしています。どちらも同じヘッダーと同じパラメーターを送信していますが、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();

私はジャクソンオブジェクトマッパーを使用するJavaサービスの所有者ではないので、反対側で何が起こるかわかりません

これをデバッグまたは修正するための提案をいただければ幸いです

4

1 に答える 1

0

さて、ついにこれが機能しました。を参照すると、問題はコードの最後にある間違った実装にありました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();

これで問題は解決しました。他に良い方法は無いと思いますが、何か良い方法があれば是非利用したいです。

于 2013-03-04T09:13:58.003 に答える