【问题标题】:PHP: call to a REST apiPHP:调用 REST api
【发布时间】:2011-10-07 10:57:12
【问题描述】:

我正在尝试调用 vChargeBack API 以获取有关 vCenter 服务器的信息。我遇到了这个问题。

我必须在请求正文中将请求作为 XML 数据传递。而且我还必须将版本作为 URL 参数传递。我写的代码是

$xmlfile=simplexml_load_file('login.xml');
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);  
curl_setopt($ch, CURLOPT_POSTFIELDS,$xmlfile);//Passing XML file as POST field
curl_setopt($ch, CURLOPT_TIMEOUT, 10);  
curl_setopt($ch, CURLOPT_URL,"https://xx.xx.xx.xx/vCenter-CB/api/login");//Setting URL  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
curl_setopt($ch , CURLOPT_SSL_VERIFYPEER , false );//Since I am requesting https
curl_setopt($ch , CURLOPT_SSL_VERIFYHOST , false );//Since I am requesting https
curl_setopt($ch, CURLOPT_HTTPHEADER, array ('Accept: ' . $this->acceptType ));
$response=curl_exec($ch);//Getting response
$responseInfo=curl_getinfo($ch);//Getting response headers

当我执行时,我有 400 Bad Request 响应。我注意到我没有将版本作为 URL 参数发送。 它应该是 名称:版本 价值:1.5.0 我不知道如何将此版本作为 URL 参数发送。我应该将其作为 POSTFIELD 发送,那么我应该如何将 xml 文件作为请求正文发送。

请帮帮我...

问候, 斯林纳特

【问题讨论】:

  • 他们不给你一个例子吗? “URL参数”听起来你应该做https://xx.xx.xx.xx/vCenter-CB/api/login?version=1.5.0
  • 他们没有在 PHP 中给出示例,但我在 java 中有示例,他们为 PostMethod 类创建了一个对象并使用NameValuePair[] parameters = {new NameValuePair("version","1.5.0")}; post = new PostMethod(uri); post.setQueryString(parameters); 设置版本我也尝试过https://xx.xx.xx.xx/vCenter-CB/api/login?version=1.5.0,它仍然在说错误的请求。
  • 这很有用。查询字符串是 ? 之后的部分。在 url,而不是 POST 的正文中。所以你在正确的轨道上,但我不知道你做错了什么,因为我不知道这个 API 是什么,也不会阅读它的文档。
  • 我仍然无法说出我哪里出错了。请有人帮助我
  • 您没有答案的原因是您没有提供足够的信息来帮助您,即使您通过为您尝试发出的请求提供 API 规范来提供帮助,您也不太可能让某人阅读并免费为您实施。

标签: php rest restful-authentication


【解决方案1】:

Chargeback 接口不是 RESTful。它是一个 XML 门户,在文档定义的给定端点处具有资源。要登录,请填写 API_NAMESPACE 作为为您的安装提供的 XML 命名空间,API_VERSION 作为 API 版本号,TYPE(可以是“本地”或“ldap”)。 NAMEPASSWORD 应该很明显。

<Request xmlns="$API_NAMESPACE/$API_VERSION">
    <Users>
        <User>
            <Type>$TYPE</Type>
            <Name>$NAME</Name>
            <Password>$PASSWORD</Password>
        </User>
    </Users>
</Request>

https://hostname/vCenter-CB/api/login?version=$API_VERSION 生成一个 POST 请求,并将原始 POST 数据设置为上述 XML。请记住保留此请求返回后发送的会话 cookie,因为它代表您与服务器的会话。

此外,如果您使用 LDAP 登录,您可能必须在 Users 下方包含一个 LdapUsers 子元素(作为 User 元素的同级元素)以提供 LDAP 凭据。这在 VMware 的 API 编程指南中有记录。

【讨论】:

    猜你喜欢
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多