首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在URI中转义花括号

如何在URI中转义花括号
EN

Stack Overflow用户
提问于 2021-12-04 12:45:59
回答 1查看 393关注 0票数 0

我正在尝试使用花括号来使用REST,但我不知道如何通过HttpClient.GetFromJsonAsync将它们发送出去。

代码语言:javascript
复制
string readKey = "1VQXp8053OlOs05XcoWX3L46TEQ4JaPnPtJMwUH6k0xUkgXWMd";
string endpoint = "https://api.cosmicjs.com/v2/buckets/ffm-blog-blog/objects?read_key={readKey}";
string queryOperator = "&query=";
string query = "%7Btype%3A%22posts%22%7D";
//Working URI (in browser and Postman) : https://api.cosmicjs.com/v2/buckets/ffm-blog-blog/objects?read_key=1VQXp8053OlOs05XcoWX3L46TEQ4JaPnPtJMwUH6k0xUkgXWMd&query=%7B%22type%22%3A%22posts%22%7D

我尝试过不同的方法:

代码语言:javascript
复制
string uriA = endpoint + queryOperator + query;
string uriB = endpoint + queryOperator + Uri.UnescapedDataString(query);
Uri uriC = new Uri(endpoint + queryOperator + query);
Uri uriD = new Uri(endpoint + queryOperator + Uri.UnescapedDataString(query);
Uri uriE = new Uri(Uri.UnescapedDataString(endpoint + queryOperator + query);
...

无论我用HttpClient尝试了什么方法:

代码语言:javascript
复制
CosmicResponse cosmicReponse = await _http.GetFromJsonAsync<CosmicResponse>(uri);

我总是得到同样的结果:

System.Net.Http.HttpRequestException: TypeError:未能获取

HttpClient发送的URI始终是:

https://api.cosmicjs.com/v2/buckets/ffm-blog-blog/objects?read_key=xxxx&query={%22type%22%3A%22posts%22}

当然,我不工作。

当发送没有查询部分的请求时,它可以工作:

代码语言:javascript
复制
string uri = "https://api.cosmicjs.com/v2/buckets/ffm-blog-blog/objects?read_key=xxxx";
CosmicResponse cosmicReponse = await _http.GetFromJsonAsync<CosmicResponse>(uri);

但是,我需要使用查询部分。

我知道在API中使用大括号是错误的做法,但我没有编写API,我只是尝试使用它。

有人知道如何用HttpClient发送"%7B“和"%7D”而不是"{“和"}”吗?

全码

代码语言:javascript
复制
public async Task<List<Post>> GetAllPosts()
{
    HttpClient http = new();
    string _rootUrl = "https://api.cosmicjs.com/v2/buckets/ffm-blog-blog";
    string _readKey = "1VQXp8053OlOs05XcoWX3L46TEQ4JaPnPtJMwUH6k0xUkgXWMd";
    string endpoint = $"{_rootUrl}/objects?read_key={_readKey}";
    string query = "%7Btype%3A%22posts%22%7D";
    Uri uri = new Uri(Uri.UnescapeDataString(endpoint + "&query=" + query));
    CosmicResponse cosmicReponse = await http.GetFromJsonAsync<CosmicResponse>(uri);
    List<Post> posts = new();
    foreach (CosmicPost c in cosmicReponse.Objects)
    {
        posts.Add(GetPostFromCosmic(c));
    }
    return posts;
}

最后一词

原来这是CORS的问题。由于邮递员不执行CORS政策,我错误地认为这个问题与HttpClient有关。我通过代理解决了这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-04 17:20:24

最好让图书馆替你做这件事。使用由NameValueCollection返回的HttpUtility.ParseQueryString (请注意,它们返回不同的派生类型HttpValueCollection,您无法自己初始化)。See more here

由于您没有给出类的定义,所以我将类型切换为object,这样测试代码就可以运行:

代码语言:javascript
复制
static async Task<object> GetAllPosts()
{
    HttpClient http = new();
    string _rootUrl = "https://api.cosmicjs.com/v2/buckets/ffm-blog-blog";
    string _readKey = "1VQXp8053OlOs05XcoWX3L46TEQ4JaPnPtJMwUH6k0xUkgXWMd";

    var query = HttpUtility.ParseQueryString("");
    query.Add("read_key", _readKey);
    query.Add("query", "{\"type\":\"posts\"}");

    string endpoint = $"{_rootUrl}/objects?" + query.ToString();
    return (await http.GetFromJsonAsync<object>(endpoint))!;    
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70225702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档