gpt4 book ai didi

c# - API 的多个返回类型

转载 作者:行者123 更新时间:2023-11-30 22:55:22 25 4
gpt4 key购买 nike

输入和API定义:

我正在使用以下 API,它使用 Error 对象的 Data 对象进行响应

FooBar 方法:Ids 是以逗号分隔的字符串列表

GET: /FooBar/v1{?ids}
GET: /FooBar/v1/{ids}

请求 header :

X-FooBar-Key:   ## My key ##

响应:200

// if there is multiple IDs, response is an array of Data and Error
[{
"data": { }
}, {
"data": { }
}, {
"error": { }
}]

//If there is only one ID, response is the content of the data object
{
"code": "",
"date": "",
"status": "",
"message": "",
"link": "",
"type": ""
}

Response : 400/404/etc , 返回一个Error对象的内容

{
"code": "",
"message": ""
}

输出和预期结果:

我希望能够检查 [1, N] 个 ID,并且只有一个对象返回类型 Response,Data 或 Error 将另一个初始化为 null...

public class Response
{
[JsonProperty("data")]
public Data Data { get; set; }

[JsonProperty("error")]
public Error Error { get; set; }

public string Id{ get; set; }
}
public class Error
{
[JsonProperty("message")]
public string Message { get; set; }

[JsonProperty("code")]
[JsonConverter(typeof(StringEnumConverter))]
public ErrorCode Code { get; set; }
}
public class Data
{
[JsonProperty("status")]
[JsonConverter(typeof(StringEnumConverter))]
public Status Status { get; set; }

[JsonProperty("type")]
public string Type { get; set; }

[JsonProperty("code")]
public string Code { get; set; }

[JsonProperty("date")]
public string Date { get; set; }

[JsonProperty("message")]
public string Message { get; set; }

[JsonProperty("link")]
public string Link { get; set; }
}

尝试:

为了简化问题现在我一次只处理 1 个 Id。
使用 ServiceStack Client 来使用 REST API。

public class FooBarAPI : IFooBarAPI
{
Dictionary<string, string> DefaultHeader;
string BasePath; // https://foofoo.bar/FooBar/v1
public FooBarAPI(Dictionary<string, string> defaultHeader, string basePath)
{
DefaultHeader = defaultHeader;
BasePath = basePath;
}

public Response GetFooBar(string id)
{
JsonServiceClient client = new JsonServiceClient(BasePath);
client.RequestFilter = httpReq => httpReq.Headers.Add("X-FooBar-Key", DefaultHeader["X-FooBar-Key"]);

var response =
client.GetAsync<Response>($"/{id}"); // Null as for one ID the result is type Data not Response
// client.GetAsync<Data>($"/{id}"); // Working If not Error

var toto = response.Result;
toto.Id = id;

return toto;
}

public Response[] GetFooBar(string[] ids)
{ //
throw new NotImplementedException();
}
}

这个问题没有用 ServiceStack 标记,因为我愿意使用以下解决方案:HttpWebRequest/响应类,Web 客户端类,HttpClient 类,RestSharp NuGet 包,ServiceStack Http Utils,或任何让我的生活更轻松的东西。

我正在使用 ServiceStack 因为 documentation说我可以使用类似的东西:

client.GetAsync(new Hello { Name = "World!" })
.Success(r => r => r.Result.Print())
.Error(ex => { throw ex; });

使用 SuccessError 将单个返回类型映射到我的 Response 类型。

最佳答案

如果您正在使用 ServiceStack,那么您应该按照您在文档中找到的方式使用它,但这意味着您实际上会在 id 不存在时抛出(自定义)异常。然后您的自定义异常将包含代码和消息。所以当你想返回一个错误时,你实际上只会抛出一个异常。

但是,我不认为那是你应该做的,因为只有在发生异常情况时才应该使用异常,但据我了解,错误是一种经常发生的常见和正常行为(比如客户端确实会尝试使用 id 并出错)。因此,我建议使用 HttpWebResponse Class 作为您的返回类型。您基本上可以在那里设置 HTTP 返回状态(例如 400、404)和 json(或实际上任何)数据。

关于c# - API 的多个返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55277947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com