3

クライアントの 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 が返されます。

4

1 に答える 1