在客户端使用Web API

时间:2012-11-14 19:48:34

标签: c# asp.net json asp.net-web-api json.net

我在mvc4中创建了一个简单的web api控制器,包含4个方法(每个CRUD操作一个)。我可以使用fiddler来测试控制器中的方法是否有效。

我现在正在尝试进行单元测试以证明这些工作。我已经设法将我的客户端对象序列化为json格式,但是现在如何使用这个json字符串来实际调用我的方法?

如果有帮助,我使用Json.NET来序列化我的客户端对象 - 尽管我不认为这种扩展实际上会处理它并将其转发到服务器。

3 个答案:

答案 0 :(得分:1)

您的单元测试应该针对控制器编写 - 因此您不需要发出实际的HTTP请求来对Web API代码进行单元测试,只需调用方法即可。

从设计角度来看,如果您需要一个安静的Web API,客户端应该能够发送标准HTTP消息而无需序列化请求。

答案 1 :(得分:0)

这是我用来将对象发布到restful Web API的方法:

HttpResponseMessage response;
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://url_to_service");
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

var responseTask = client.PostAsJsonAsync("api/resource/somethingelse", someObjectToPost).Result;
responseTask.Wait();
response = responseTask.Result;

if (response.IsSuccessStatusCode)
{
    var contentTask = response.Content.ReadAsAsync<SomeResponseType>();
    contentTask.Wait();
    SomeResponseType responseContent = contentTask.Result;
}
else
{
    //Handle error.
}

在这种情况下,someObjectToPost是您的客户端对象,但您可以将其留给Web API为您序列化它。在上面的示例中,我假设响应是虚构类型SomeResponseType - 如果预期响应是纯文本,您也可以使用ReadAsStringAsync

答案 2 :(得分:0)

nick_w 此处显示的代码是正确的。您需要使用HttpClient对象。正如 Steve Fenton 所提到的,要创建单元测试,您不想这样做 - 而是直接针对控制器进行测试。但是对于功能测试,你可以做到。我做了同样的事情。我已经创建了辅助类,所以我只需要调用一个Http帮助器方法,这取决于它是GET还是POST等等。这个帮助器使用泛型类型,因此它可以与任何传递的类型一起运行。