使用PHP连接到vCenter REST API

使用PHP连接到vCenter REST API,php,rest,curl,vmware,vcenter,Php,Rest,Curl,Vmware,Vcenter,我正在尝试使用PHP7从VMware vCenter v6.5获取虚拟机信息。我从curl_getinfo收到错误代码400 我从这篇文章中复制了此代码: 我已经在命令行中尝试过了,并且能够获得会话ID,因此我知道服务器正在按其应该的方式发送信息,只是没有发送到PHP网页 以下命令的参考: 我希望$out->value的输出将是会话ID,而不是NULL。谢谢你的帮助,谢谢 我最好的猜测是VCenter会阻止没有用户代理头的请求,curl cli会自动添加这样的头,但libcurl/php的lib

我正在尝试使用PHP7从VMware vCenter v6.5获取虚拟机信息。我从curl_getinfo收到错误代码400

我从这篇文章中复制了此代码:

我已经在命令行中尝试过了,并且能够获得会话ID,因此我知道服务器正在按其应该的方式发送信息,只是没有发送到PHP网页

以下命令的参考:


我希望$out->value的输出将是会话ID,而不是NULL。谢谢你的帮助,谢谢

我最好的猜测是VCenter会阻止没有用户代理头的请求,curl cli会自动添加这样的头,但libcurl/php的libcurl包装器不会。试一试

User-Agent: php/7.1.16 libcurl/7.59.0
然后你会得到类似于

curl -X POST \
  https://<your_vcenter>/rest/com/vmware/cis/session \
  -H 'Accept: application/json' \
  -H 'Authorization: Basic <encoded_password...see *1)' \
  -H 'Content-Type: application/json' \
  -H 'vmware-use-header-authn: SomerandomValue'

*1 => https://en.wikipedia.org/wiki/Basic_access_authentication**


这是真实的:

使用curl,您可以通过以下方式连接:

{
    "value": "vmware-api-session-id"
}
使用此id,您可以执行以下操作:

{
    "value": [
        {
            "host": "host-1",
            "name": "esx01.your.domain",
            "connection_state": "CONNECTED",
            "power_state": "POWERED_ON"
        },
        {
            "host": "host-2",
            "name": "esx02.your.domain",
            "connection_state": "CONNECTED",
            "power_state": "POWERED_ON"
        }
    ]
}

http 400错误是由以下标头引起的:

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
用这个替代它解决了这个问题:


谢谢hanshenrik。我已经添加了这一点,现在它确实在标题中显示了User-Agent:php/7.2.14 libcurl/7.29.0,但仍然没有得到很好的响应。粘贴curl_dump以防有用:@SuperDogStar-hmm。。。如果在curl命令中添加-verbose,会得到什么标题?问题是否与标题中的内容长度:-1有关?还有一条额外的线路,我不确定它是从哪里来的。从PHP代码粘贴到这里的Curl_dump:好的,用verbose运行。我还不得不在命令行末尾添加-unsecure以绕过SSL检查,忘记了在上面添加它。在curl命令行上使用-verbose的结果可以在这里找到:pastebin.com/pswSYk3bdid您解决过这个问题吗?@VladoPortos-是的,我能够完美地完成这个任务。我相信这是因为我使用的标题有问题。同样,我让它工作。。。现在,我在试图从/mob请求票证时遇到了一个问题,这让我大吃一惊……method=acquireTicket失败,检测到可能存在XSRF跨站点请求伪造,我无法通过:
{
    "value": "vmware-api-session-id"
}
curl -X GET \
  https://<your_vcenter>/rest/vcenter/host \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -H 'vmware-api-session-id: vmware-api-session-id' \
  -d '{
    "filter": {
    }
}'
{
    "value": [
        {
            "host": "host-1",
            "name": "esx01.your.domain",
            "connection_state": "CONNECTED",
            "power_state": "POWERED_ON"
        },
        {
            "host": "host-2",
            "name": "esx02.your.domain",
            "connection_state": "CONNECTED",
            "power_state": "POWERED_ON"
        }
    ]
}
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');