C#调用Python Flask RestAPI返回308永久重定向问题求助
问题原因与解决方案
1. 资源被判定移动的原因
这是Flask框架默认的严格尾部斜杠路由规则导致的:
你在服务端注册的路由是/name/(尾部带斜杠),当收到路径为/name(尾部不带斜杠)的请求时,Flask会自动返回308状态码,引导客户端重定向到带斜杠的/name/路径。
Postman、网页浏览器默认开启了自动跟随重定向的配置,所以你看不到中间的308响应,直接拿到最终的JSON结果;而你使用的C#客户端默认没有对308状态码做自动跟随重定向处理,所以直接返回了308响应。
2. 问题归属
本质是服务端路由规则和客户端请求路径不匹配导致的兼容性问题,两端都可以通过调整配置解决。
3. 修复方案
提供两种可选修复方向,任选其一即可:
方案1:调整服务端配置(推荐,兼容性更好)
- 要么修改路由定义,去掉尾部斜杠,和客户端请求路径对齐:
# 把原来的 @app.route('/name/') 改成下面的写法 @app.route('/name') def nameEndpoint(): return jsonify({'name':"Some name"}), 200
- 要么全局关闭Flask的严格尾部斜杠校验,让带/不带斜杠的路径都能匹配同一个路由:
app = Flask(__name__) # 新增这一行配置 app.url_map.strict_slashes = False
方案2:调整客户端配置
- 要么直接修改请求URL,加上尾部斜杠,和服务端路由完全对齐:
var url = "http://localhost:5000/name/";
- 要么配置客户端开启308重定向自动跟随:
以HttpClient为例:
public async Task TryWithHttpClient() { var handler = new HttpClientHandler() { AllowAutoRedirect = true, // 兼容308状态码重定向 AutomaticRedirectionStatusCodes = new HashSet<System.Net.HttpStatusCode>() { System.Net.HttpStatusCode.Moved, System.Net.HttpStatusCode.Redirect, System.Net.HttpStatusCode.RedirectMethod, System.Net.HttpStatusCode.RedirectKeepVerb, // 对应308 System.Net.HttpStatusCode.PermanentRedirect }, MaxAutomaticRedirections = 5 }; var client = new HttpClient(handler); var json = await client.GetStringAsync(url); }
RestSharp同理,配置ClientOptions的AllowAutoRedirect = true即可。
内容的提问来源于stack exchange,提问作者Mc_Topaz
相关产品推荐
相关产品推荐

