HTTP 500-Fehlermeldung, beim senden von XML an server
Ich bin versucht, senden Sie eine XML-Datei auf meine RESTful-web-server, und erhalten eine XML-Datei zurück, aber ich erhalte einen 500 Fehler.
java.io.IOException: Server returned HTTP response code: 500 for URL:
http://sps-psa-240:8080/NMCJWS/rest/jmsmon2/pub an
Sonne.net.www.Protokoll.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1436)
bei SendXML.senden(SendXML.java:151)
bei SendXML.main(SendXML.java:39)
Linie 151 ist InputStream response = uc.getInputStream();
Wenn ich die Auskommentierung System.out.println(((HttpURLConnection) uc).getResponseCode());
,
dann bekomme ich den gleichen Fehler auf OutputStreamWriter out = new OutputStreamWriter(uc.getOutputStream());
Ich weiß, funktioniert der server denn, ein Kollege hat diese Arbeit in Obj-C.
Hier ist mein code:
public class SendXML
{
public static void main(String[] args) throws SAXException, XPathExpressionException, ParserConfigurationException,
IOException, TransformerException
{
String xml = generateXML("AC24", "/fa/gdscc/dss24-apc");
send("localhost", xml);
}
public static String generateXML(String conn, String funcAddr) throws ParserConfigurationException, SAXException,
IOException, XPathExpressionException, TransformerException
{
/*
* <?xml version="1.0" encoding="UTF-8"?>
<JMSMON2Req>
<SubItem UID="iPAD-2031e616-de74-44a7-9292-3745d2b1ba21">
<FuncAddr>/fa/gdscc/con1-ac25</FuncAddr>
<ItemName>AZANG</ItemName>
<ItemName>ELANG</ItemName>
<Metadata key="UID">iPAD-2031e616-de74-44a7-9292-3745d2b1ba21</Metadata>
<Metadata key="CONN">1</Metadata>
</SubItem>
</JMSMON2Req>
*/
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true); //never forget this!
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse("http://sps-psa-240:8080/NMCWS/rest/conn/subsys/prof?ss=" + conn + "&pt=IPAD_DASHBOARD");
XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xpath.compile("/SubscrProf/DataItem/DataItemName");
Object result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList nodes = (NodeList) result;
//build xml
Document output = builder.newDocument();
//create root
org.w3c.dom.Element root = output.createElement("JMSMON2Req");
output.appendChild(root);
//create subitem
org.w3c.dom.Element subItemNode = output.createElement("SubItem");
subItemNode.setAttribute("UID", "IPAD-CN1-DSS26-SC151-PN230-AC26");
root.appendChild(subItemNode);
//create funcAddr
org.w3c.dom.Element funcAddrNode = output.createElement("FuncAddr");
Text text = output.createTextNode(funcAddr);
funcAddrNode.appendChild(text);
subItemNode.appendChild(funcAddrNode);
//create itemname
for (int i = 0; i < nodes.getLength(); i++)
{
org.w3c.dom.Element itemNameNode = output.createElement("SubItem");
text = output.createTextNode(nodes.item(i).getTextContent());
itemNameNode.appendChild(text);
subItemNode.appendChild(itemNameNode);
}
//create metadata uid
org.w3c.dom.Element metaDataNode = output.createElement("Metadata");
metaDataNode.setAttribute("key", "UID");
text = output.createTextNode("IPAD-CN1-DSS26-SC151-PN230-AC26");
metaDataNode.appendChild(text);
subItemNode.appendChild(metaDataNode);
//create metadata conn
org.w3c.dom.Element metaDataNode2 = output.createElement("Metadata");
metaDataNode2.setAttribute("key", "CONN");
text = output.createTextNode("4");
metaDataNode2.appendChild(text);
subItemNode.appendChild(metaDataNode2);
/////////////////
//Output the XML
//set up a transformer
TransformerFactory transfac = TransformerFactory.newInstance();
Transformer trans = transfac.newTransformer();
trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
trans.setOutputProperty(OutputKeys.INDENT, "yes");
//create string from xml tree
StringWriter sw = new StringWriter();
StreamResult out = new StreamResult(sw);
DOMSource source = new DOMSource(output);
trans.transform(source, out);
String xmlString = sw.toString();
//print xml
System.out.println("Here's the xml:\n" + xmlString);
return xmlString;
}
public static void send(String urladdress, String file) throws MalformedURLException, IOException
{
String charset = "UTF-8";
String s = URLEncoder.encode(file, charset);
//Open the connection and prepare to POST
URLConnection uc = new URL(urladdress).openConnection();
uc.setDoOutput(true);
uc.setRequestProperty("Accept-Charset", charset);
uc.setRequestProperty("Content-Type","text/xml");
try
{
//System.out.println(((HttpURLConnection) uc).getResponseCode());
OutputStreamWriter out = new OutputStreamWriter(uc.getOutputStream());
out.write(s);
out.flush();
InputStream response = uc.getInputStream();
BufferedReader r = new BufferedReader(new InputStreamReader(response));
String line;
while ((line = r.readLine()) != null)
System.out.println(line);
out.close();
response.close();
}
catch (IOException e)
{
e.printStackTrace(); //should do real exception handling
}
}
}
Ich bin nicht in der Lage zu testen, aber Sie müssen möglicherweise schließen Sie die Ausgabe-stream, bevor die Eingabe gelesen.
Schließen der Ausgabe-stream vor dem Lesen der Eingabe nicht beheben kann.
Stellen Sie sicher, dass die generierten XML ist die gleiche wie Ihre Kollegen, die arbeiten. Ich merke verwenden Sie die OMIT_XML_DECLARATION Eigenschaft mit einem " ja " Wert, aber die kommentierte Probe hat, die Erklärung. Darüber hinaus haben Sie zum anzeigen der server-Protokolle, wie andere vorgeschlagen haben, und hinzufügen, dass Fehler detail zu deiner Frage.
Wenn ich hinzufügen
org.w3c.dom.Element root = output.createElement("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
bekomme ich einen INVALID_CHARACTER_ERR: Eine ungültige oder illegale XML-Zeichen angegeben ist. Das ist, da es Leerzeichen im Namen. Trotzdem, dass zu beheben?
InformationsquelleAutor Raptrex | 2011-07-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dachte ich, mein problem. Ich hatte zu Kodieren xmlString in UTF-8
InformationsquelleAutor Raptrex
Blick in die logs auf dem server. Was verursacht die 500 Fehler?
Ist das ein RESTful web service, oder ein SOAP-web-service Sie Einreichen?
Erwägen, eine Art von XML<->Object framework wie JAXB oder XStream.
Erwägen, eine Art von RESTful-web-service-framework wie Jersey oder RestEasy.
Erwägen, eine Art von SOAP-Frameworks wie JAX-WS oder Apache Axis
Wir sind alle immer noch Fragen, was das server-log zeigt. Auch wenn Sie sind über ein rest-framework, gibt es möglicherweise einige zusätzliche debugging-Sie können schalten Sie, wie ein LoggingFilter in jersey.
InformationsquelleAutor Jim
Stellen Sie sicher, dass Sie die richtige Codierung.
URLEncoder.encode
ist, dass der Inhalt sicher für den transfer als 'application/x-www-form-urlencoded', aber Sie wahrscheinlich wollen, um die Verwendung von UTF-8.Auch
new OutputStreamWriter(...)
sollte geben Sie die gewünschte Kodierung. Sie sind derzeit mit der standard-Plattform-Codierung, die ist wahrscheinlich iso-8859-1.Dritten, versuchen Sie nicht zu mess around mit URLConnection selbst, wenn es genug libs dort herum,, das machen Sie das Leben leichter.
Hier ist die send-Methode erfolgt in Resty (Disclaimer: ich bin der Autor). HTTPClient ist eine andere Wahl zu betrachten, wie andere client-seitige Bibliotheken.
Nein, tut es nicht. Du hast wohl einfach Glück, weil ISO-8859-1 ist eine gültige Teilmenge von UTF-8 sind und Sie sind kodiert es zuerst mit RFC1738. Obwohl der Inhalt möglicherweise überlebt der server keine Ahnung, Sie verwendet RFC1738 auf den Inhalt.
So was würde ich ändern?
String charset = "UTF-8"; String s = URLEncoder.encode(file, charset);
?warum Sie denken, Sie haben zu URL-codieren? Es ist nicht Teil einer URL und der MIME-Typ ist nicht application/x-www-form-urlencoded. Verwenden Sie new OutputStreamWriter(stream, "UTF-8")
InformationsquelleAutor Jochen Bedersdorfer