Rest API C# 和 Python:无法理解或解决状态码 308

Posted

技术标签:

【中文标题】Rest API C# 和 Python:无法理解或解决状态码 308【英文标题】:RestAPI C# and Python: Can't understand or solve status code 308 【发布时间】:2021-12-31 15:53:01 【问题描述】:

我正在尝试学习 RestApis,但遇到了一个我找不到答案的问题。

在 Python 脚本中,我借助 Flask RestApi 包运行 RestService。 所有端点都是 GET,我已经使用 PostMan 和 Web 浏览器测试和验证了每个端点。 在这两个客户端中的每一个中,我都按预期获得了 JSON 数据。

我有一个作为 RestClient 运行的 C# 控制台应用程序。 在这里,我得到状态码 308(永久重定向)。 我不明白为什么我会收到此状态码。

Python RestService

from flask import Flask
from flask import jsonify

app = Flask(__name__)

@app.route('/name/')
def nameEndpoint():
    return jsonify(
    
        'name':"Some name"
    ), 200

if __name__ == '__main__':
    app.run()

RestService 在我计算机上的 Windows 终端本地运行。 RestService 的 URL 是:http://localhost:5000/

我的 C# RestClients

var url = "http://localhost:5000/name";

public async Task TryWithRestSharp()

    var client = new RestSharp.RestClient(url);
    var result = await client.ExecuteAsync(new RestSharp.RestRequest());
    var json = foo.Content;


public async Task TryWithHttpClient()

    var client = new HttpClient();
    var json = await client.GetStringAsync(url);

两种方法都返回服务器代码 308(永久重定向)。

RestSharp 返回此信息:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>Redirecting...</title>
<h1>Redirecting...</h1>
<p>You should be redirected automatically to target URL:
<a href="http://localhost:5000/name/">http://localhost:5000/name/</a>.
If not click the link.

我发现这个关于状态码 308 的解释:

A 308 Permanent Redirect message is an HTTP response status code indicating that the 
requested resource has been permanently moved to another URI, as indicated by the 
special Location header returned within the response

我的问题:

如何将资源“移动”到另一个 URI? 问题出在服务还是客户端? 我需要做什么来解决这个问题?

【问题讨论】:

【参考方案1】:

这样试试

https://restsharp.dev/getting-started/getting-started.html#basic-usage

using RestSharp;
using RestSharp.Authenticators;

var client = new RestClient("your base url");

// if there is any auth
client.Authenticator = new HttpBasicAuthenticator("username", "password");

var request = new RestRequest("url prefix like url/name", DataFormat.Json);

var response = client.Get(request);

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。 我尝试了您的代码,但结果相同。我没有我所知道的身份验证。怎么办? 我现在知道了。您正在将 /name 重定向到 main ,因此您无法获取或发布该 url。【参考方案2】:

我发现了问题! 它在客户端。

using RestSharp;   // NOTE: Not sure if this make any difference for the problem. But it nice to have.

var url = "http://localhost:5000/name/";   // NOTE: Make sure to end the URL with a slash.

public async Task TryWithRestSharp()

    var client = new RestClient(url);
    var request = new RestRequest(url, DataFormat.Json);
    var result = await client.ExecuteGetAsync(new RestRequest());
    var json = result.Content;

我错过了 URL 中的最后一个斜杠。 这导致了问题。

【讨论】:

以上是关于Rest API C# 和 Python:无法理解或解决状态码 308的主要内容,如果未能解决你的问题,请参考以下文章

C# Rest API 文件上传

无法使用 rest api 和 python 获取并发布到 alm。总是得到 401 状态码

获取 REST API 数据并使用 C# 将它们保存到 SQL 表中

无法使用 keycloak 保护 python flask rest api 服务

REST API:使用 C# 结合登录信息和 API 操作?

在 web.config C# 中配置 Rest API 客户端