[英]php cURL invalid sessionID
我開發的PHP應用程序使用cURL向api服務器發出POST請求。 在編碼之前,我使用POSTMAN(Chorme Extension)測試了我的請求。 我提出了2個請求,第一次登錄,第二次獲取getSomeData。
https:// serverip / ismserver / json / authentication
發布數據
{
"username":"myName",
"password":"myPassword",
"domain":"domain"
}
https:// serverip / ismserver / json / devicetemplate / getDeviceTemplates
服務器保持我的會話,第二個請求正常工作。 發布數據
{
"templateRef":{
"refUid":"bc2929cc-5825-4948-8165-7f3fa8fea561",
"refName":"Sample Template",
"refObjectType":"vs_deviceTemplate",
"refVsomUid":"daf6f543-1841-4719-ab67-ff50ca8a7387"
}
}
使用Postman可以很好地工作。
我開始編寫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 Firefox Extenision)上使用
我的代碼如下
//---- 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 --- //
我該如何解決。
您聲明“ 服務器保留我的會話,第二個請求有效 ”
請記住,服務器與您保持會話狀態的方式是,在您第一次致電服務器時,將帶有uniq會話ID的cookie發送回給您。 您必須存儲此cookie,然后在所有后續調用中將其發送到服務器,以便服務器可以知道它仍在與您交談。
在您的代碼中,您將在第一次調用時保存cookie,但不會在第二次調用時重新發送它。
通過將CURLOPT_COOKIEJAR
和CURLOPT_COOKIEFILE
為客戶端上的相同文件名,可以使用curl自動完成所有這些操作。
CURLOPT_COOKIEJAR
告訴curl從哪里將cookie存儲在哪里。 CURLOPT_COOKIEFILE
告訴curl在哪里可以找到cookie,該cookie應該包含在下一個調用中。 參見手冊 。
這樣,您不必從響應中的標頭中提取Cookie,也不必在第二次發送時創建自己的標頭。
您不必使用CURLOPT_COOKIESESSION
// save response cookie
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
// send cookie
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.