使用PHP连接到vCenter REST API
我正在尝试使用PHP7从VMware vCenter v6.5获取虚拟机信息。我从curl_getinfo收到错误代码400 我从这篇文章中复制了此代码: 我已经在命令行中尝试过了,并且能够获得会话ID,因此我知道服务器正在按其应该的方式发送信息,只是没有发送到PHP网页 以下命令的参考:使用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
我希望$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');