クライアントの Survey Monkey アカウントから調査データを取得しようとしましたが、データが多いほど、結果の JSON 文字列に不正な文字が導入される可能性が高くなるようです。
以下は、悪い応答で返されるもののサンプルです。すべての応答は異なり、短い要求でも失敗して失敗することがあります。
{
"survey_id": "REDACTED",
"title": "REDACTED",
"date_modified": "2014-XX-18 17:59:00",
"num_responses": 0,
"date_created": "�2014-01-21 10:29:00",
"question_count": 102
}
これがなぜ起こっているのか、私には理解できません。fields オプションのパラメーターが多いほど、不正な文字が導入されます。不正な無効な文字だけでなく、ランダムな文字がスローされることもあり、データを正しく処理できません。
oori https://github.com/oori/php-surveymonkeyによるサードパーティのSurvey MonkeyライブラリでLaravel 4を使用しています
問題を追跡する際に助けをいただければ幸いです。締め切りは非常にタイトであり、これを解決できない場合は、クライアントに CSV ファイルを手動でインポートするよう依頼する必要がありますが、これは理想的ではなく、ユーザー エラーが発生する可能性があります。
ちなみに、Survey Monkey コンソールで同じパラメーターを使用した場合、この問題が発生することはありません。
O/S: Windows 8.1 with WAMP サーバー
リクエストの実行に使用されるコード
$Surveys = SurveyMonkey::getSurveyList(array
(
'page_size' => 1000,
'fields' => array
(
'title', 'question_count', 'num_responses', 'date_created', 'date_modified'
)
));
ファサードは、 httpsSurveyMonkey
://github.com/oori/php-surveymonkey/blob/master/SurveyMonkey.class.php にある元の Survey Monkey ライブラリを統合するために使用されるカスタム パッケージです
。
生の PHP cURL リクエスト
$header = array('Content-Type: application/json','Authorization: Bearer REDACTED');
$post = json_encode(array(
'fields' => array(
'title', 'question_count', 'num_responses', 'date_created', 'date_modified'
)
));
$post = json_encode($post);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.surveymonkey.net/v2/surveys/get_survey_list?api_key=REDACTED");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_ENCODING, 'UTF-8');
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$result = curl_exec($ch);
上記のリクエストは同じ厄介な文字を返します。レスポンスを取得するために他に何も使用されていません。
次のコードを使用する
echo "\n".mb_detect_encoding($result, 'UTF-8', true);
このコードは、応答の文字セットを示しています。成功し、不正な文字が存在しない場合 (間違った場所にランダムな文字がまだ存在する場合)、実際には UTF-8 であることを返します。不正な文字が存在する場合は false が返されるため、何も返されません。出力されます。多くの場合、false が返されます。