接收和处理无连接错误和200 OK标头

时间:2013-02-19 12:03:57

标签: php ajax json api error-handling

我正在使用我自己创建的API,我正在与之通信,我的代码如下。如果一切正常,API返回json,以及标题'200 OK'。但是,如果连接断开,我将'502 Bad Gateway'作为标题返回。

到目前为止,'CURLOPT_HEADER'已在我的php脚本中设置为false(见下文),但现在我已将其设置为true,以便我可以接收标头并根据标头采取操作。在这里,我需要帮助。

我实际上有两件我需要帮助的东西(彼此相连):

  1. 如果我的API与源之间的连接正常,我在我的php脚本(见下文)中将CURLOPT_HEADER设置为false,一切正常。但是,如果我将其变为true,则实际标头也会以ajax请求发回,这会返回错误:“Uncaught SyntaxError:Unexpected token H”(下面js代码中的第10行)。

    < / LI>
  2. 如果我的API与源之间的连接断开,我对如何处理错误没有任何线索,因此API返回'502 Bad Gateway'。我希望php脚本使用ajax请求发回该信息,因此可以在js文件中处理。

  3. 所以,请帮帮我。提前谢谢!

    PHP:

    $url = 'http://theurl.com';
    
    $ch = curl_init($url);
    
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, true);
    
    $response = curl_exec($ch);
    
    if(!$response) {
        // <--- ??
    }
    
    curl_close($ch);
    
    echo json_encode($response);
    

    JS:

    1.    $.ajax({
    2.        url:'./php/apihandling.php',
    3.        type:'post',
    4.        dataType:'json',
    5.            data:{ 
    6.            data: data
    7.       },
    8.       success: function(data) {
    9.           var content = JSON.parse(data);
    10.          console.log(content);
    11.       },
    12.      error: function (xhr, ajaxOptions, thrownError) {
    13.          console.log(xhr.status);
    14.          console.log(thrownError);
    15.      }
    16.  });
    

1 个答案:

答案 0 :(得分:1)

您可以使用curl_errno检查您的API如何响应您的请求,您也可以尝试使用API​​&#34;状态标记&#34;避免JQuery中的错误

...
// Check if any error occurred
if(!curl_errno($ch))
{
 $info = curl_getinfo($ch);

 //close the connection
 curl_close($ch);
 $result["API_status"]=0;
 $result["error"]=$info;
 //kill the script and echo the json
 die(json_encode($result));
} 
else
{
$result["API_status"]=1;
curl_close($ch);
$result["response"]=$response;
echo json_encode($result);
}

现在让我们尝试一下你的jquery脚本

$.ajax({
    url: './php/apihandling.php',
    type: 'post',
    dataType: 'json',
    data: {
        data: data
    },
    success: function(data) {
        //no need for this, datatype is json already   
        //var content = JSON.parse(data);
        if (data["API_status"]) {
            alert("wow API is up and healthy");
            //do some stuff with the json
            $.each(data["response"], function(index, value) {
                //loop this
            });
        } else {
            alert("Oh, no. RIP API");
            console.log(data["error"]);
        }
    },
    error: function(xhr, ajaxOptions, thrownError) {
        console.log(xhr.status);
        console.log(thrownError);
    }
});