【问题标题】:Append a query string to a pre-constructed URI (C#, Unity3D)将查询字符串附加到预先构建的 URI(C#,Unity3D)
【发布时间】:2015-12-08 15:43:16
【问题描述】:

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

var str = _request.Uri.OriginalString;

    str += "&page_number=0";

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

编辑**

谢谢,

不过,我觉得我说得还不够清楚。问题不在于如何创建字符串,而在于如何将该页码附加到已构建/配置的请求中,而无需重建完整的 HTTP 请求并设置其所有回调和其他值。 httpRequest 的 URI 的设置访问器是不可访问的。

【问题讨论】:

  • 更新了我的答案,以获得更多关于为什么 Uri 属性只读的解释。

标签: c# http plugins unity3d uri


【解决方案1】:

供您修改: Uri 属性是只读的,因为通过将 cookie、表单数据和其他潜在的敏感信息暴露给 3rd 方服务器太容易让自己大喊大叫。 为避免这种情况,插件将不允许您对不同的 Uri 重复使用相同的请求。


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

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

因此,您可以克服这些限制,也可以坚持原来的字符串方法。

【讨论】:

    【解决方案2】:

    我发现 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>();
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-12
      • 2013-01-09
      • 1970-01-01
      • 2017-09-26
      • 2019-02-10
      • 1970-01-01
      相关资源
      最近更新 更多