首页 新闻 会员 周边 捐助

关于形色API请求图片无法访问的问题

0
[待解决问题]

如下图,代码拼接了完整的URL
string image_url = host + dtPlantItem.Rows[0]["Location"].ToString() + "Normal/" + dtPlantItem.Rows[0]["ID"].ToString() + dtPlantItem.Rows[0]["FileExt"].ToString();
但是浏览器中无法访问,一直转圈
在调用API的时候,无法访问图像,导致识花结果为空
string postData = "appkey=" + appkey + "&timestamp=" + timestamp + "&auth=" + auth.ToLower() + "&image_url=" + image_url;
奇怪的是,等接口调用失败之后,这个URL的图片马上就可以在浏览器中显示了。

我试了一下可以访问的网络图片,都可以正常识别植物。所以代码应该没有问题。

teagueli的主页 teagueli | 初学一级 | 园豆:75
提问于:2024-03-29 09:07
< >
分享
所有回答(1)
0

在处理API请求图片无法访问的问题时,有几个可能的原因和解决方法:

可能原因
图片的延迟加载或缓存问题:

由于某种原因,图片可能在第一次请求时没有及时加载,导致后续请求失败。
URL拼接错误或编码问题:

URL中可能存在特殊字符或空格需要编码。
API请求限制:

API服务器可能对请求进行了速率限制,导致后续请求失败。
网络问题:

可能是网络延迟或其他网络问题导致图片无法及时加载。
解决方法
检查URL拼接和编码
确保URL拼接正确且进行了适当的URL编码。使用Uri.EscapeDataString对URL参数进行编码:

csharp
Copy code
string image_url = host + dtPlantItem.Rows[0]["Location"].ToString() + "Normal/" + dtPlantItem.Rows[0]["ID"].ToString() + dtPlantItem.Rows[0]["FileExt"].ToString();
image_url = Uri.EscapeDataString(image_url);
添加延迟重试机制
为API请求添加延迟重试机制,确保即使第一次请求失败,后续请求仍能成功:

csharp
Copy code
using System.Net.Http;
using System.Threading.Tasks;

public async Task<string> PostDataWithRetry(string url, string postData, int maxRetries = 3, int delay = 2000)
{
using (HttpClient client = new HttpClient())
{
for (int i = 0; i < maxRetries; i++)
{
try
{
HttpContent content = new StringContent(postData);
HttpResponseMessage response = await client.PostAsync(url, content);

            if (response.IsSuccessStatusCode)
            {
                return await response.Content.ReadAsStringAsync();
            }
        }
        catch (Exception ex)
        {
            // Log exception (optional)
        }
        
        await Task.Delay(delay);
    }
}

return null;

}
确保图片URL有效并可访问
在API请求之前,先测试图片URL是否可访问:

csharp
Copy code
public async Task<bool> IsImageUrlAccessible(string imageUrl)
{
try
{
HttpClient client = new HttpClient();
HttpResponseMessage response = await client.GetAsync(imageUrl);
return response.IsSuccessStatusCode;
}
catch
{
return false;
}
}

// 示例用法
if (await IsImageUrlAccessible(image_url))
{
// 进行API请求
}
else
{
// 处理URL不可访问情况
}
使用Fiddler或其他网络调试工具
使用Fiddler等网络调试工具,检查API请求的具体情况,包括请求头、请求体、响应等,找出请求失败的原因。

检查API速率限制
确保您的API请求没有超出速率限制,适当调整请求频率或增加重试间隔时间。

最终完整示例
结合上述方法,可以编写一个完整的示例:

csharp
Copy code
public async Task<string> RecognizePlantAsync(string host, DataRow dtPlantItem, string appkey, string timestamp, string auth)
{
string image_url = host + dtPlantItem["Location"].ToString() + "Normal/" + dtPlantItem["ID"].ToString() + dtPlantItem["FileExt"].ToString();
image_url = Uri.EscapeDataString(image_url);

if (await IsImageUrlAccessible(image_url))
{
    string postData = $"appkey={appkey}&timestamp={timestamp}&auth={auth.ToLower()}&image_url={image_url}";
    string apiUrl = "Your_API_Endpoint_Here";

    return await PostDataWithRetry(apiUrl, postData);
}
else
{
    // 处理URL不可访问情况
    return "Image URL is not accessible.";
}

}

public async Task<bool> IsImageUrlAccessible(string imageUrl)
{
try
{
using (HttpClient client = new HttpClient())
{
HttpResponseMessage response = await client.GetAsync(imageUrl);
return response.IsSuccessStatusCode;
}
}
catch
{
return false;
}
}

public async Task<string> PostDataWithRetry(string url, string postData, int maxRetries = 3, int delay = 2000)
{
using (HttpClient client = new HttpClient())
{
for (int i = 0; i < maxRetries; i++)
{
try
{
HttpContent content = new StringContent(postData);
HttpResponseMessage response = await client.PostAsync(url, content);

            if (response.IsSuccessStatusCode)
            {
                return await response.Content.ReadAsStringAsync();
            }
        }
        catch (Exception ex)
        {
            // Log exception (optional)
        }

        await Task.Delay(delay);
    }
}

return null;

}
以上方法和示例代码可以帮助您解决图片URL无法访问的问题,并确保API请求的可靠性。

Technologyforgood | 园豆:7541 (大侠五级) | 2024-05-28 20:08
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册