簡體   English   中英

PHP的URL無效的sessionID

[英]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_COOKIEJARCURLOPT_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM