【问题标题】:"Application/vnd.api+json" throws "Unsupported Media Type"“Application/vnd.api+json”抛出“不支持的媒体类型”
【发布时间】:2020-07-16 09:27:12
【问题描述】:

我正在使用 Rest Assured 为 POST 调用自动化 API,对于 Content-Type 和 ACCEPT 标头,我必须使用“application/vnd.api+json”。但每次我使用“application/vnd.api+json”时,我都会得到 415 状态码。 尽管使用 Postman 的同一个 POST 调用工作得非常好。

这是我的示例代码:

    ApiUtils.setBaseURI("xxxxx"); 
            ApiUtils.setBasePath("/orders"); 
            RequestSpecification request = RestAssured.given().auth().oauth2(BaseClass.token);
            request.header("ACCEPT", "application/vnd.api+json");
            request.header("Content-Type", "application/vnd.api+json");
            request.body(JsonCreator.createJson());
            Response response = request.post();

以下是收到的回复

Request method: POST
Request URI:    https://xxxxxx/orders

Headers:        ACCEPT=application/vnd.api+json
                Content-Type=application/vnd.api+json; charset=ISO-8859-1
Cookies:        <none>
Multiparts:     <none>
Body:
{
    "data": {
        "type": "orders",
        "attributes": {
            "external_id": "2020-04-04-172",
            "order_items": [
                {
                    "menu_item_id": "5d29ae25805aaf0009095410",
                    "variation_id": "5d29ae25805aaf0009095418",
                    "quantity": 1,
                    "note": "some note"
                }
            ],
            "revenue_center_id": "5d7b44021a2976000938da62",
            "order_type_id": "5d27329790a5ba0009386a75",
            "guests": [
                {
                    "first_name": "xx",
                    "last_name": "xx",
                    "email": "xx@gp.com",
                    "phone": "5551234567"
                }
            ],
            "tip_amount": "1.00"
        }
    }
}

{"errors":[{"status":415,"code":415,"title":"Content-Type must be JSON API-compliant"}],"jsonapi":{"version":"1.0"}}

我已尝试按照其他帖子/评论的建议将 Content-Type 更改为 application/json,但这对于我的资源来说似乎不正确。

目前,我正在使用 Rest Assured v4.3.0 和 json-path v4.3.0。 此外,为了构建请求正文,我正在使用 com.google.gson.JsonObject 库。

【问题讨论】:

  • 在 give() 和 then() 之后添加 log().all() 并在此处发布输出
  • @WilfredClement 我已经更新了我的回复正文

标签: rest rest-assured rest-assured-jsonpath


【解决方案1】:

在日志中,您可以看到“charset=ISO-8859-1”正在发送,这是由 Rest Assured 自动添加的,.config() 禁用它并且不发送字符集 p>

试试下面的

ApiUtils.setBaseURI("orders");
ApiUtils.setBasePath("/orders");
RequestSpecification request = RestAssured.given().auth().oauth2(BaseClass.token).header("Content-Type", "application/vnd.api+json").header("Accept", "application/vnd.api+json").config(RestAssured.config().encoderConfig(encoderConfig().appendDefaultContentCharsetToContentTypeIfUndefined(false))).log().all();
request.body(JsonCreator.createJson());
Response response = request.post();

这也需要静态导入

导入静态 io.restassured.config.EncoderConfig.encoderConfig;

https://github.com/rest-assured/rest-assured/wiki/Usage#avoid-adding-the-charset-to-content-type-header-automatically

【讨论】:

  • 同样的错误:状态码- 406 {"errors":[{"status":406,"code":406,"title":"Accept header must be JSON API-compliant"}] ,"jsonapi":{"version":"1.0"}}
  • 试用代码:---- ApiUtils.setBaseURI("orders"); ApiUtils.setBasePath("/orders"); RequestSpecification 请求 = RestAssured.given().header("Content-Type","application/vnd.api+json") .config(RestAssured.config().encoderConfig(encoderConfig().appendDefaultContentCharsetToContentTypeIfUndefined(false))) .log ()。全部(); request.body(JsonCreator.createJson());响应响应 = request.post();
  • 我似乎是一个不同的错误,而不是同一个错误,你之前得到了 415,现在我看到了 406。另外,在上面为什么我看不到 oauth 并接受头被发送?不过 - 我已经更新了我的答案,包括 oauth 和接受标题,格式与您在问题中提出的格式相同,试试这个并告诉我
  • 你的原始请求中唯一的变化应该是.config方法以及静态导入,其余的应该是这样
  • 我已经更新了答案并附有解释,请立即查看
猜你喜欢
  • 2020-12-23
  • 1970-01-01
  • 1970-01-01
  • 2020-06-02
  • 1970-01-01
  • 2013-01-30
  • 1970-01-01
  • 2017-07-16
  • 2017-02-23
相关资源
最近更新 更多