Как разместить объект JSON на URL?

Я пытаюсь опубликовать JSON в веб-сервисе, чтобы в ответ я мог получить JSON в ответ, я искал в Google, но большинство ответов я нашел для Android, но не для ядра Java, этот вопрос для Приложение Swing дам код, который я использовал ниже.

Класс подключения

public class Connection extends Thread {

private String url1;
private JSONObject data;
String line;
//Constuctor to initialize the variables.

public Connection(String url1, JSONObject data) {
    this.url1 = url1;
    this.data = data;
    start();
}

public void run() {
    ConnectionReaderWriter();
}

//To fetch the data from the input stream
public String getResult() {
    return line;
}

public String ConnectionReaderWriter() {
    URL url;
    HttpURLConnection connection = null;
    ObjectOutputStream out;
    try {
        /*URL url = new URL(Url.server_url + url1);     //Creating the URL.       
         URLConnection conn = url.openConnection();    //Opening the connection.
         conn.setDoOutput(true);
         OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
         wr.write(data);  //Posting the data to the ouput stream.
         wr.flush();
         BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
         line=rd.readLine();     //Reading the data from the input stream.       
         wr.close();
         rd.close();*/
        url = new URL(Url.server_url + url1);     //Creating the URL.
        connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-Type", "application/json");
        connection.setRequestProperty("Accept", "application/json");
        connection.setRequestProperty("api_key", "123456");
        connection.setUseCaches(false);
        connection.setDoInput(true);
        connection.setDoOutput(true);
        //Send request
        out = new ObjectOutputStream(connection.getOutputStream());
        out.writeObject(data);
        out.flush();
        out.close();
    } catch (MalformedURLException ex) {
        Logger.getLogger(Connection.class.getName()).log(Level.SEVERE, null, ex);
        String nonet = "No Network Connection";
        line = nonet;
    } catch (IOException ex) {
        Logger.getLogger(Connection.class.getName()).log(Level.SEVERE, null, ex);
        String nonet = "No Server Connection";
        line = nonet;
    }
    return line;  //Return te stream recived from the input stream.
}
}

Код с комментариями - это тот код, который я использовал раньше, когда передавал текст в виде URL-адреса. Вызов функции приведен ниже

JSONObject json = new JSONObject();
                json.put("username", username);
                json.put("password", passwordenc);                    
                Connection conn = new Connection(Url.login, json);
                conn.join();

При исполнении я получаю исключение, показанное ниже

Jan 20, 2014 1:18:32 PM SupportingClass.Connection ConnectionReaderWriter
SEVERE: null
java.io.NotSerializableException: org.json.JSONObject
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1180)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
at SupportingClass.Connection.ConnectionReaderWriter(Connection.java:74)
at SupportingClass.Connection.run(Connection.java:40)

Пожалуйста, сообщите мне проблему в этом коде или альтернативу этому методу.

3 ответа

Я дам ответ:

замещать out.writeObject(data); с out.write(data.toString().getBytes());

Вы пытались написать JSONObject объект, а writeObject() Метод попытается сериализовать объект, но потерпит неудачу, так как JSONObject Класс не реализует Сериализуемый.

JSon - это текст, поэтому вы не можете использовать ObjectOutputStream. Метод POST использует первую строку содержимого в качестве аргументов, поэтому перед фактическим содержимым вам потребуется пустая строка:

    OutputStream stream = connection.getOutputStream();
    stream.write('\r');
    stream.write('\n');
    out = new OutputStreamWriter(stream, "UTF-8");
    out.write(data.toString());
    out.flush();
    out.close();

РЕДАКТИРОВАТЬ: на самом деле нам нужно CR LF, поэтому println() может не работать.

Если вам неудобно пользоваться HttpURLConnection изначально вы можете использовать библиотеку абстракций. Там много сильных. Одним из них является DavidWebb. Вы можете найти длинный список альтернатив в конце этой страницы.

С этой библиотекой ваш код будет короче и более читабельным:

JSONObject nameAndPassword = new JSONObject();
// set name and password

Webb webb = Webb.create();
JSONObject result = webb.post("your_serverUrl")
        .header("api_key", "123456")
        .useCaches(false)
        .body(nameAndPassword)
        .ensureSuccess()
        .asJsonObject()
        .getBody();

Код показывает только ту часть, которая будет работать в вашем run() Метод Нити. Нет необходимости устанавливать Content-Type заголовок, потому что это делается автоматически, определяя тип объекта, который вы указали в качестве тела. То же самое верно для Accept заголовок.

Я предполагал, что вы получите объект JSON от службы REST, поскольку для заголовка "Accept" установлено значение "application/json". Для получения простой строки можно написать String result = ... .asString().getBody(),

Кстати, библиотека была разработана с учетом Android, но ее можно использовать и с Swing или со стороны сервера. Возможно, вы выберете другую библиотеку (например, клиент Джерси), потому что у вас нет ограничений по размеру. DavidWebb весит около 20 килобайт, в то время как большинство других библиотек добавляют несколько сотен килобайт к вашим артефактам развертывания.

Другое дело: вы используете JSONObject, Для небольших веб-сервисов это не проблема, но если вам нужно собрать много больших и / или больших объектов, вы можете подумать об использовании JAXB + Jackson или Gson. Меньше кода, меньше ошибок, больше веселья!

Другие вопросы по тегам