PostTest.java Source code

Java tutorial

Introduction

Here is the source code for PostTest.java

Source

/*
   This program is a part of the companion code for Core Java 8th ed.
   (http://horstmann.com/corejava)
    
   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.
    
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
    
   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.SwingWorker;

/**
 * This program demonstrates how to use the URLConnection class for a POST request.
 * @version 1.20 2007-06-25
 * @author Cay Horstmann
 */
public class PostTest {
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new PostTestFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });
    }
}

class PostTestFrame extends JFrame {
    /**
     * Makes a POST request and returns the server response.
     * @param urlString the URL to post to
     * @param nameValuePairs a map of name/value pairs to supply in the request.
     * @return the server reply (either from the input stream or the error stream)
     */
    public static String doPost(String urlString, Map<String, String> nameValuePairs) throws IOException {
        URL url = new URL(urlString);
        URLConnection connection = url.openConnection();
        connection.setDoOutput(true);

        PrintWriter out = new PrintWriter(connection.getOutputStream());

        boolean first = true;
        for (Map.Entry<String, String> pair : nameValuePairs.entrySet()) {
            if (first)
                first = false;
            else
                out.print('&');
            String name = pair.getKey();
            String value = pair.getValue();
            out.print(name);
            out.print('=');
            out.print(URLEncoder.encode(value, "UTF-8"));
        }

        out.close();

        Scanner in;
        StringBuilder response = new StringBuilder();
        try {
            in = new Scanner(connection.getInputStream());
        } catch (IOException e) {
            if (!(connection instanceof HttpURLConnection))
                throw e;
            InputStream err = ((HttpURLConnection) connection).getErrorStream();
            if (err == null)
                throw e;
            in = new Scanner(err);
        }

        while (in.hasNextLine()) {
            response.append(in.nextLine());
            response.append("\n");
        }

        in.close();
        return response.toString();
    }

    public PostTestFrame() {
        setTitle("PostTest");

        northPanel = new JPanel();
        add(northPanel, BorderLayout.NORTH);
        northPanel.setLayout(new GridLayout(0, 2));
        northPanel.add(new JLabel("Host: ", SwingConstants.TRAILING));
        final JTextField hostField = new JTextField();
        northPanel.add(hostField);
        northPanel.add(new JLabel("Action: ", SwingConstants.TRAILING));
        final JTextField actionField = new JTextField();
        northPanel.add(actionField);
        for (int i = 1; i <= 8; i++)
            northPanel.add(new JTextField());

        final JTextArea result = new JTextArea(20, 40);
        add(new JScrollPane(result));

        JPanel southPanel = new JPanel();
        add(southPanel, BorderLayout.SOUTH);
        JButton addButton = new JButton("More");
        southPanel.add(addButton);
        addButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                northPanel.add(new JTextField());
                northPanel.add(new JTextField());
                pack();
            }
        });

        JButton getButton = new JButton("Get");
        southPanel.add(getButton);
        getButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                result.setText("");
                final Map<String, String> post = new HashMap<String, String>();
                for (int i = 4; i < northPanel.getComponentCount(); i += 2) {
                    String name = ((JTextField) northPanel.getComponent(i)).getText();
                    if (name.length() > 0) {
                        String value = ((JTextField) northPanel.getComponent(i + 1)).getText();
                        post.put(name, value);
                    }
                }
                new SwingWorker<Void, Void>() {
                    protected Void doInBackground() throws Exception {
                        try {
                            String urlString = hostField.getText() + "/" + actionField.getText();
                            result.setText(doPost(urlString, post));
                        } catch (IOException e) {
                            result.setText("" + e);
                        }
                        return null;
                    }
                }.execute();
            }
        });

        pack();
    }

    private JPanel northPanel;
}