【问题标题】:PHP Post Request (CURL, JSON) not WorkingPHP 发布请求(CURL、JSON)不工作
【发布时间】:2020-08-14 05:17:28
【问题描述】:

在我的这个问题上,我谦卑地来到伟大的开发者面前。向 Firebase 发送 JSON 格式的发布请求。这是我的代码

$token = $_SESSION['token'];
$data = array(
    'id' => 156,
    'quizName' => $quizName,
    'numberOfQuestions' => $numberOfQuestions, 
    'isTimed' => true,                         
    'numberOfMinutesToComplete' => $numberOfMinutesToComplete,
    'targetedClass' => 'Js One',
    'subject' => $subject_name,
    'schoolLevel' => $schoolLevel,
    'questions' => array('question' => $question, 'questionMark' => $marks, 
        'options' => array('option' => 'A', 'answer'=> $optionA, 'option' => 'B', 'answer'=> $optionB, 'option' => 'C', 'answer' => $optionC, 'option' => 'D', 'answer' => $optionD, 'option' => 'E', 'answer' => $optionE),
        'hasImage' => true,
        'images' => array('images-1' => 'image-1', 'images-2' => 'image-2'),
        'correctionOption' => $correct_option
    ),
    'totalValidMarks' => $totalValidMarks,
    'validUntil' => $validUntil
);

// API URL
$url = ' ';
// Create a new cURL resource
$ch = curl_init( $url );
# Setup request to send json via POST.
$payload = json_encode( array( "customer"=> $data ) );
curl_setopt( $ch, CURLOPT_POSTFIELDS, $payload );
curl_setopt( $ch, CURLOPT_HTTPHEADER, array('x-access-token:'.$token, 'Content-Type:application/json'));
# Return response instead of printing.
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
# Send request.
$result = curl_exec($ch);
curl_close($ch);
# Print response.

echo "<pre>$result.</pre>";

但我收到一个错误:

"details":[{"message":"\"id\" is required","path":["id"],"type":"any.required","context":{"label ":"id","key":"id"}}]}

【问题讨论】:

  • 能否请您链接到 API 文档?有没有可以用来代替 cURL 的 PHP SDK?
  • 您建议使用哪个 SDK?
  • 这取决于您尝试使用的 Firebase 服务,这就是我要求提供文档链接的原因
  • 对不起,我没有及时收到。这就是 API 主体

标签: php json api curl


【解决方案1】:

请尝试这样发送:

    $params = $myDataArray;
    $data_string = json_encode($params);
    $curl = curl_init();
    curl_setopt_array($curl, array(
        CURLOPT_URL => $toEndPoint,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_POSTFIELDS => $data_string,
        CURLOPT_HTTPHEADER => array(
            "x-access-token: $token",
            "cache-control: no-cache",
            "content-type: application/json",
        ),
    ));

    $response = curl_exec($curl);
    $err = curl_error($curl);
    curl_close($curl);
    if ($err) {
        echo "cURL Error #:" . $err;
    } else {
        echo $response;
    }
    exit;

【讨论】:

  • 谢谢,没有更多错误,但数据没有发布到 firebase。如何添加内容长度标头?
  • 如果您使用 CURLOPT_POSTFIELDS 发布数据 curl。然后curl会自动加上header的数据长度。 **这里提到了when CURLOPT_HTTPHEADER need Content-Length
  • 它仍然没有发布。你认为我的 $data 数组有问题吗?
  • 它实际上抛出了一个错误:问题必须是一个数组
  • 您是否尝试将此数据发布到您托管的 url 以验证它是否真的在发布?在我的终点,一切正常
【解决方案2】:

@godlovesme,回答您的最新评论:

我不太喜欢使用 While 循环,因为它们很容易让你陷入无限循环,但你会得到你想要的:

$i = 0;
$questionsArrFormatted = [];
while ($i < count($questionsArr)) {
    $hasImage = count($questionsArr[$i]['question']) ? true : false;
    $questionsArrFormatted[$i] = [
        'question' => $questionsArr[$i]['question'],
        'questionMark' => $questionsArr[$i]['marks'],
        'options' => $questionsArr[$i]['options'], // options should be an array formatted like in your question
        'hasImage' => $hasImage,
        'images' => $questionsArr[$i]['images'],
        'correctionOption' => $questionsArr[$i]['correct_answer']
    ];
    $i++;
}

$data = array(
    'id' => 156,
    'quizName' => $quizName,
    'numberOfQuestions' => $numberOfQuestions,
    'isTimed' => true,
    'numberOfMinutesToComplete' => $numberOfMinutesToComplete,
    'targetedClass' => 'Js One',
    'subject' => $subject_name,
    'schoolLevel' => $schoolLevel,
    'questions' => $questionsArrFormatted,
    'totalValidMarks' => $totalValidMarks,
    'validUntil' => $validUntil
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-06
    • 2022-11-29
    • 2017-11-21
    • 2018-04-24
    • 1970-01-01
    • 2020-04-26
    • 2014-12-13
    • 2019-12-19
    相关资源
    最近更新 更多