有很多这样的问题,但是这些建议没有帮助。我使用PHP的cURL访问我们公司的n-able数据库。 n-able Web界面不是n-central服务器,而是n-able提供的服务器。
我正在开展一个项目,将我们的网络服务(如Ubiquiti和N-able)整合到一个自定义的仪表板中,而不是浏览七个不同的网站。 Unifi拥有自己的API,效果很好。 N-able在API实现上有一些尝试,我已经检查过,尝试过并且失败了。
以下是项目:
github.com/N-able/API
https://github.com/Daandamhuis/N-Able-Dashboard
尝试使用PHP和cURL访问ncod51.n-able.com页面时,只加载页面底部:
<?php
$url="https://ncod51.n-able.com";
//traverse array and prepare data for posting (key1=value1)
foreach ( $post_data as $key => $value) {
$post_items[] = $key . '=' . $value;
}
//create the final string to be posted using implode()
$post_string = implode ('&', $post_items);
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url.'/IndexAction.action');
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT
5.1;
en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
curl_setopt ($ch, CURLOPT_TIMEOUT, 60);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_REFERER, $url.'loginLoginAction.action');
curl_setopt ($ch, CURLOPT_POSTFIELDS, $post_string);
curl_setopt ($ch, CURLOPT_POST, 1);
$result = curl_exec ($ch);
if (!$result) {
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch); // make sure we closeany current curl sessions
die($http_code.' Unable to connect to server. Please come back later.');
}
echo $result;
?>
实际应用程序无法加载。现在的目标是从n-able站点获取信息并将其加载到我们正在使用当前的Wamp服务器实现的php创建的接口上。
如果需要任何其他信息,请与我们联系。这是唯一正在使用的php文件,直到我可以访问。
非常感谢任何帮助!
注意:n-able站点是https站点。
答案 0 :(得分:0)
做的时候
foreach ( $post_data as $key => $value) {
$post_items[] = $key . '=' . $value;
}
当键或值包含=
字符时会发生什么?假设你的$ key是foo=bar
,而你的$值是baz=lel&what
,你最终会得到foo=bar=baz=lel&what
,这是非法的urlencoding,不要指望服务器理解它。实际上,期望服务器以HTTP 400 Bad Request
响应进行响应,因为这是一个错误的请求。正确的编码为foo%3Dbar=baz%26lel
,您在空格<
和>
以及&
和ÆØÅ
以及其他一些字符时遇到同样的问题。解决这个问题,你可以做$post_items[] = urlencode($key) . '=' . urlencode($value);
- 或者更好,用http_build_query对整个字符串进行编码,这就是它存在的原因。实际上,这个编码代码
foreach ( $post_data as $key => $value) {
$post_items[] = urlencode($key) . '=' . urlencode($value);
}
$post_string = implode ('&', $post_items);
可以替换为这一行:
$post_string=http_build_query($post_items);
那样做。另外,在调试curl代码时,启用CURLOPT_VERBOSE,它会打印许多有用的调试信息。
但你说只有页面底部加载?在curl和firefox中发布两个标题(由CURLOPT_VERBOSE打印)和加载页面的响应html,可能存在一些线索(如标题中的http错误代码?或者页面的其余部分是在html中用javascript加载?)