You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 20:35:19