You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Streamlit冰沙订单应用调用Fruityvice API遇Max retries连接错误求助

问题:Streamlit冰沙应用调用Fruityvice API失败(域名解析错误)

我正在开发一款基于Streamlit的冰沙订单定制应用,用户选择水果配料后,希望通过Fruityvice API获取对应水果的营养信息,但调用API时始终失败,出现Max retries exceeded的ConnectionError,根源是域名解析失败。我尝试过用try-except块和延迟循环处理,但问题仍未解决。

应用代码

import streamlit as st
from snowflake.snowpark.context import get_active_session
from snowflake.snowpark.functions import col
import requests


st.title("Customize your Smoothie! App :cup_with_straw:")
st.write(
    """Choose the fruits you want in your custom Smoothie!
    """
)


name_on_order = st.text_input('Name on Smoothie:')
st.write('The name on your Smoothie be:', name_on_order)


session = get_active_session()
my_dataframe = session.table("smoothies.public.fruit_options").select(col('FRUIT_NAME'))

ingredients_list = st.multiselect('Choose upto 5 ingredients:',my_dataframe,max_selections=5)


if ingredients_list:
    ingredients_string = ""
    for fruit_chosen in ingredients_list:
        ingredients_string+= fruit_chosen+" "
        
        fruityvice_response = requests.get("https://fruityvice.com/api/fruit/"+fruit_chosen)
        st.text(fruityvice_response.json())
        #fv_dv = st.dataframe(data=fruityvice_response.json(), use_container_width=True)

    my_insert_stmt = """ insert into smoothies.public.orders(ingredients,name_on_order)
            values ('""" + ingredients_string + """','""" + name_on_order + """')"""
    
    #st.write(my_insert_stmt)
    time_to_insert= st.button('Submit Order')
    if time_to_insert:
        session.sql(my_insert_stmt).collect()
        st.success('Your Smoothie is ordered!', icon="✅")

报错信息

ConnectionError: HTTPSConnectionPool(host='fruityvice.com', port=443): Max retries exceeded with url: /api/fruit/watermelonElderberries (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0xffff79c51400>: Failed to resolve 'fruityvice.com' ([Errno -3] Temporary failure in name resolution)"))
Traceback:
File "/usr/lib/python_udf/5f3d47ae4d4f192ce40f32e768dce379f8b04388fe033d00a5b697a7351e713f/lib/python3.8/site-packages/streamlit/runtime/scriptrunner/script_runner.py", line 552, in _run_script
    exec(code, module.__dict__)
File "/home/udf/88736396/streamlit_app.py", line 33, in <module>
    fruityvice_response = requests.get("https://fruityvice.com/api/fruit/watermelon"+fruit_chosen)
File "/usr/lib/python_udf/5f3d47ae4d4f192ce40f32e768dce379f8b04388fe033d00a5b697a7351e713f/lib/python3.8/site-packages/requests/api.py", line 73, in get
    return request("get", url, params=params, **kwargs)
File "/usr/lib/python_udf/5f3d47ae4d4f192ce40f32e768dce379f8b04388fe033d00a5b697a7351e713f/lib/python3.8/site-packages/requests/api.py", line 59, in request
    return session.request(method=method, url=url, **kwargs)
File "/usr/lib/python_udf/5f3d47ae4d4f192ce40f32e768dce379f8b04388fe033d00a5b697a7351e713f/lib/python3.8/site-packages/requests/sessions.py", line 589, in request
    resp = self.send(prep, **send_kwargs)
File "/usr/lib/python_udf/5f3d47ae4d4f192ce40f32e768dce379f8b04388fe033d00a5b697a7351e713f/lib/python3.8/site-packages/requests/sessions.py", line 703, in send
    r = adapter.send(request, **kwargs)
File "/usr/lib/python_udf/5f3d47ae4d4f192ce40f32e768dce379f8b04388fe033d00a5b697a7351e713f/lib/python3.8/site-packages/requests/adapters.py", line 519, in send
    raise ConnectionError(e, request=request)

解决方案

1. 配置Snowflake网络策略

你的应用运行在Snowflake Streamlit环境中,默认限制外部网络请求。需要:

  • 联系Snowflake管理员创建网络策略,添加出站规则允许访问fruityvice.com:443
  • 将该网络策略应用到你的账户、用户或对应的角色上

2. 修正URL拼接问题

从报错URL/api/fruit/watermelonElderberries可以看出,水果名称被错误拼接。需:

  • 检查smoothies.public.fruit_options表中FRUIT_NAME字段是否存在多余空格或特殊字符
  • 在请求API前清洗水果名称,示例代码修改如下:
fruit_cleaned = fruit_chosen.strip().lower()
fruityvice_response = requests.get(f"https://fruityvice.com/api/fruit/{fruit_cleaned}")

3. 完善错误处理逻辑

增强异常处理,区分不同错误类型,提升用户体验:

try:
    fruit_cleaned = fruit_chosen.strip().lower()
    # 添加超时时间避免无限等待
    fruityvice_response = requests.get(f"https://fruityvice.com/api/fruit/{fruit_cleaned}", timeout=10)
    # 触发HTTP错误状态码的异常(如404、500)
    fruityvice_response.raise_for_status()
    st.text(fruityvice_response.json())
except requests.exceptions.ConnectionError:
    st.error("无法连接到Fruityvice API,请检查网络权限或域名有效性")
except requests.exceptions.HTTPError as e:
    st.error(f"API请求失败,状态码:{fruityvice_response.status_code},详情:{str(e)}")
except Exception as e:
    st.error(f"获取水果营养信息出错:{str(e)}")

4. 验证域名解析有效性

在Snowflake SQL中执行以下命令,测试环境能否解析fruityvice.com:

SELECT SYSTEM$DNS_LOOKUP('fruityvice.com');

如果返回空或错误,说明Snowflake环境DNS配置无法解析该域名,需联系Snowflake技术支持排查。

内容的提问来源于stack exchange,提问作者Aman Chaudhur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 04:25:54