Java: невозможно записать в URLConnection, если doOutput = false - вызвать setDoOutput (true) - PullRequest
0 голосов
/ 26 августа 2018

Я - QA с желанием узнать больше о программировании на Java и о проблеме, с которой я сталкиваюсь: я пытаюсь отправить данные сотрудников в базу данных какого-то поддельного API отдыха, но я получаю

Невозможно записать в URLConnection, если doOutput = false - вызов setDoOutput (true) "

До сих пор я пробовал некоторые идеи из StackOverflow, но неопытный, как и я, я мог легкоуглубиться в проблему. Итак, URL: http://dummy.restapiexample.com/api/v1/create и сначала я создал класс Employee объекта json:

public class Main {

    public static void main(String[] args) {
        new Main();   
    }

    public Main() {    

        Employees em = new Employees();

        em.setEmployeeName("Alex");
        em.setEmployeeSalary("1234");
        em.setEmployeeAge("28");

        try{
            URL url = new URL("http://dummy.restapiexample.com/api/v1/create");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Accept", "application/json");  

            if (conn.getResponseCode() != 200) {
                throw new RuntimeException("Unsuccessful call: HTTP error : "
                    + conn.getResponseCode());
            }     

            // URLConnection urlc = url.openConnection();
            // urlc.setDoOutput(true);

            PrintWriter pw = new PrintWriter(conn.getOutputStream());


            pw.print(new Gson().toJson(em));
            pw.close();
            pw.flush();

            BufferedReader br = new BufferedReader(
                new InputStreamReader(conn.getInputStream())
            );
            String json = "";
            String output;
            while ((output = br.readLine()) != null) {
                json += output;
            }
            conn.disconnect();               

            System.out.println("Employee name:  " + em.getEmployeeName());
        }   
        catch (MalformedURLException e) { 
            e.printStackTrace();
        }
        catch (IOException e) { 
            e.printStackTrace();        
        }
    }
}

Хорошо, используя одну из ваших идей и добавив следующие строки кода (это прокомментировано в приведенном выше коде):

URLConnection urlc = url.openConnection();
urlc.setDoOutput(true);

Итак, код выглядит так:

открытый класс Main {

public static void main(String[] args) {
new Main();   
}
public Main() {    

    Employees em = new Employees();

    em.setEmployeeName("Alex");
    em.setEmployeeSalary("1234");
    em.setEmployeeAge("28");

    try{
        URL url = new URL("http://dummy.restapiexample.com/api/v1/create");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Accept", "application/json");  



        if (conn.getResponseCode() != 200) {
        throw new RuntimeException("Unsuccessful call: HTTP error : "
        + conn.getResponseCode());
       }     

        URLConnection urlc = url.openConnection();
       urlc.setDoOutput(true);

        PrintWriter pw = new PrintWriter(urlc.getOutputStream());


        pw.print(new Gson().toJson(em));
        pw.close();
        pw.flush();

        BufferedReader br = new BufferedReader(new InputStreamReader(
        (urlc.getInputStream())));
        String json = "";
        String output;
        while ((output = br.readLine()) != null) {
        json += output;
        }
        conn.disconnect();         



        System.out.println("Employee name: " + em.getEmployeeName());

}   
catch (MalformedURLException e) { 
    e.printStackTrace(); } 
    catch (IOException e) { 
    e.printStackTrace();        
}
 }}

С этим вторымкод Я не получаю эту ошибку, но нет вставки в базу данных (проверка, используя почтальон, с помощью метода GET) ...

Ну, что я пропускаю? Я думаю, я пропускаючто-то простое ...

1 Ответ

0 голосов
/ 27 августа 2018

Двойное использование url.openConnection означает, что вы получите два разных соединения.Вы отправляете запрос на второе соединение и пытаетесь прочитать ответ от первого соединения.Вы должны вызывать doOutput для соединения, которое вы первоначально открыли.

Вторая проблема - вы вызываете getResponseCode перед отправкой запроса.В http запрос должен быть отправлен полностью до того, как сервер отправит ответ.Вы должны переместить код, который вызывает doOutput и записывает тело запроса перед кодом, который пытается проверить код ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...