我开发了php应用程序,它使用cURL向api服务器发出POST请求。在编写代码之前,我用POSTMAN(合唱扩展)测试了我的请求。我提出了两个请求,第一个登录第二个getSomeData。
https://serverip/ismserver/json/authentication
Post数据
{
"username":"myName",
"password":"myPassword",
"domain":"domain"
}https://serverip/ismserver/json/devicetemplate/getDeviceTemplates
服务器保持我的会话和第二个请求工作。Post数据
{
"templateRef":{
"refUid":"bc2929cc-5825-4948-8165-7f3fa8fea561",
"refName":"Sample Template",
"refObjectType":"vs_deviceTemplate",
"refVsomUid":"daf6f543-1841-4719-ab67-ff50ca8a7387"
}
}这对邮递员来说很好。
我开始编写php代码,这次它返回。
{"status":{"errorType":"FAILURE","errorMsg":"Operation failed: SessionId is missing in the request header","errorReason":"SessionId is missing in the request header","errorReasonCode":"sessionid_not_in_header"}}另外,它不适用于RESTCLIENT(Mozilla扩展)
我的密码在下面
//---- First Login --- //
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $server."/ismserver/json/authentication/login",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST =>false,
CURLOPT_COOKIESESSION => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "{\r\n \"username\":\"".$username."\",\r\n \"password\":\"".$password."\"\r\n}",
CURLOPT_HTTPHEADER => array(
"cache-control: no-cache",
),
));
//echo $str; //test string syntax
$response = curl_exec($curl);
preg_match('/^Set-Cookie:\s*([^;]*)/mi', $content, $m);
parse_str($m[1], $cookies);
$cookie = $cookies['NAMEOFCOOKIEUNEEDHERE'];
$err = curl_error($curl);
echo "</br>Login #:</br>";
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
//---- End -> First Login --- //
//--- Second GetCameras --- //
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL =>$server."/ismserver/json/camera/getCameras",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST =>false,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "{\r\n \"filter\":{\r\n \"includeEncoderVideoPortAssociationsOnly\":false,\r\n \"includeContactClosurePortAssociationsOnly\":false,\r\n \"byNotInRecommendedFirmwareVersion\":false,\r\n \"includeSubLocations\":false,\r\n \"byObjectType\":\"device_vs_camera\",\r\n \"pageInfo\":{\r\n \"start\":0,\r\n \"limit\":100\r\n }\r\n }\r\n}",
CURLOPT_HTTPHEADER => array(
"cache-control: no-cache",
"content-type: application/json"
),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
echo "</br>GetCamerasr #:</br>";
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
//--- End -> GetCameras --- //我该怎么解决这个问题。
发布于 2016-07-25 10:35:03
// save response cookie
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
// send cookie
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);发布于 2016-07-25 09:59:50
您可以声明“服务器使我的会话和第二个请求工作”
请记住,服务器保持会话的方式是在第一次调用服务器时向您发送带有uniq会话ID的cookie。您必须存储此cookie,并在随后的所有调用中将其发送给服务器,这样服务器才能知道,它仍在与您交谈。
在代码中,您在第一次调用时保存cookie,但在第二次调用时不重新发送cookie。
通过在客户机上将CURLOPT_COOKIEJAR和CURLOPT_COOKIEFILE设置为相同的文件名,所有这些都可以通过curl自动完成。
CURLOPT_COOKIEJAR告诉curl在哪里存储电话中的cookie。CURLOPT_COOKIEFILE告诉curl在哪里可以找到cookie,这应该包括在下一个呼叫中。见手册。
这样,您就不必从响应中的标头中扩展cookie,也不必在第二次发送时创建自己的标头。
你不必使用CURLOPT_COOKIESESSION
https://stackoverflow.com/questions/38563563
复制相似问题