"Application/vnd.api+json" 抛出 "Unsupported Media Type"
"Application/vnd.api+json" throws "Unsupported Media Type"
我正在使用 Rest Assured 为 POST 呼叫自动执行 API,对于 Content-Type 和 ACCEPT header 我必须使用“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"}}
我已尝试按照其他 posts/comment 的建议将 Content-Type 更改为 application/json,但这对我的资源来说似乎不正确。
目前,我正在使用 Rest Assured v4.3.0 和 json-path v4.3.0。
此外,为了构建请求 body 我正在使用 com.google.gson.JsonObject 库。
在日志中,您可以看到正在发送“charset=ISO-8859-1”,这是由 Rest Assured 自动添加的,.config() 禁用了它和字符集未发送
试试下面的方法
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();
这也需要静态导入
import static io.restassured.config.EncoderConfig.encoderConfig;
我正在使用 Rest Assured 为 POST 呼叫自动执行 API,对于 Content-Type 和 ACCEPT header 我必须使用“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"}}
我已尝试按照其他 posts/comment 的建议将 Content-Type 更改为 application/json,但这对我的资源来说似乎不正确。
目前,我正在使用 Rest Assured v4.3.0 和 json-path v4.3.0。 此外,为了构建请求 body 我正在使用 com.google.gson.JsonObject 库。
在日志中,您可以看到正在发送“charset=ISO-8859-1”,这是由 Rest Assured 自动添加的,.config() 禁用了它和字符集未发送
试试下面的方法
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();
这也需要静态导入
import static io.restassured.config.EncoderConfig.encoderConfig;