我创建了Web API,它接受在查询Oracle数据库中使用的四个输入参数,并以JSON格式返回结果。现在我试图处理URI中的任何异常,如果有任何输入参数缺失或格式错误。如果URI中的ROOM为空"error":"ROOM cannot be Empty or NULL"
ROOM=&DOB_GT=01-SEP-05&DOB_LT=30-DEC-06&STATUS_TYPE=CMPLT
public class TGSDataController : ApiController
{
[HttpGet]
public HttpResponseMessage Getdetails(string ROOM, DateTime DOB_GT, DateTime DOB_LT, string STATUS_TYPE)
{
if (string.IsNullOrEmpty(ROOM))
{
var resp = new HttpResponseMessage()
{
Content = new StringContent("ROOM cannot be Empty or NULL")
};
resp.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
return resp;
}
List<OracleParameter> prms = new List<OracleParameter>();
List<string> selectionStrings = new List<string>();
prms.Add(new OracleParameter("ROOM", OracleDbType.Varchar2, ROOM, ParameterDirection.Input));
prms.Add(new OracleParameter("DOB_GT", OracleDbType.Date, DOB_GT, ParameterDirection.Input));
prms.Add(new OracleParameter("DOB_LT", OracleDbType.Date, DOB_LT, ParameterDirection.Input));
prms.Add(new OracleParameter("STATUS_TYPE", OracleDbType.Varchar2, STATUS_TYPE, ParameterDirection.Input));
string connStr = ConfigurationManager.ConnectionStrings["TGSDataBaseConnection"].ConnectionString;
using (OracleConnection dbconn = new OracleConnection(connStr))
{
DataSet userDataset = new DataSet();
var strQuery = "SELECT * from LIMS_SAMPLE_RESULTS_VW where ROOM = :ROOM and DOB > :DOB_GT and DOB < :DOB_LT and STATUS_TYPE= :STATUS_TYPE ";
var returnObject = new { data = new OracleDataTableJsonResponse(connStr, strQuery, prms.ToArray()) };
var response = Request.CreateResponse(HttpStatusCode.OK, returnObject, MediaTypeHeaderValue.Parse("application/json"));
ContentDispositionHeaderValue contentDisposition = null;
if (ContentDispositionHeaderValue.TryParse("inline; filename=TGSData.json", out contentDisposition))
{
response.Content.Headers.ContentDisposition = contentDisposition;
}
return response;
}
使用上面的代码,它确实返回,如ROOM不能为空或NULL如何得到像"error":"ROOM cannot be Empty or NULL"
。也有办法处理URLI中的错误并将JSON响应返回为"error":"Poorly Formed URI"
答案 0 :(得分:0)
首先,WebAPI可以自动将任何对象序列化为JSON,您无需手动尝试构建HttpResponseMessage。
使用
Content = new StringContent("ROOM cannot be Empty or NULL")`
您只需将正常字符串添加到响应主体。
而是使用 Request.CreateResponse 扩展方法构建一个HttpResponseMessage,其中的任何对象都被序列化为JSON。
return Request.CreateResponse(HttpStatusCode.BadRequest,resp);
默认情况下,WebAPI将序列化响应在请求标头上的XML或JSON依赖项上。 为了强制JSON序列化,只需将其添加到 Application_Start()
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
现在关于例外情况。 默认情况下,WebAPI将自己处理抛出的异常,并返回默认的错误响应。
如果您想拦截此功能并在异常时返回自己的自定义响应,则应实现 ExceptionFilterAttribute
public class BALExceptionFilterAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
base.OnException(actionExecutedContext);
actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(HttpStatusCode.BadRequest, new { error = actionExecutedContext.Exception.Message });
}
}
并将其添加到您的应用程序开始
中GlobalConfiguration.Configuration.Filters.Add(new BALExceptionFilterAttribute());
最后,如果您有WebAPI 2.1,则可以使用Global ExceptionHandling
处理网址错误否则这里有一些相关的问题。 custom-error-pages-for-non-existant-directory-file-web-api-not-controllers how-to-handle-webapi-error-404
答案 1 :(得分:0)
您可以轻松构建一个包含要返回的错误的匿名类型。
if (string.IsNullOrEmpty(ROOM))
{
return this.Request.CreateResponse(
HttpStatusCode.BadRequest,
new { error= "ROOM cannot be empty or NULL" });
resp.Content.Headers.ContentType =
new MediaTypeHeaderValue("application/json");
return resp;
}
答案 2 :(得分:0)
尝试访问您的Web服务的客户端不会收到JSON格式的错误;相反,它会在客户端遇到错误。糟糕的URI不会让客户端到达返回JSON数据的服务器。
这应该回答你的第二个问题。
对于第一个,您有两个选择:您可以手动构建JSON返回,或者,您可以使用JSON库。
要手动完成,您可以使用以下内容:
{"error":"ROOM cannot be Empty or NULL"}