将查询字符串附加到预构建的 URI(C#、Unity3D)

Append a query string to a pre-constructed URI (C#, Unity3D)

使用 Unity3D 和 BestHttp 插件,是否有更好的方法将查询字符串附加到请求的 URI,然后重建 HTTP 请求,如下所示?请注意,Unity 在 mono 3.5 的子集上是 运行。

var str = _request.Uri.OriginalString;

    str += "&page_number=0";

    _request = new HTTPRequest(new Uri(str));

编辑**

谢谢,

虽然我认为我还不够清楚。问题不在于如何创建字符串,而在于如何将该页码附加到已构建/配置的请求,而不必重建完整的 HTTP 请求并设置其所有回调和其他值。无法访问为 httpRequest 的 URI 设置的访问器。

我发现 Flurl 库 https://github.com/tmenier/Flurl 很有用,它只是一个简单的扩展集合,可帮助您从字符串 URL 开始构建

例如,在您的场景中,它类似于

var str = _request.Uri.OriginalString.SetQueryParams("page_number", "0");

它有一个 Fluent API 所以构建起来真的很容易 url 在该项目的主页上有一个不言而喻的例子

var result = await "https://api.mysite.com"
.AppendPathSegment("person")
.SetQueryParams(new { api_key = "xyz" })
.WithOAuthBearerToken("my_oauth_token")
.PostJsonAsync(new { first_name = firstName, last_name = lastName })
.ReceiveJson<T>();

这个例子比你需要的要多得多,因为它已经 post 了一些东西并读取了响应,所以你可以只使用扩展来构建路径和查询字符串

供您编辑: Uri 属性 是只读的,因为将 cookie、表单数据和其他潜在敏感信息暴露给第 3 方服务器很容易搬起石头砸自己的脚。 为避免这种情况,插件不会让您对不同的 Uri 重复使用相同的请求。


我认为你能做的最好的就是使用 UriBuilder class:

UriBuilder builder = new UriBuilder(req.CurrentUri);
builder.Query += "page_number=0";
Debug.Log(builder.Uri);

它将添加第一个“?” char,但对于当前在 Unity 中的实现,如果多次使用 += 运算符,它会添加多个“?”字符数:

UriBuilder builder = new UriBuilder(req.CurrentUri);
builder.Query += "page_number=0";
builder.Query += "&page_number=2";
builder.Query += "&page_number=4";

Debug.Log(builder.Uri);

这将产生如下输出:

http://httpbin.org/get???page_number=0&page_number=2&page_number=4

因此,您可以努力克服这些限制,或者您可以坚持使用原来的字符串方法。