简体   繁体   English

如何清理以下 POST JAVA 方法

[英]How can I clean up the following POST JAVA method

I have the following method which calls a POST service and it returns XML which I want to put the attributes of the element into a HashMap我有以下调用 POST 服务的方法,它返回 XML 我想将元素的属性放入 HashMap

The XML format is: XML 格式为:

<?xml version="1.0"?><paul><ncresponse
atA="14"
atB="10452775"
atC="0">
</ncresponse></paul>

The method I want to tidy up is:我要整理的方法是:

private HashMap<String, String> myMethod(URL url) throws Exception{
    String dataToSend = createUrlParameters();
    HttpURLConnection connection = null;
    HashMap<String, String> keyValues = new HashMap<String, String>();

    try {
        //Create connection
        connection = (HttpURLConnection)url.openConnection();
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        connection.setRequestProperty("Content-Length", "" + Integer.toString(dataToSend.getBytes().length));
        connection.setRequestProperty("Content-Language", "en-US");

        connection.setUseCaches(false);
        connection.setDoInput(true);
        connection.setDoOutput(true);

        //Send request
        DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
        wr.writeBytes(dataToSend);
        wr.flush();
        wr.close();

        //Get Response
        InputStream is = connection.getInputStream();
        BufferedReader rd = new BufferedReader(new InputStreamReader(is));
        String line;
        StringBuffer response = new StringBuffer();

        while((line = rd.readLine()) != null) {
            response.append(line);
            response.append('\r');
        }

        rd.close();

        System.out.println(response.toString());

        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        org.xml.sax.InputSource inStream = new org.xml.sax.InputSource();
        inStream.setCharacterStream(new java.io.StringReader(response.toString()));
        Document doc = dBuilder.parse(inStream);
        doc.getDocumentElement().normalize();

        NodeList nList = doc.getElementsByTagName("ncresponse");

        for (int temp = 0; temp < nList.getLength(); temp++) {
           Node nNode = nList.item(temp);
           if (nNode.getNodeType() == Node.ELEMENT_NODE) {
               Element eElement = (Element) nNode;
               NamedNodeMap attrs = eElement.getAttributes();
                int len = attrs.getLength();
                for (int i=0; i<len; i++) {
                    Attr attr = (Attr)attrs.item(i);
                    //System.out.println(" " + attr.getNodeName() + "=\"" + attr.getNodeValue() + "\"");
                    keyValues.put(attr.getNodeName(), attr.getNodeValue());
                }
            }
        }

        return keyValues;
    } catch (Exception e) {
        e.printStackTrace();

        return null;
    } finally {

        if(connection != null) {
            connection.disconnect();
        }
    }

Thanks in advance guys.提前谢谢各位。

There are two ways to simplify XML parsing.有两种方法可以简化 XML 解析。

  1. If you have the XML schema then, JAXB can do the XML to Java conversion.如果您有 XML 架构,那么JAXB可以将 XML 转换为 ZD52387880E1522817A723。

  2. You can create a utility class to parse the name value pairs by passing it the XML in a constructor.您可以创建实用程序 class 来解析名称值对,方法是在构造函数中将 XML 传递给它。

Slightly unrelated to your original question but, if you are using myMethod() to connect to multiple URLs then, I would make parallel calls to speed up the response.与您的原始问题略有无关,但是,如果您使用 myMethod() 连接到多个 URL,那么我会进行并行调用以加快响应速度。 Check out java.util.concurrent.ScheduledExecutorService查看java.util.concurrent.ScheduledExecutorService

First of all, your method is way too long.首先,你的方法太长了。 This probably more fits to Code Review , but you have to learn how to use Extract method refactoring.这可能更适合Code Review ,但是您必须学习如何使用Extract 方法重构。 Here is what I got after few mindless clicks:这是我在几次无意识的点击后得到的:

private Map<String, String> myMethod(URL url) throws Exception {
    HttpURLConnection connection = null;

    try {
        String dataToSend = createUrlParameters();
        connection = createConnection(url, dataToSend);
        sendRequest(dataToSend, connection);
        return parseResponse(IOUtils.toString(connection.getInputStream()));
    } finally {
        if (connection != null) {
            connection.disconnect();
        }
    }
}

private Map<String, String> parseResponse(final String responseXml) throws IOException, ParserConfigurationException, SAXException {
    Document doc = parseXml(responseXml);
    return extractAttributes(doc);
}

private Map<String, String> extractAttributes(Document doc) {
    NodeList nList = doc.getElementsByTagName("ncresponse");
    Map<String, String> keyValues = new HashMap<String, String>();

    for (int temp = 0; temp < nList.getLength(); temp++) {
        Node nNode = nList.item(temp);
        if (nNode.getNodeType() == Node.ELEMENT_NODE) {
            Element eElement = (Element) nNode;
            NamedNodeMap attrs = eElement.getAttributes();
            int len = attrs.getLength();
            for (int i = 0; i < len; i++) {
                Attr attr = (Attr) attrs.item(i);
                keyValues.put(attr.getNodeName(), attr.getNodeValue());
            }
        }
    }

    return keyValues;
}

private Document parseXml(String responseXml) throws ParserConfigurationException, SAXException, IOException {
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
    org.xml.sax.InputSource inStream = new org.xml.sax.InputSource();
    inStream.setCharacterStream(new StringReader(responseXml));
    Document doc = dBuilder.parse(inStream);
    doc.getDocumentElement().normalize();
    return doc;
}

private void sendRequest(String dataToSend, HttpURLConnection connection) throws IOException {
    IOUtils.copy(new StringReader(dataToSend), connection.getOutputStream());
}

private HttpURLConnection createConnection(URL url, String dataToSend) throws IOException {
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setRequestMethod("POST");
    connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    connection.setRequestProperty("Content-Length", "" + Integer.toString(dataToSend.getBytes().length));
    connection.setRequestProperty("Content-Language", "en-US");

    connection.setUseCaches(false);
    connection.setDoInput(true);
    connection.setDoOutput(true);
    return connection;
}

Other changes:其他变化:

  • IOUtils class is used to simplify I/O tedious tasksIOUtils class 用于简化 I/O 繁琐任务
  • slightly simplified exception handling (well, actually, removed)稍微简化的异常处理(实际上,已删除)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM