在PHP中转换REST的Python代码

时间:2013-04-26 11:22:58

标签: php python rest

再一次,我需要你的帮助。我的客户希望使用REST服务器进行一些数据加密。我已经获得了Python中的代码片段。 (我不懂Python,所以我会相信他的话)。我需要让它在PHP中运行。

注意:我正在使用Windows和XAMPP,因此如果您考虑到这一点,我们将不胜感激。 REST服务器也不是真正的服务器,我不希望这个公开。

我是使用cURL的新手,所以不确定我错过了什么让它工作。现在我有一个错误,指出:“无法解析主机:en.tty.is;没有请求类型的数据记录”。

这是Python代码:

input = urllib.urlencode({‘plaintext’: ‘some secret information’})
cyphertext = urllib2.urlopen(‘https://en.tty.is/encrypt’, input).read()

以下是我用PHP中的cURL 7.24.0尝试实现的目标:

$url ="https://en.tty.is/encrypt";
            $data = json_encode(array('plaintext'=>$txt));

            $ch = curl_init();
            curl_setopt($ch,CURLOPT_URL,$url);
            curl_setopt ($ch, CURLOPT_CAINFO, MY_CAINFO_PATH);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);   
            curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS,$data);

            $chleadresult = curl_exec($ch);
            $chleadapierr = curl_errno($ch);
            $chleaderrmsg = curl_error($ch);
            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            curl_close($ch);

            if(!$chleadresult){ 
                echo $chleaderrmsg;die;
            }

非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:2)

您的代码可能存在其他问题,但至少您的PHP和Python不相同。

阅读urllib.urlencodeurllib2.urlopen的文档。这些都不是在操纵JSON。

这两行Python 大致等同于这个PHP:

$input = http_build_query(array('plaintext'=>'some secret information'));
$ctx_post_input = stream_context_create(array(
    'http' => array(
        'method' => 'POST',
        'header' => 'Content-type: application/x-www-form-urlencoded',
        'content'   => $input,
    ),
));
$cyphertext = file_get_contents('https://en.tty.is/encrypt', false, $ctx_post_input);

有关$ctx_post_input['http']的结构,请参阅the http context options

如果您需要使用CURL而不是http流类型,您可以轻松地将其转换为适当的CURL选项。

那就是说,你的实际错误是Could not resolve host: en.tty.is,这意味着en.tty.is不存在。但是你说这不是真正的服务器,所以这可能是一个虚假的错误。