C#发送带查询参数的Get请求失败,求等效Python的正确实现
修正C#调用CurseForge搜索Mod接口的实现问题
可正常运行的Python实现
import requests base_adress = 'https://api.curseforge.com' headers = { 'Accept': 'application/json', 'x-api-key': '' } r = requests.get(base_adress + '/v1/mods/search', params={ 'gameId': '432', 'searchFilter': 'Applied Energistics 2' }, headers = headers) print(r.json())
错误的C#实现(参数位置错误)
var baseUrl = new Uri("https://api.curseforge.com"); using var client = new HttpClient(); client.BaseAddress = baseUrl; using var request = new HttpRequestMessage(HttpMethod.Get, "/v1/mods/search"); request.Headers.Add("Accept", "application/json"); request.Headers.Add("x-api-key", ""); request.Options.Set(new HttpRequestOptionsKey<Int32>("gameId"), 432); request.Options.Set(new HttpRequestOptionsKey<string>("searchFilter"), "Applied Energistics 2"); var response = await client.SendAsync(request); var text = await response.Content.ReadAsStringAsync(); Console.WriteLine(text);
错误原因:request.Options用于配置HTTP客户端的底层选项(如超时、代理等),并非设置URL查询参数的位置。错误传递参数会导致接口无法识别,返回空结果。
正确的C#实现
以下是几种和Python代码逻辑一致的正确实现方式:
方式一:手动构建带查询参数的URL
var baseUrl = new Uri("https://api.curseforge.com"); using var client = new HttpClient(); client.BaseAddress = baseUrl; // 构建包含编码后查询参数的请求路径 var requestPath = "/v1/mods/search?gameId=432&searchFilter=Applied%20Energistics%202"; using var request = new HttpRequestMessage(HttpMethod.Get, requestPath); request.Headers.Add("Accept", "application/json"); request.Headers.Add("x-api-key", ""); // 替换为你的实际API Key var response = await client.SendAsync(request); response.EnsureSuccessStatusCode(); // 可选:校验请求是否成功 var text = await response.Content.ReadAsStringAsync(); Console.WriteLine(text);
方式二:使用QueryHelpers自动构建编码后的URL(推荐)
需要确保项目引用Microsoft.AspNetCore.WebUtilities包(.NET Core/.NET 5+默认包含,.NET Framework需单独安装NuGet包)
using Microsoft.AspNetCore.WebUtilities; var baseUrl = new Uri("https://api.curseforge.com"); var requestPath = "/v1/mods/search"; // 定义查询参数集合 var queryParams = new Dictionary<string, string> { { "gameId", "432" }, { "searchFilter", "Applied Energistics 2" } }; // 自动编码并拼接参数到URL var fullUri = QueryHelpers.AddQueryString(baseUrl + requestPath, queryParams); using var client = new HttpClient(); using var request = new HttpRequestMessage(HttpMethod.Get, fullUri); request.Headers.Add("Accept", "application/json"); request.Headers.Add("x-api-key", ""); // 替换为你的实际API Key var response = await client.SendAsync(request); response.EnsureSuccessStatusCode(); var text = await response.Content.ReadAsStringAsync(); Console.WriteLine(text);
方式三:使用HttpClient.GetAsync简化实现
using Microsoft.AspNetCore.WebUtilities; var baseUrl = new Uri("https://api.curseforge.com/v1/mods/search"); var queryParams = new Dictionary<string, string> { { "gameId", "432" }, { "searchFilter", "Applied Energistics 2" } }; var fullUri = QueryHelpers.AddQueryString(baseUrl.ToString(), queryParams); using var client = new HttpClient(); // 提前设置默认请求头 client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); client.DefaultRequestHeaders.Add("x-api-key", ""); // 替换为你的实际API Key var response = await client.GetAsync(fullUri); response.EnsureSuccessStatusCode(); var text = await response.Content.ReadAsStringAsync(); Console.WriteLine(text);
以上实现都会将查询参数正确附加到请求URL中,和Python代码的请求逻辑完全一致,能够获取到正确的Mod搜索结果。
内容的提问来源于stack exchange,提问作者NMNKFF
相关产品推荐
相关产品推荐

