我用Java开始了一个小项目
我必须创建一个客户端,它将xml作为HTTP POST请求发送到url
我尝试使用java.net.*
包(以下是一段代码),但我收到的错误如下:
java.io.IOException: Server returned HTTP response code: 500 for URL: "target url"
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1441)
at newExample.main(newExample.java:36)
我的代码如下:
try {
URL url = new URL("target url");
URLConnection connection = url.openConnection();
if( connection instanceof HttpURLConnection )
((HttpURLConnection)connection).setRequestMethod("POST");
connection.setRequestProperty("Content-Length", Integer.toString(requestXml.length()) );
connection.setRequestProperty("Content-Type","text/xml; charset:ISO-8859-1;");
connection.setDoOutput(true);
connection.connect();
// Create a writer to the url
PrintWriter writer = new PrintWriter(new
OutputStreamWriter(connection.getOutputStream()));
// Get a reader from the url
BufferedReader reader = new BufferedReader(new
InputStreamReader(connection.getInputStream()));
writer.println();
writer.println(requestXml);
writer.println();
writer.flush();
String line = reader.readLine();
while( line != null ) {
System.out.println( line );
line = reader.readLine();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
请帮助您提供合适的示例或其他任何方式。
指出上述代码中的错误/错误或其他可能性。
我的Web服务处于spring框架
要发送的xml是字符串格式:requestXml
答案 0 :(得分:21)
问题在于代码
// Get a reader from the url
BufferedReader reader = new BufferedReader(new
InputStreamReader(connection.getInputStream()));
由于服务可能并不总能为您返回正确的响应...当您通过http调用服务时,服务器本身可能无法使用或服务不可用。因此,在读取流的响应之前,应始终检查响应代码,具体取决于您要决定是从inputStream读取成功响应还是从errorStream读取失败或异常情况的响应代码。
BufferedReader reader = null;
if(connection.getResponseCode() == 200)
{
reader = new BufferedReader(new
InputStreamReader(connection.getInputStream()));
}
else
{
reader = new BufferedReader(new
InputStreamReader(connection.getErrorStream()));
}
这样可以解决问题
答案 1 :(得分:3)
问题出在您的服务器代码或服务器配置中:
10.5.1 500内部服务器错误
服务器遇到意外情况,导致无法完成请求。
如果服务器在您的控制之下(应该是,如果我查看URL [编辑前] ),那么请查看服务器日志。
答案 2 :(得分:1)
好吧,你应该关闭你的流和连接。 Java 7或http://projectlombok.org/的自动资源管理可以提供帮助。但是,这可能不是主要问题。
主要问题是服务器端失败。 HTTP代码500表示服务器端错误。我无法告诉你原因,因为我不知道服务器端部分。也许你应该查看服务器的日志。
答案 3 :(得分:1)
我认为您的问题是在编写和关闭输出流之前打开输入流。当然,Sun Tutorial也是这样做的。
如果过早打开输入流,输出流可能会自动关闭,导致服务器看到空的POST请求。这可能足以使其混淆并发送500响应。
即使这不是导致500错误的原因,按照教程中列出的顺序执行操作也是一个好主意。首先,如果您在完成写入请求之前意外地读取了响应,则可能(至少暂时)锁定连接。 (事实上,看起来您的代码正在执行此操作,因为您在从读取器读取之前没有关闭编写器。)
另一个问题是您的代码在所有情况下都不会关闭连接,因此可能会泄漏网络连接。如果它反复执行此操作,则可能会导致更多IOExceptions。
答案 4 :(得分:0)
如果要调用外部Web服务并在REST调用中传递JSON,请检查传递的值的数据类型。
示例:
{ "originalReference":"8535064088443985",
"modificationAmount":
{ "amount":"16.0",
"currency":"AUD"
},
"reference":"20170928113425183949",
"merchantAccount":"MOM1"
}
在此示例中,amount的值作为字符串发送,webservice调用失败,Server返回HTTP响应代码:500。 但当发送金额:16.0,即整数通过时,电话就通过了。虽然您在调用此类外部API时已经引用了API文档,但可能会错过这样的小细节。