【问题标题】:How can I see the JSON being sent by Web API?如何查看 Web API 发送的 JSON?
【发布时间】:2017-08-03 09:41:15
【问题描述】:

我在 MVC 应用程序的一些 c# 代码中使用它。

var request = client.PutAsJsonAsync(path, myobj).

它工作正常 - 但我怎样才能窥探发送到 Web 服务器(在路径上)的 JSON?

有什么方法可以用调试器来做到这一点 - 或者输出发送回 MVC 应用程序的 JSON?谢谢。

【问题讨论】:

  • 创建一个扩展 DelegatingHandler 的类
  • Fiddler 可以帮助你。或者您可以使用 Postman 之类的东西作为 API 的客户端
  • 如果我从浏览器调用 get 或手动编写请求,Fiddler 会有所帮助 - 但我有 C# 代码直接调用 Web 服务。

标签: asp.net-web-api asp.net-web-api2


【解决方案1】:

你可以

  • 使用代理调试流量
  • 使用 API 测试工具
  • 修改您的代码以记录请求/响应

第一个选项 - 代理。看看Fiddler。它向您显示请求/响应数据,并允许查看 https 数据。正如@Balazs 所说,使用 Fiddler,您还可以编写、捕获、编辑和发送请求。

第二个选项 - API 测试工具。它们有很多(SoapUI、RESTClient 等),但我建议看看Postman。它允许通过测试手动和自动触摸您的 API。

最后一个选项由您决定。例如。您可以创建OWIN Middleware,它将记录请求和/或响应。


更新:似乎您想在客户端而不是服务器端记录请求。因此,您可以创建自定义消息处理程序,而不是 OWIN 中间件:

public class LoggingHandler : HttpClientHandler
{
    private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
    protected override Task<HttpResponseMessage> SendAsync(
       HttpRequestMessage request, CancellationToken cancellationToken)
    {
        // log request or its part here
        Logger.Trace(request.ToString());
        return base.SendAsync(request, cancellationToken);
    }
}

并将其传递给HttpClient:

var client = new HttpClient(new LoggingHandler());
client.DefaultRequestHeaders.Add("Accept", "application/xml");
var response = await client.GetStringAsync("http://localhost:12345/api/blah");

【讨论】:

  • 值得注意的是,也可以使用 Fiddler 编写和/或编辑请求。
  • (显然我不能使用 Fidler 来观看 C# 代码直接调用 Web 服务 - 或者如果可以的话 - 怎么做?)
  • @niico 你说的 raw 请求是什么意思? 看c#代码是什么意思?它可以是任何代码——你的 c# 或 java 应用程序,一些测试工具,如 curl 或浏览器。 Fiddler 将捕获请求。而且不清楚您希望在哪一侧看到原始请求 - 一些客户端应用程序或 webapi 应用程序?
  • 原始请求 - 我只想查看 JSON web api 正在生成并发送到 web 服务。我正在从 C# 服务器端代码调用 Web 服务。我想看看正在发送什么。 Fidler 没有捕捉到这段代码 - (我正在使用127.0.0.1)。
【解决方案2】:

创建一个扩展 DelegatingHandler 的类

然后……

Protected Overrides Async Function SendAsync(request As HttpRequestMessage, cancellationToken As CancellationToken) As Task(Of HttpResponseMessage)

    LogRequest(request) ' this is where the request is

    ' Create and process response
    Dim response As HttpResponseMessage = Nothing
    response = Await MyBase.SendAsync(request, cancellationToken)

    LogResponse(response) ' here is the reponse

    Return response
End Function

 Private Function LogResponse(response As HttpResponseMessage) As Boolean

    Try

        Dim theJSON As String = Newtonsoft.Json.JsonConvert.SerializeObject(ExtractLoggingInfoFromResponse(response))

    Catch ex As Exception
        Return False
    End Try

    Return True
End Function

....然后在 Global.asax 中,注册处理程序: GlobalConfiguration.Configuration.MessageHandlers.Add(New YourClassNameHandler)

【讨论】:

    猜你喜欢
    • 2017-04-07
    • 1970-01-01
    • 2014-08-13
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 2021-12-19
    • 1970-01-01
    相关资源
    最近更新 更多