java - postman 给出了正确的响应,但放心返回了错误的响应

标签 java wireshark rest-assured

几个月以来我一直在放心地工作。

在从开源 API 获取数据时观察到,当通过 Postman API 进行 GET 调用时,会返回 200 并收到有效/预期数据。 enter image description here

编写以下代码(Java 使用 Rest-Assured)以从 API 获取相同的数据:

package com.type.GetFuelTypeFromAPI;

import static io.restassured.RestAssured.given;

import java.net.MalformedURLException;
import java.net.URL;
import org.testng.annotations.Test;

import io.restassured.response.Response;

public class SampleGetAPI {

@Test
public void getDetails() throws MalformedURLException {

    Response response=
    given()
        .queryParam("cmd", "getTrims")
        .queryParam("make", "Abarth")
        .queryParam("year", "1955")
        .queryParam("model", "207")
    .when()
        .get(new URL("https://carqueryapi.com/api/0.3/"));

    String responseBody = response.body().asString();
    System.out.println(responseBody);
}
}

代码输出为:

[TestNG] Running:
C:\Users\AaSomvanshi\AppData\Local\Temp\testng-eclipse-1657322415\testng-customsuite.xml

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /api/0.3/
on this server.<br />
</p>
<p>Additionally, a 403 Forbidden
error was encountered while trying to use an ErrorDocument to handle the request.</p>
</body></html>

PASSED: getDetails

===============================================
Default test
Tests run: 1, Failures: 0, Skips: 0
===============================================


===============================================
Default suite
Total tests run: 1, Failures: 0, Skips: 0
===============================================

有人可以指导我如何解决这个问题吗?

最佳答案

经过大量搜索后,执行以下步骤:

使用 Wireshark 捕获 postman 和放心的 API 调用。

Postman API 调用包含以下值:


GET/api/0.3/?cmd=getTrims&make=Abarth&year=1955&model=207 HTTP/1.1\r\n

缓存控制:无缓存\r\n

postman token :c70faee6-f00c-47b6-9c6a-bb1c4ffe5cf4\r\n

用户代理:PostmanRuntime/7.6.0\r\n

接受:/\r\n

cookie:__cfduid=dcce85c35c3e5eb33524b0a1a79b6bf2b1548159374\r\n

接受编码:gzip、deflate\r\n

引荐来源:https://carqueryapi.com/api/0.3/?cmd=getTrims&make=Abarth&year=1955&model=207\r\n

主机:www.carqueryapi.com\r\n

连接:保持 Activity 状态\r\n

\r\n

[完整请求 URI:http://www.carqueryapi.com/api/0.3/?cmd=getTrims&make=Abarth&year=1955&model=207]

[HTTP 请求 1/1] [帧内响应:350]


Rest-Assured API 调用包含以下值:


GET/api/0.3/?cmd=getTrims&make=Abarth&year=1955&model=207 HTTP/1.1\r\n

接受:/\r\n

主机:www.carqueryapi.com\r\n

连接:保持 Activity 状态\r\n

用户代理:Apache-HttpClient/4.5.3 (Java/1.8.0_171)\r\n

接受编码:gzip,deflate\r\n

\r\n

[完整请求 URI:http://www.carqueryapi.com/api/0.3/?cmd=getTrims&make=Abarth&year=1955&model=207]

[HTTP 请求 1/1]

[帧中的响应:769]


观察:

header User-Agent的值不同。该 API 阻止了对 Apache-HttpClient 的请求,但允许 PostmanRuntime/7.6.0

更新了代码,使 header User-Agent 的值为 PostmanRuntime/7.6.0 并且它有效。

下面是工作代码:

package com.type.GetFuelTypeFromAPI;

import static io.restassured.RestAssured.given;

import java.net.MalformedURLException;
import java.net.URL;
import org.testng.annotations.Test;

import io.restassured.response.Response;

public class SampleGetAPI {

@Test
public void getDetails() throws MalformedURLException {

    Response response=
    given()
        .header("User-Agent", "PostmanRuntime/7.6.0")
        .queryParam("cmd", "getTrims")
        .queryParam("make", "Abarth")
        .queryParam("year", "1955")
        .queryParam("model", "207")
    .when()
        .get(new URL("https://carqueryapi.com/api/0.3/"));

    String responseBody = response.body().asString();
    System.out.println(responseBody);
}
}

关于java - postman 给出了正确的响应,但放心返回了错误的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54321704/

相关文章:

java - 使用java配置在Spring MVC中重定向404错误

android - 如何在Android中查看网络数据包?

java - 使用 Jayway 的放心验证 XML 属性

java - sqlite 返回表中的随机记录

Java 将 List 参数作为引用

java反射失败

C: 在 linux 中发送 http get 请求

networking - IP数据包在接收方有尾部,但在发送方没有

angularjs - 使用 X-XSRF-TOKEN(如 angularjs) header 确保 CSRF 保护

java - 如何在 RestAssured 中发送动态 SOAP XML 请求负载