【问题标题】:JSON in HTTP request to API using JMeter使用 JMeter 对 API 的 HTTP 请求中的 JSON
【发布时间】:2019-05-11 05:41:59
【问题描述】:

我正在尝试使用 JMeter 测试 Web API。 Web 服务器在 JMeter 和数据库之间进行交互。服务器应该从 HTTP POST 请求中的 JSON 中获取参数并将它们解析为查询。

相关控制器中的网络服务器代码如下所示:

    [HttpPost]
    [Route("my_awesome_route_path")]
    public async Task<List<QueryResult>> invoice([FromBody]InvoiceInfo invoiceInfo) 
    {
     query = string.Format("INSERT INTO my_awesome_table (`my`,`awesome`,`columns`) " +
                       "VALUES ({0},{1},{2});", invoiceinfo.awesomeparam1, ... ,invoiceinfo.awesomeparamn);

          noRowsInserted = await db.Database.ExecuteSqlCommandAsync(query);

在我的 JMeter HTTP 请求表单中,我输入了上述控制器功能的正确路径。我将参数和文件上传选项卡留空,同时使用以下内容填充正文数据选项卡:

${__FileToString(/my/awesome/file/path${__eval({awesome_json_file_name_with_no_dottxt_in_end_altough_it_has_it})}.txt,,)}

在没有正文数据的情况下运行服务器确实会到达我设置的断点处的函数。所以我知道路由路径很好。将上述代码添加到正文数据会导致 415 错误 - 不支持的媒体类型。以下是 JMeter 的输出文件提供的 httpsample:

<httpSample t="8023" it="0" lt="8023" ct="2" ts="1544434665189" s="false" lb="HTTP Request" rc="415" rm="Unsupported Media Type" tn="Thread Group 1-3" dt="text" by="382" sby="281" ng="1" na="1">
<responseHeader class="java.lang.String">HTTP/1.1 415 Unsupported Media Type
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: todays_awesome_date
Content-Length: 103
</responseHeader>
  <requestHeader class="java.lang.String">Connection: keep-alive
Content-Length: 37
Content-Type: multipart/form-data; boundary=jBtzRzXGjCNVf_3UH8LfxguE6qR9_xH
Host: awesome_ip_add
User-Agent: Apache-HttpClient/4.5.6 (Java/1.8.0_191)
</requestHeader>
  <responseData class="java.lang.String">{"Message":"The request entity's media type 'multipart/form-data' is not supported for this resource.'}</responseData>
  <cookies class="java.lang.String"></cookies>
  <method class="java.lang.String">POST</method>
  <queryString class="java.lang.String">--jBtzRzXGjCNVf_3UH8LfxguE6qR9_xH--&#xd;
</queryString>
  <java.net.URL>awesome_route_path</java.net.URL>
</httpSample>

问题也不在于 sql 语法。当通过 URL 给出参数时,它可以从控制器中的另一个函数正常运行。

我还尝试使用路径和参数名称填充文件上传,然后在参数中添加文件,它总是给出相同的错误代码。我只希望 JSON 参数填充函数的参数,以便可以按照代码所示使用它。我错过了什么?谢谢。

【问题讨论】:

    标签: json http asp.net-web-api jmeter webserver


    【解决方案1】:
    1. 将 HTTP Header Manager 添加为 HTTP 请求采样器的子项
    2. 将其配置为发送Content-Type 标头,其值为application/json

    3. 确保您在 HTTP 请求采样器中有 Use multipart/form-data for POST NOT CHECKED

    更多信息:REST API Testing - How to Do it Right

    【讨论】:

    • 谢谢,解决了 415 错误。但现在我坚持使用 JSON 格式。上述函数中的 invoiceInfo 参数(前面带有 [FromBody]) - 始终为空。我的 JSON 语法正确。 .NET 会自动将 JSON 解析为我创建的对象吗? JSON 中的标题是否必须与 InvoiceInfo 类中的字段对应?
    • 不幸的是,这不是我们可以帮助的,这是您正在测试的应用程序的特定问题,它似乎无法将您发送的 JSON 转换为 InvoiceInfo 对象,请查看应用程序日志以获取更多信息线索
    • 对于未来的读者:我按照您的建议阅读了应用程序日志,发现以下行:解析值时遇到意外字符:$。路径 '',第 0 行,位置 0,其中 $ 是上述 JMeter 请求正文的第一个字符。 .NET 从字面上接收它,而不是作为 Javascript,因此它尝试将此命令转换为 JSON。使用实际的 JSON 而不是文件路径。
    猜你喜欢
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多