首页 > 解决方案 > System.Net.Http.HttpRequestException 与 UnauthorizedException

问题描述

我正在尝试将我的 Python 代码转换为 C# 代码,但在翻译过程中出现了一些异常。

我想要的是从 url 获取 json/string 数据。我是 C# 网络编程的新手。我尝试了几种方法,阅读那里的文档,谷歌它们的用法,但我仍然找不到正确的方法,因为我一直在标题中得到例外。

这是我的 Python 代码有效:

    url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp'
    params = {
        'ct': 24,
        'qqmusic_ver': 1298,
        'new_json': 1,
        'remoteplace':'sizer.yqq.lyric_next',
        'searchid': 63514736641951294,
        'aggr': 1,
        'cr': 1,
        'catZhida': 1,
        'lossless': 0,
        'sem': 1,
        't': 7,
        'p': 1,
        'n': 1,
        'w': keyword,
        'g_tk': 1714057807,
        'loginUin': 0,
        'hostUin': 0,
        'format': 'json',
        'inCharset': 'utf8',
        'outCharset': 'utf-8',
        'notice': 0,
        'platform': 'yqq.json',
        'needNewCode': 0
    }
    headers = {
        'content-type': 'application/json',
        'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0',
        'referer':'https://y.qq.com/portal/search.html'
    }
    result = requests.get(url, params = params, headers = headers)

这是我尝试过的 C# 代码:

    public static async Task<string> SearchLyrics(string keyword)
    {
        keyword = Uri.EscapeUriString(keyword);
        // method 1
        string uri = $"https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=sizer.yqq.lyric_next&searchid=63514736641951294&aggr=1&cr=1&catZhida=1&lossless=0&sem=1&t=7&p=1&n=1&w={keyword}&g_tk=1714057807&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0";
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri(uri);
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            using (var request = new HttpRequestMessage(HttpMethod.Get, uri))
            {
                request.Headers.Add("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0");
                request.Headers.Add("referer", "https://y.qq.com/portal/search.html");
                var response = await client.SendAsync(request);
                //response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                return await response.Content.ReadAsStringAsync();
            }
        }
        // method 2
        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            client.DefaultRequestHeaders.Add("ct", "24");
            client.DefaultRequestHeaders.Add("qqmusic_ver", "1298");
            client.DefaultRequestHeaders.Add("new_json", "1");
            client.DefaultRequestHeaders.Add("remoteplace", "sizer.yqq.lyric_next");
            client.DefaultRequestHeaders.Add("searchid", "63514736641951294");
            client.DefaultRequestHeaders.Add("aggr", "1");
            client.DefaultRequestHeaders.Add("catZhida", "1");
            client.DefaultRequestHeaders.Add("lossless", "0");
            client.DefaultRequestHeaders.Add("t", "7");
            client.DefaultRequestHeaders.Add("p", "1");
            client.DefaultRequestHeaders.Add("n", "1");
            client.DefaultRequestHeaders.Add("w", keyword);
            client.DefaultRequestHeaders.Add("g_tk", "1714057807");
            client.DefaultRequestHeaders.Add("loginUin", "0");
            client.DefaultRequestHeaders.Add("hostUin", "0");
            client.DefaultRequestHeaders.Add("format", "json");
            client.DefaultRequestHeaders.Add("inCharset", "utf8");
            client.DefaultRequestHeaders.Add("outCharset", "utf-8");
            client.DefaultRequestHeaders.Add("notice", "0");
            client.DefaultRequestHeaders.Add("platform", "yqq.json");
            client.DefaultRequestHeaders.Add("needNewCode", "0");
            using (var request = new HttpRequestMessage(HttpMethod.Get, "https://c.y.qq.com/soso/fcgi-bin/client_search_cp"))
            {
                request.Headers.Add("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0");
                request.Headers.Add("referer", "https://y.qq.com/portal/search.html");
                var response = await client.SendAsync(request);
                //response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                return await response.Content.ReadAsStringAsync();
            }
        }
    }

标签: c#python-requestsdotnet-httpclient

解决方案


问题是我没有为我的 uwp 应用启用网络访问功能。将其添加到Package.appxmanifest将解决此问题。

我的代码是正确的,但我根据Microsoft Document做了一些改进:

public static async Task<string> SearchLyrics(string keyword)
{
    string uri = $"https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=sizer.yqq.lyric_next&searchid=63514736641951294&aggr=1&cr=1&catZhida=1&lossless=0&sem=1&t=7&p=1&n=1&w={Uri.EscapeUriString(keyword)}&g_tk=1714057807&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0";
    using (var client = new HttpClient())
    {
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        client.DefaultRequestHeaders.UserAgent.TryParseAdd("Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0");
        var response = await client.GetAsync(uri);
        response.EnsureSuccessStatusCode();
        var content = await response.Content.ReadAsStringAsync();
        Windows.Data.Json.JsonObject json = Windows.Data.Json.JsonObject.Parse(content);
        return json.GetNamedObject("data").GetNamedObject("lyric").GetNamedArray("list").GetObjectAt(0).GetNamedString("content");
        }
    }

推荐阅读