首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >php cURL无效sessionID

php cURL无效sessionID
EN

Stack Overflow用户
提问于 2016-07-25 09:02:18
回答 2查看 814关注 0票数 0

我开发了php应用程序,它使用cURL向api服务器发出POST请求。在编写代码之前,我用POSTMAN(合唱扩展)测试了我的请求。我提出了两个请求,第一个登录第二个getSomeData。

https://serverip/ismserver/json/authentication

Post数据

代码语言:javascript
复制
{
  "username":"myName",
  "password":"myPassword",
  "domain":"domain"
}

https://serverip/ismserver/json/devicetemplate/getDeviceTemplates

服务器保持我的会话和第二个请求工作。Post数据

代码语言:javascript
复制
{
  "templateRef":{
    "refUid":"bc2929cc-5825-4948-8165-7f3fa8fea561",
    "refName":"Sample Template",
    "refObjectType":"vs_deviceTemplate",
    "refVsomUid":"daf6f543-1841-4719-ab67-ff50ca8a7387"
  }
}

这对邮递员来说很好。

我开始编写php代码,这次它返回。

代码语言:javascript
复制
{"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扩展)

我的密码在下面

代码语言:javascript
复制
 //---- 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 --- //

我该怎么解决这个问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-25 10:35:03

代码语言:javascript
复制
// save response cookie
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
// send cookie
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
票数 -1
EN

Stack Overflow用户

发布于 2016-07-25 09:59:50

您可以声明“服务器使我的会话和第二个请求工作”

请记住,服务器保持会话的方式是在第一次调用服务器时向您发送带有uniq会话ID的cookie。您必须存储此cookie,并在随后的所有调用中将其发送给服务器,这样服务器才能知道,它仍在与您交谈。

在代码中,您在第一次调用时保存cookie,但在第二次调用时不重新发送cookie。

通过在客户机上将CURLOPT_COOKIEJARCURLOPT_COOKIEFILE设置为相同的文件名,所有这些都可以通过curl自动完成。

CURLOPT_COOKIEJAR告诉curl在哪里存储电话中的cookie。CURLOPT_COOKIEFILE告诉curl在哪里可以找到cookie,这应该包括在下一个呼叫中。见手册

这样,您就不必从响应中的标头中扩展cookie,也不必在第二次发送时创建自己的标头。

你不必使用CURLOPT_COOKIESESSION

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38563563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档