如何清理以下 POST JAVA 方法

发布于 2024-11-15 10:53:53 字数 2990 浏览 0 评论 0原文

我有以下方法,它调用 POST 服务,它返回 XML,我想将元素的属性放入 HashMap

XML 格式是:

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

我想要整理的方法是:

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();
        }
    }

提前感谢大家。

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

The XML format is:

<?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.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

拍不死你 2024-11-22 10:53:53

有两种方法可以简化 XML 解析。

  1. 如果您有 XML 架构,JAXB 可以进行 XML 到 Java 的转换。

  2. 您可以创建一个实用程序类,通过在构造函数中传递 XML 来解析名称值对。

与您原来的问题稍微无关,但是,如果您使用 myMethod() 连接到多个 URL,那么我会进行并行调用以加快响应速度。查看 java.util.concurrent.ScheduledExecutorService

There are two ways to simplify XML parsing.

  1. If you have the XML schema then, JAXB can do the XML to Java conversion.

  2. You can create a utility class to parse the name value pairs by passing it the XML in a constructor.

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. Check out java.util.concurrent.ScheduledExecutorService

迷鸟归林 2024-11-22 10:53:53

首先,你的方法太长了。这可能更适合代码审查,但您必须学习如何使用提取方法重构。以下是我无意识点击几次后得到的结果:

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;
}

其他​​更改:

  • IOUtils类用于简化I/O繁琐的任务
  • 稍微简化了异常处理(嗯,实际上,删除了)

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. 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 tasks
  • slightly simplified exception handling (well, actually, removed)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文