使用 ajax 加载 Steam 库存,怎么样?

Steam inventory loading with ajax, how?

所以我在这里做了这个小代码:

<?php
$steamData =     file_get_contents("http://steamcommunity.com/profiles/76561198258195397/inventory/json/730/2");
$data = json_decode($steamData, true);
$items = $data['rgDescriptions'];
foreach($items as $key => $item){
    $market_hash_name = $item["market_hash_name"];
    $market_hash_name = htmlentities($market_hash_name, ENT_QUOTES, 'UTF-8');
    $sql = "SELECT price FROM itemprice WHERE market_hash_name='".$market_hash_name."'";
    $result = $conn->query($sql);
    $itemprice = "-";
    if ($result->num_rows > 0) 
    {
        while($row = $result->fetch_assoc()) 
        {
            if($row['price']>0.02){
                $itemprice = $row['price'];
                $itemprice = floatval($itemprice);
                $itemprice = $itemprice*1.05;
            }else{
                $itemprice = 0;
            }
        }
    }
    echo '<div class="items"><center><img src="http://steamcommunity-a.akamaihd.net/economy/image/' . $item["icon_url"] . '" height="192" width="256"></center><div><center><h5 style="color:#'.$item["name_color"].'">'.$item["market_name"].' - <strong><b><a     style="color:green">$'.$itemprice.'</a></b></strong></h5></center></div></div>';
} 
?> 

我怎样才能用 ajax 制作这个脚本 运行 直到它返回一些数据?因为它大约是工作的 1/10 倍。

How can i make this script run with ajax until it gives some data back?

我认为你在这里问错了问题。当您向 您的 服务器发出 ajax 请求并且 您的 服务器未能正确遵守它时,应该假设 您的 服务器出错,问题是您造成的*。然而,当 Steam 无法提供信息时,您的服务器应该尝试追究 Steam 服务器的责任,而不是立即将问题传播到您客户端的代码。

最终,问题出在这里:

$steamData =     file_get_contents("http://steamcommunity.com/profiles/76561198258195397/inventory/json/730/2");

您没有进行任何检查来确保您从 Steam 获得的数据是正确的数据——甚至这个网络调用根本就没有成功!为此,您需要一个重要的 HTTP 请求来检查状态,这意味着您必须摆脱 file_get_contents() 并改用 curl 函数来确保请求如您所愿成功:

<?php
do {
    //If this isn't the first time in the loop, pause for a second to prevent spamming their servers
    if(isset($statusCode)){
        sleep(1);
    }

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "http://steamcommunity.com/profiles/76561198258195397/inventory/json/730/2");
    //The curl request should return the body of the text
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    //Apparently the URL provided initially returns with a 3XX response, this option follows the redirection.
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

    $steamData = curl_exec($ch);

    $statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    //Repeat this command until we get a successful request
    //Note that this is slightly naive - Any 2XX should be deemed successful.
} while ($statusCode !== 200);

$data = json_decode($steamData, true);
//...

这样做应该会大大提高 1/10 的成功几率,但它并不能保证成功,因为依赖网络调用本质上是您无法控制的。如果 Steam 发生关闭,向您的服务器重复发送 ajax 请求不会完成任何事情,实际上对客户端有害*。在这些情况下,您的服务器应响应 HTTP 500 错误(即表明服务器出现问题)并向您的用户显示一条错误消息,指出请求无法完成并且 not 尝试重新请求数据。

*我还应该提到发送多个 ajax 请求意味着客户端正在利用他们的带宽上限来纠正服务器上发生的问题,这是不理想的。