HttpResponseMessage返回的是Json格式数据。

11

我有一个关于 Web Api 基础的问题。我之前查过,但没有找到我想要的答案。

我有一段代码,就像通常的方法一样,我的方法叫做“Post”,它必须返回一些东西,例如 JSON,我该怎么做呢?具体来说,在单词“return”之后,我应该写什么才能把3个字段(loginRequest.Username、loginRequest.Password和loginRequest.ContractItemId)作为 Json 返回呢? 注释:不用担心 username、password 和 contractID 在注释中,我在 LinQ 中已经获取了它们的值。现在我只需要 return,希望那些想要提供一些建议的人都能问候一下。

    [System.Web.Http.HttpPost]
    public HttpResponseMessage Post(LoginModel loginRequest)
    {
        //loginRequest.Username = "staw_60";
        //loginRequest.Password = "john31";
        //loginRequest.ContractItemId = 2443;

      try
        {
           Membership member =
                (from m in db.Memberships
                 where
                     m.LoginID == loginRequest.Username 
                 && m.Password == loginRequest.Password 
                 && m.ContractItemID == loginRequest.ContractItemId
                 select m).SingleOrDefault();   
        }
       catch (Exception e)
       {
            throw new Exception(e.Message);
       }

      return ???;      
    }

11
OT: catch (Exception e) { throw new Exception(e.Message); } 是一个非常糟糕的做法。如果没有明确的异常类型或堆栈跟踪,找到任何错误将会非常困难! - Richard Deeming
@Adriano 这不是MVC,而是Web-API,因此有些不同。 - Erik Philips
1
@RichardDeeming 我也会建议在这种情况下正确的错误处理方式是 catch (Exception e) { throw; }。我想代码可能是为了断点调试而存在的,但是断点仍然可以放在 throw 上并具有可调试性 - Erik Philips
1
@ErikPhilips:我能理解调试代码时使用try...catch的意义,但在生产代码中,我更倾向于完全省略它。 - Richard Deeming
2
@RichardDeeming 或者至少实际做些有用的事情,比如记录并发送带有500或其他内容的 HttpResponseMessage - Erik Philips
2个回答

27

试试这个:

HttpResponseMessage response = new HttpResponseMessage();
response.Content = new ObjectContent<Response>(
        new Response() { 
                        responseCode = Response.ResponseCodes.ItemNotFound 
                       }, 
                       new JsonMediaTypeFormatter(), "application/json");

或者只需直接从请求对象本身创建另一个响应即可。

return Request.CreateResponse<Response>(HttpStatusCode.OK, 
      new Response() { responseCode = Response.ResponseCodes.ItemNotFound })

您也可以通过更新HttpConfiguration(Formatter.Remove)将所有响应类型转换为JSON,只需删除默认的XML序列化并使用JSON。


2
FYI:你可以使用 JsonMediaTypeFormatter.DefaultMediaType.MediaType 代替硬编码媒体字符串。 ;) - James Wilkins
为什么这个方法强制规定内容类型呢?如果API的用户更喜欢请求XML,而另一个用户更喜欢JSON,该怎么办呢?最好返回请求指定的类型。 - Talon

17

你可以创建一个LoginResponseModel类,用于向调用者发送有关登录尝试成功/失败的信息。例如:

public class LoginResponseModel
{
    public bool LoginSuccessful {get; set;}
    public string ErrorMessage {get; set;}
    public LoginResponseModel()
    {
    }
}

如果您喜欢的话,您可以直接从控制器返回此内容:

[System.Web.Http.HttpPost]
public LoginResponseModel Post(LoginModel loginRequest)
{
    ...

    return new LoginResponseModel() { LoginSuccessful = true, ErrorMessage = "" };
}

或者您仍然可以使用 HttpResponseMessage 作为返回类型,但将 LoginResponseModel 作为 JSON 响应发送:

[System.Web.Http.HttpPost]
public HttpResponseMessage Post(LoginModel loginRequest)
{
    ...

    var resp = Request.CreateResponse<LoginResponseModel>(
        HttpStatusCode.OK,
        new LoginResponseModel() { LoginSuccessful = true, ErrorMessage = "" }
    );
    return resp;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接