多个 POST 请求 rest-assured 第二次出现 500 错误
Multiple POST requests with rest-assured got 500 error on second
我需要一个一个发送很多请求。我有一个代码:
public void sendRestRequest(String xmlFile){
try{
String myRequest = generateStringFromResource(xmlFile);
given().auth().basic(prop.getProperty("restLogin"), prop.getProperty("restPassword"))
.contentType("application/xml")
.body(myRequest.getBytes(StandardCharsets.UTF_8))
.when()
.post(prop.getProperty("restURL"))
.then().
assertThat().statusCode(200).and().
assertThat().body("status", equalTo("UPLOADED"));
}
catch (Exception e){ LOG.error(String.valueOf(e)); }
}
public static String generateStringFromResource(String path) throws IOException {
return new String(Files.readAllBytes(Paths.get(path)));
}
我可以成功创建第一个请求。但是在第二个中,我有 500 个状态代码而不是 200。这样的错误消息:
at io.restassured.internal.ResponseSpecificationImpl$HamcrestAssertionClosure.validate(ResponseSpecificationImpl.groovy:483)
at io.restassured.internal.ResponseSpecificationImpl$HamcrestAssertionClosure$validate.call(Unknown Source)
at io.restassured.internal.ResponseSpecificationImpl.validateResponseIfRequired(ResponseSpecificationImpl.groovy:655)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:210)
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:59)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:166)
at io.restassured.internal.ResponseSpecificationImpl.statusCode(ResponseSpecificationImpl.groovy:123)
at io.restassured.specification.ResponseSpecification$statusCode[=12=].callCurrent(Unknown Source)
at io.restassured.internal.ResponseSpecificationImpl.statusCode(ResponseSpecificationImpl.groovy:131)
at io.restassured.internal.ValidatableResponseOptionsImpl.statusCode(ValidatableResponseOptionsImpl.java:119)
可能有人有想法吗?我猜应该是连接更近一些之类的。
在服务器端,问题出在xml文件上,但这很奇怪,因为如果我第一次发送同一个文件就没有问题。经过一些尝试,我决定使用不同的方法,效果很好:
public void sendRestRequest(String xmlFile) throws IOException {
FileInputStream fis = new FileInputStream("configuration.properties");
prop.load(fis);
try {
URL url = new URL(prop.getProperty("restURL"));
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/xml");
conn.setRequestProperty("Authorization", prop.getProperty("basic"));
String input = generateStringFromResource(xmlFile);
OutputStream os = conn.getOutputStream();
os.write(input.getBytes());
os.flush();
if (conn.getResponseCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
}
BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
StringBuilder responseStrBuilder = new StringBuilder();
String output;
while ((output = br.readLine()) != null) {responseStrBuilder.append(output);}
conn.disconnect();
JSONObject result = new JSONObject(responseStrBuilder.toString());
Assert.assertEquals(result.getString("status"), "UPLOADED");
} catch (IOException e) {
LOG.error(String.valueOf(e));
}
}
我需要一个一个发送很多请求。我有一个代码:
public void sendRestRequest(String xmlFile){
try{
String myRequest = generateStringFromResource(xmlFile);
given().auth().basic(prop.getProperty("restLogin"), prop.getProperty("restPassword"))
.contentType("application/xml")
.body(myRequest.getBytes(StandardCharsets.UTF_8))
.when()
.post(prop.getProperty("restURL"))
.then().
assertThat().statusCode(200).and().
assertThat().body("status", equalTo("UPLOADED"));
}
catch (Exception e){ LOG.error(String.valueOf(e)); }
}
public static String generateStringFromResource(String path) throws IOException {
return new String(Files.readAllBytes(Paths.get(path)));
}
我可以成功创建第一个请求。但是在第二个中,我有 500 个状态代码而不是 200。这样的错误消息:
at io.restassured.internal.ResponseSpecificationImpl$HamcrestAssertionClosure.validate(ResponseSpecificationImpl.groovy:483)
at io.restassured.internal.ResponseSpecificationImpl$HamcrestAssertionClosure$validate.call(Unknown Source)
at io.restassured.internal.ResponseSpecificationImpl.validateResponseIfRequired(ResponseSpecificationImpl.groovy:655)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:210)
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:59)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:166)
at io.restassured.internal.ResponseSpecificationImpl.statusCode(ResponseSpecificationImpl.groovy:123)
at io.restassured.specification.ResponseSpecification$statusCode[=12=].callCurrent(Unknown Source)
at io.restassured.internal.ResponseSpecificationImpl.statusCode(ResponseSpecificationImpl.groovy:131)
at io.restassured.internal.ValidatableResponseOptionsImpl.statusCode(ValidatableResponseOptionsImpl.java:119)
可能有人有想法吗?我猜应该是连接更近一些之类的。
在服务器端,问题出在xml文件上,但这很奇怪,因为如果我第一次发送同一个文件就没有问题。经过一些尝试,我决定使用不同的方法,效果很好:
public void sendRestRequest(String xmlFile) throws IOException {
FileInputStream fis = new FileInputStream("configuration.properties");
prop.load(fis);
try {
URL url = new URL(prop.getProperty("restURL"));
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/xml");
conn.setRequestProperty("Authorization", prop.getProperty("basic"));
String input = generateStringFromResource(xmlFile);
OutputStream os = conn.getOutputStream();
os.write(input.getBytes());
os.flush();
if (conn.getResponseCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
}
BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
StringBuilder responseStrBuilder = new StringBuilder();
String output;
while ((output = br.readLine()) != null) {responseStrBuilder.append(output);}
conn.disconnect();
JSONObject result = new JSONObject(responseStrBuilder.toString());
Assert.assertEquals(result.getString("status"), "UPLOADED");
} catch (IOException e) {
LOG.error(String.valueOf(e));
}
}