如何PHP cURL到SurveyMonkey API?

Mic*_*iou 1 php curl http surveymonkey

我正在尝试使用PHP cURL从SurveyMonkey的API中检索一些数据,并且我一直收到500错误.

这是我的代码:

  $requestHeaders = array(
    'Content-Type: application/json',
    'Authorization: Bearer ' . $accessToken,
  );

  $baseUrl = 'https://api.surveymonkey.net';
  $endpoint = '/v2/surveys/get_survey_list?api_key=XXXXXXXXXXXXXX';

  $fields = array(
    'fields' => array(
      'title','analysis_url','date_created','date_modified'
    )
  );

  $fieldsString = json_encode($fields);

  $ch  = curl_init();
  curl_setopt($ch, CURLOPT_URL, $baseUrl . $endpoint);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_HTTPHEADER, $requestHeaders);
  curl_setopt($ch, CURLOPT_POST, true);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $fieldsString);

  $result = curl_exec($ch);

  curl_close($ch);
Run Code Online (Sandbox Code Playgroud)

我得到的回应是

{
    "status": 500,
    "request_id": "e0c10adf-ae8f-467d-83af-151e8e229618",
    "error": {
        "message": "Server busy, please try again later."
    }
}
Run Code Online (Sandbox Code Playgroud)

这在命令行上完美运行:

curl -H 'Authorization:bearer XXXXX' 
     -H 'Content-Type: application/json' https://api.surveymonkey.net/v2/surveys/get_survey_list/?api_key=XXXXXXXX 
--data-binary '{"fields":["title","analysis_url","date_created","date_modified"]}'
Run Code Online (Sandbox Code Playgroud)

谢谢!

Ell*_* B. 5

你很亲密,但有一些小错误.

首先,当您指定Content-Typecorrect(application/json)时,您尚未指定Content-Length.

进行此更改$requestHeaders并将其移至创建的下方$fieldsString:

$requestHeaders = array(
     'Content-Type: application/json',
     'Authorization: Bearer ' . $_GET['code'],
     'Content-Length: ' . strlen($fieldsString)
);
Run Code Online (Sandbox Code Playgroud)

其次,你已经设置CURLOPT_POST为true.这将迫使CURL将您的请求视为具有内容类型的表单POSTapplication/x-www-form-urlencoded.这将产生问题,因为SurveyMonkey期望内容类型application/json.

删除这个:

curl_setopt($ch, CURLOPT_POST, true);
Run Code Online (Sandbox Code Playgroud)

并将其替换为:

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
Run Code Online (Sandbox Code Playgroud)