簡體   English   中英

通過 POST 將數據發送到 API 並在 PHP 中顯示響應

[英]Send data via POST to API and show response in PHP

我有一個小問題,我對 PHP 有點陌生,我無法工作。

我會解釋。

我可以訪問運輸 API(包裹),它使我可以通過指南號或運輸 ID 跟蹤包裹,並返回 JSON 中的響應以及運輸狀態。

我制作了一個執行跟蹤功能的小腳本,但我無法讓它顯示“主要”狀態和“子事件”。

請求通過 POST 發送,響應如下所示:

{
    "status": "SUCCESS",
    "enviaya_shipment_number": "N9T30TAC",
    "carrier_tracking_number": "9878401142",
    "channel": "Api",
    "estimated_delivery_date": null,
    "expected_delivery_date": "12/01/2022",
    "pickup_date": "2021-12-30T10:39:11-06:00",
    "shipment_status": "En tránsito",
    "event_code": 151,
    "event_description": "Llegada al Centro de DHL",
    "event": "Llegada",
    "status_code": 14,
    "sub_event_code": null,
    "sub_event": null,
    "sub_event_description": null,
    "checkpoints": [
        {
            "code": "PU",
            "description": "Envío recibido",
            "date": "2022-01-03T12:12:00.000-06:00",
            "postal_code": null,
            "city": null,
            "country_code": null,
            "country": null,
            "comments": "MEXICO CITY-MEX"
        },
        {
            "code": "PL",
            "description": "Procesado",
            "date": "2022-01-03T14:07:00.000-06:00",
            "postal_code": null,
            "city": null,
            "country_code": null,
            "country": null,
            "comments": "MEXICO CITY-MEX"
        },
        {
            "code": "DF",
            "description": "Salida",
            "date": "2022-01-03T14:08:00.000-06:00",
            "postal_code": null,
            "city": null,
            "country_code": null,
            "country": null,
            "comments": "MEXICO CITY-MEX"
        },
        {
            "code": "AF",
            "description": "Llegada",
            "date": "2022-01-03T15:30:00.000-06:00",
            "postal_code": null,
            "city": null,
            "country_code": null,
            "country": null,
            "comments": "MEXICO CITY HUB-MEX"
        },
        {
            "code": "PL",
            "description": "Procesado",
            "date": "2022-01-03T18:55:00.000-06:00",
            "postal_code": null,
            "city": null,
            "country_code": null,
            "country": null,
            "comments": "MEXICO CITY HUB-MEX"
        },
        {
            "code": "DF",
            "description": "Salida",
            "date": "2022-01-03T19:04:00.000-06:00",
            "postal_code": null,
            "city": null,
            "country_code": null,
            "country": null,
            "comments": "MEXICO CITY HUB-MEX"
        },
        {
            "code": "AF",
            "description": "Llegada",
            "date": "2022-01-03T20:55:00.000-06:00",
            "postal_code": null,
            "city": null,
            "country_code": null,
            "country": null,
            "comments": "QUERETARO-MEX"
        },
        {
            "code": "PL",
            "description": "Procesado",
            "date": "2022-01-03T22:03:00.000-06:00",
            "postal_code": null,
            "city": null,
            "country_code": null,
            "country": null,
            "comments": "QUERETARO-MEX"
        },
        {
            "code": "DF",
            "description": "Salida",
            "date": "2022-01-03T22:31:00.000-06:00",
            "postal_code": null,
            "city": null,
            "country_code": null,
            "country": null,
            "comments": "QUERETARO-MEX"
        },
        {
            "code": "AR",
            "description": "Llegada",
            "date": "2022-01-04T01:52:00.000-06:00",
            "postal_code": null,
            "city": null,
            "country_code": null,
            "country": null,
            "comments": "MERIDA-MEX"
        }
    ]
}

所以我在 HTML 中做了一個表格供客戶端發送數據,很簡單:

<form action="track.php" method="post" enctype="multipart/form-data" accept-charset="UTF-8" id="form-app">
<fieldset class="row">

<!-- Heading -->
<div class="col-xs-12">
    <h3 class="legend">Rastreo de Paquetes</h3>
</div>


<!-- Select List -->
<div class="col-xs-12">
    <div class="form-group required-control">
        <label  class="control-label" for="carrier">Paquetería</label>
        <select id="carrier" name="carrier" data-alias=""  class="form-control" required  >
            <option value="UPS" >UPS</option>
            <option value="Redpack" >Redpack</option>
            <option value="Estafeta" >Estafeta</option>
            <option value="DHL" >DHL</option>
            <option value="99 Minutos" >99 Minutos</option>
            <option value="FedEx" >FedEx</option>
            <option value="iVoy" >iVoy</option>
        </select>
    </div>
</div>

<!-- Number -->
<div class="col-xs-12">
    <div class="form-group required-control">
        <label  class="control-label" for="number">Número de guía o ID de Envío</label>
        <input type="text" id="shipment" name="shipment" value="" data-alias="" data-integer-only="true"  class="form-control"  required>
    </div>
</div>

<!-- Button -->
<div class="col-xs-12">
     <div class="form-action">
        <button type="submit" id="button_1" name="button_1" class="btn btn-primary">Enviar</button>
    </div>
</div>

這又通過 cURL 發送數據,接收響應並解碼 JSON 到理論上與 API 連接的文件

<?php
include_once "key.php";
$shipment_number=$_POST["shipment"];
$carrier=$_POST["carrier"];

 //SEND REQUEST post TO api AND DECODE JSON RESPONSE
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, "https://envios.corporativomarva.mx/api/v1/trackings");
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_POST, 1);
 curl_setopt($ch, CURLOPT_POSTFIELDS, "carrier=".$carrier."&shipment_number=".$shipment_number);
 curl_setopt($ch, CURLOPT_HTTPHEADER, array(
     "api_key: ".$API_KEY
 ));
 $response = curl_exec($ch);
 curl_close($ch);
 $respuesta = json_decode($response);
 

//Show the response on HTML format with tables
echo "<table border='1'>";
echo "<tr><td>Estado del Envío</td><td>".$respuesta->shipment_status."</td></tr>";
echo "<tr><td>Evento</td><td>".$respuesta->event_description."</td></tr>";
echo "<tr><td>Guía</td><td>".$respuesta->carrier_tracking_number."</td></tr>";
echo "<tr><td>ID de Envio</td><td>".$respuesta->enviaya_shipment_number."</td></tr>";
echo "<tr><td>Fecha de envio</td><td>".$respuesta->pickup_date."</td></tr>";

//Show subevents on HTML format with tables
echo "<table border='1'>";
echo "<tr><td>Evento</td><td>Descripción</td><td>Fecha</td></tr>";
foreach ($respuesta->subevents as $subevent) {
  echo "<tr><td>".$subevent->event."</td><td>".$subevent->description."</td><td>".$subevent->date."</td></tr>";
}
echo "</table>";    

但是,顯然有問題,因為它向我顯示了空單元格,也就是說,它沒有顯示任何數據。

根據var_dump($respuesta); API 密鑰不正確,但我已經驗證並且沒問題。

根據共享的代碼片段,您正在迭代subevent 但是,我在共享的響應中找不到任何名為subevent的鍵。

如果子事件存在並且它是列表的形式,那么 foreach 語句應該可以工作。

請確認子事件來自。

foreach ($respuesta->subevents as $subevent)

我設法找到了答案:

首先,我將 API 密鑰作為 header 傳遞,它必須作為另一個參數傳遞,然后我設法讓它向我顯示表中的檢查點,完整的代碼是:

<?php
include_once "key.php";
$shipment_number=$_POST["shipment"];
$carrier=$_POST["carrier"];

$params = array(
  "api_key" => $API_KEY,
  "carrier" => $carrier,
  "shipment_number" => $shipment_number
);
$headers = array(
  "api_key=".$API_KEY
);
curl_setopt_array($ch = curl_init(), array(
  CURLOPT_URL => "https://envios.corporativomarva.mx/api/v1/trackings",
  CURLOPT_SSL_VERIFYPEER => 0,
  CURLOPT_POST => 1,
  CURLOPT_POSTFIELDS => http_build_query($params),
  CURLOPT_RETURNTRANSFER => 1
));
$response = curl_exec($ch);
curl_close($ch);

$respuesta = json_decode($response);
 

//Show the response on HTML format with tables
echo "<table border='1'>";
echo "<tr><td>Estado del Envío</td><td>".$respuesta->shipment_status."</td></tr>";
echo "<tr><td>Evento</td><td>".$respuesta->event_description."</td></tr>";
echo "<tr><td>Guía</td><td>".$respuesta->carrier_tracking_number."</td></tr>";
echo "<tr><td>ID de Envio</td><td>".$respuesta->enviaya_shipment_number."</td></tr>";
echo "<tr><td>Fecha de envio</td><td>".$respuesta->pickup_date."</td></tr>";

//Show checkpoints data in a table
echo "<tr><td colspan='2'><table border='1'>";
echo "<tr><td>Checkpoint</td><td>Fecha</td><td>Código</td><td>Descripción</td><td>Ciudad</td><td>Estado</td><td>País</td><td>Comentarios</td></tr>";
foreach($respuesta->checkpoints as $checkpoint){
  echo "<tr><td>".$checkpoint->description."</td><td>".$checkpoint->date."</td><td>".$checkpoint->code."</td><td>".$checkpoint->description."</td><td>".$checkpoint->city."</td><td>".$checkpoint->state."</td><td>".$checkpoint->country."</td><td>".$checkpoint->comments."</td></tr>";
}
echo "</table></td></tr>";
echo "</table>";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM