如何使用Flurl编写含授权头与Body参数的正确C# GET请求
正确的Flurl实现代码
你的问题核心是把接口要求放在请求体的参数错误地放到了请求头里,同时GET请求默认不会携带请求体,需要显式处理。以下是修正后的代码:
string clientID = ...; string clientSecret = ...; string user = ...; string password = ...; // 定义请求体参数 var requestBody = new { grant_type = "esslogin", ssusername = user, sspassword = password }; // 发送GET请求并接收结果 BearerToken result = await serviceURL .AppendPathSegment("token") // 用Flurl内置方法自动处理Basic认证,替代手动Base64编码 .WithBasicAuth(clientID, clientSecret) // 显式指定GET方法并传递表单格式的请求体 .SendAsync(HttpMethod.Get, new FormUrlEncodedContent(requestBody.ToKeyValuePairs())) .ReceiveJson<BearerToken>();
关键修正点:
- 参数位置调整:移除了
WithHeaders中关于grant_type、ssusername、sspassword的配置,将这些参数放到请求体中 - Basic认证简化:使用Flurl内置的
WithBasicAuth方法,它会自动完成clientID:clientSecret的Base64编码并设置Authorization头,避免手动编码可能出现的字符编码错误 - GET请求带请求体处理:由于标准GET请求通常不携带请求体,Flurl的
GetJsonAsync默认也不会发送请求体,因此需要用SendAsync显式指定HTTP方法,并传递请求体内容- 如果接口接受JSON格式的请求体,可替换为
SendJsonAsync(HttpMethod.Get, requestBody)
- 如果接口接受JSON格式的请求体,可替换为
可选:保留手动构造Authorization头
如果你想继续使用自己的Base64编码逻辑,只需替换WithBasicAuth部分:
string authCredentials = $"{clientID}:{clientSecret}".Base64Encode(); // ... .WithHeader("Authorization", $"Basic {authCredentials}")
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

