Java 我在REST-Assured API POST请求中遇到问题

Java 我在REST-Assured API POST请求中遇到问题,java,spring,rest,spring-boot,Java,Spring,Rest,Spring Boot,当我在eclipse的普通java项目中的java文件中执行以下代码时,它正在成功运行: given() .log().all() .contentType("application/json") .auth().basic(APIKEY, PASSWORD) .body("{\"customName\":\"name\",\"customGender\":\"male\",\"customDateofBirth\":\"2010-12-08\",\"customRelationship\":\

当我在eclipse的普通java项目中的java文件中执行以下代码时,它正在成功运行:

given()
.log().all()
.contentType("application/json")
.auth().basic(APIKEY, PASSWORD)
.body("{\"customName\":\"name\",\"customGender\":\"male\",\"customDateofBirth\":\"2010-12-08\",\"customRelationship\":\"child\"}")
.when()
.post("https://api.bamboohr.com/api/gateway.php/companyName/v1/employees/1420/tables/customDependants(IN)")
.then().assertThat().statusCode(200);
执行成功后,在指定表中添加一条新记录;(CustomDependents(在中),在此表格中)

然而,当我在一个spring boot项目中运行同样的程序时,我得到一个错误,说:

java.lang.AssertionError:1预期失败。预期状态代码 但是是

仅供参考:我已经尝试使用其他请求参数来代替
contentType(“application/json”)
如:
headers(“Content-Type”,contentType.json)

错误日志:

请求日志:

Request method: POST 
Request URI:    https://api.bamboohr.com/api/gateway.php/companyName/v1/employees/1420/tables/customDependants%28IN%29
Proxy: <none>  
Request params: <none>  
Query params: <none> 
Form params: <none>  
Path params: <none>  
Headers: Accept=*/* Content-Type=application/json ; charset=UTF-8  
Cookies: <none>  
Multiparts: <none>  
Body: {
     "customName": "name",
     "customGender": "male",
     "customDateofBirth": "2010-12-08",
     "customRelationship": "child"  
    }
请求方法:POST
请求URI:https://api.bamboohr.com/api/gateway.php/companyName/v1/employees/1420/tables/customDependants%28IN%29
代理:
请求参数:
查询参数:
表格参数:
路径参数:
标题:Accept=*/*Content Type=application/json;字符集=UTF-8
曲奇饼:
多部分:
正文:{
“customName”:“name”,
“性别”:“男性”,
“出生日期”:“2010-12-08”,
“自定义关系”:“子项”
}
我在Spring引导代码中遇到以下错误:

private void employeeDependents(int empId) {
        /*Employees Repository*/ 
        TaBhr taBhr = taBhrRepository.findByBhrId(empId);
        /*Grabbing an employee of given ID from Employees Repository*/ 
        Optional<Employee> employee = employeeRepository.findById(taBhr.getEmpId());
        Gson gson = new GsonBuilder().serializeNulls().create();
        List<EmployeeDependent> list = employee.isPresent()
                ? employeeDependentRepository.findByDependentsEmpnumber(employee.get().getNumber())
                : null;
        if (list != null) {
            for (EmployeeDependent employeeDependent : list) {
                /*Sets the Data Transfer Object*/ 
                EmployeeDependentDTO employeeDependentDTO = new EmployeeDependentDTO();
                employeeDependentDTO.setFirstName(employeeDependent.getEdName());
                employeeDependentDTO.setDateOfBirth(employeeDependent.getEdDateOfBirth());
                employeeDependentDTO.setRelationship(employeeDependent.getDependentGender().getEdRelationshipType());
                employeeDependentDTO.setGender(employeeDependent.getDependentGender().getGender());
                TaBhr tabhr = taBhrRepository.findByEmpId(employee.get().getId());
                if (tabhr != null) {
                    #LOG.info("BHR ID: {}", empId);#
                    given().log().all().contentType("application/json").auth()
                            .basic(APIKEY, PASSWORD)
                            .body(gson.toJson(employeeDependentDTO)).when()
                            .post("https://api.bamboohr.com/api/gateway.php/companyName/v1/employees/1420/tables/customDependants(IN)")
                            .then().log().ifError().assertThat().statusCode(200);
                }
            }
        }
    }
private void employeeDependents(int-empId){
/*员工资源库*/
TaBhr TaBhr=taBhrRepository.findByBhrId(empId);
/*从员工存储库中获取具有给定ID的员工*/
可选employee=employeeRepository.findById(taBhr.getEmpId());
Gson Gson=new GsonBuilder().serializeNulls().create();
List=employee.isPresent()
?employeeDependentRepository.FindBydeDependentSempNumber(employee.get().getNumber())
:null;
如果(列表!=null){
for(EmployeeDependent EmployeeDependent:list){
/*设置数据传输对象*/
EmployeeDependentDTO EmployeeDependentDTO=新员工DependentDTO();
employeeDependentDTO.setFirstName(employeeDependent.getEdName());
employeeDependentDTO.setDateOfBirth(employeeDependent.getEdDateOfBirth());
employeeDependentDTO.setRelationship(employeeDependent.getDependentGender().getEdRelationshipType());
employeeDependentDTO.setGender(employeeDependent.getDependentGender().getGender());
TaBhr TaBhr=taBhrRepository.findByEmpId(employee.get().getId());
if(tabhr!=null){
#LOG.info(“BHR ID:{}”,empId)#
给定().log().all().contentType(“应用程序/json”).auth()
.basic(APIKEY、密码)
.body(gson.toJson(employeeDependentDTO)).when()
.post(“https://api.bamboohr.com/api/gateway.php/companyName/v1/employees/1420/tables/customDependants(IN)
.then().log().ifError().assertThat().statusCode(200);
}
}
}
}
当我运行时,它一直运行到被#s包围的日志,然后当API被命中时,响应是格式错误的XML。
gson.toJson(employeedependendto)
的值是
{“customName”:“abcd”,“customGender”:“男性”,“customDateofBirth”:“2010-12-08”,“customRelationship”:“child”}

此外,这里我将内容类型设置为JSON而不是XML,甚至负载也是JSON格式的,在postman和非spring引导项目中都可以使用

仅供参考:所有get请求在spring引导应用程序中都能正常工作,当我尝试使用post访问API时,只会收到上述错误,然而,如果我在非spring应用程序中执行相同的请求,一切都会正常工作。邮递员也是如此


请帮助我解释为什么它无法在spring boot应用程序中执行。

我在这里使用了另一种解决方案,使用java中的HttpURLConnection,它工作得很好,下面是替换上述放心代码的代码:

              try {
                    String rawData = "{\"customName\":\"success\",\"customGender\":\"male\",\"customDateofBirth\":\"2010-12-08\",\"customRelationship\":\"child\"}";
                    String url = "https://api.bamboohr.com/api/gateway.php/companyName/v1/employees/1420/tables/customDependants(IN)";
                    URL obj = new URL(url);
                    HttpURLConnection myURLConnection = (HttpURLConnection) obj.openConnection();

                    String userCredentials = APIKEY:PASSWORD;
                    String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userCredentials.getBytes()));

                    myURLConnection.setRequestProperty("Authorization", basicAuth);
                    myURLConnection.setRequestMethod("POST");
                    myURLConnection.setRequestProperty("Content-Type", "application/json");
                    myURLConnection.setRequestProperty("Accept", "application/json");
                    myURLConnection.setDoOutput(true);
                    byte[] outputInBytes = rawData.getBytes("UTF-8");
                    OutputStream w = myURLConnection.getOutputStream();

                    w.write(outputInBytes, 0, outputInBytes.length); 
                    w.close();

                    int responseCode = myURLConnection.getResponseCode();

                    BufferedReader in = new BufferedReader(new InputStreamReader(myURLConnection.getInputStream()));

                    String inputLine;
                    StringBuffer response = new StringBuffer();

                    while ((inputLine = in.readLine()) != null) {
                        response.append(inputLine);
                    }

                    in.close();

                    System.out.println("Response code : " + responseCode);
                    System.out.println(response.toString());

                    // Use Jsoup on response to parse it if it makes your work easier.
                } catch (Exception e) {
                    e.printStackTrace();
                }

如果有人能分享他们针对前一种方法的解决方案,这将是非常有用的。

我在这里使用了另一种解决方案,使用java中的HttpURLConnection,它工作得非常好,下面是取代上述放心代码的代码:

              try {
                    String rawData = "{\"customName\":\"success\",\"customGender\":\"male\",\"customDateofBirth\":\"2010-12-08\",\"customRelationship\":\"child\"}";
                    String url = "https://api.bamboohr.com/api/gateway.php/companyName/v1/employees/1420/tables/customDependants(IN)";
                    URL obj = new URL(url);
                    HttpURLConnection myURLConnection = (HttpURLConnection) obj.openConnection();

                    String userCredentials = APIKEY:PASSWORD;
                    String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userCredentials.getBytes()));

                    myURLConnection.setRequestProperty("Authorization", basicAuth);
                    myURLConnection.setRequestMethod("POST");
                    myURLConnection.setRequestProperty("Content-Type", "application/json");
                    myURLConnection.setRequestProperty("Accept", "application/json");
                    myURLConnection.setDoOutput(true);
                    byte[] outputInBytes = rawData.getBytes("UTF-8");
                    OutputStream w = myURLConnection.getOutputStream();

                    w.write(outputInBytes, 0, outputInBytes.length); 
                    w.close();

                    int responseCode = myURLConnection.getResponseCode();

                    BufferedReader in = new BufferedReader(new InputStreamReader(myURLConnection.getInputStream()));

                    String inputLine;
                    StringBuffer response = new StringBuffer();

                    while ((inputLine = in.readLine()) != null) {
                        response.append(inputLine);
                    }

                    in.close();

                    System.out.println("Response code : " + responseCode);
                    System.out.println(response.toString());

                    // Use Jsoup on response to parse it if it makes your work easier.
                } catch (Exception e) {
                    e.printStackTrace();
                }

如果有人能分享他们针对前一种方法的解决方案,这将非常有用。

请分享SpringBoot代码听起来你可能有一个坏的XML,基于以下响应:
X-BambooHR-Error-Message:Malformed XML
Hi@AntonNovopashin,我已经在我点击REST API的地方添加了Spring引导代码和更新的详细信息。请共享一个Spring引导代码听起来你可能有一个坏的XML,基于响应:X-BambooHR-Error-Message:Malformed XMLHi@AntonNovopashin,我已经在点击REST API的地方添加了Spring引导代码和更新的详细信息。