Получение ошибки при использовании метода PATCH в HttpURLConnection

Здесь за последние несколько часов я пытаюсь обновить некоторое поле ресурса, используя метод HttpURLConnection PUT. Но теперь я изменил это на PATCH.

Я могу выполнить GET и POST, но в методе Http PATCH постоянно возникает ошибка.

Запрос даже не отправляется в POSTMAN.

Это класс java:

try {
    String serUrl = "https://lavazzaindia--tst1.custhelp.com/services/rest/connect/latest/tasks/255";
    String authString = user + ":" + password;
    byte[] authEncBytes = Base64.getEncoder().encode(authString.getBytes());
    String authStringEnc = new String(authEncBytes);

    URL url = new URL(serUrl); //Enter URL here
    HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
    httpURLConnection.setDoInput(true);
    httpURLConnection.setDoOutput(true);
    httpURLConnection.setRequestProperty("X-HTTP-Method-Override", "PATCH");
    httpURLConnection.setRequestMethod("POST");
    httpURLConnection.setRequestProperty("Authorization", "Basic " + authStringEnc);
    httpURLConnection.setRequestProperty("Content-Type", "application/json");

    httpURLConnection.connect();

    String inputJson = "{   \"id\":" + 255 + "," +
        "\"assignedToAccount\": {" +
        "     \"id\":" + 233 +
        " }," +
        " \"name\":\"" + "task2_checking34" + "\"," +
        " \"serviceSettings\":{" +
        "     \"incident\":{" +
        "         \"id\":" + 380 +
        "     }" +
        " }" +
        "}";
    OutputStreamWriter osw = new OutputStreamWriter(httpURLConnection.getOutputStream());
    osw.write(inputJson);
    osw.flush();
    osw.close();

    BufferedReader br = new BufferedReader(new InputStreamReader(
        (httpURLConnection.getInputStream())));

    String output;
    StringBuffer bfr = new StringBuffer();
    String res = "";
    System.out.println("Output from Server .... \n");
    while ((output = br.readLine()) != null) {
        bfr.append(output);
    }
    res = bfr.toString();

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

Идея использования метода PATCH в HttpUrlConnection путем переопределения POST взята из здесь.

У меня возникла идея отправки параметров в теле запроса, полученного из здесь.

Ресурсы, доступные по этому URL-адресу https://lavazzaindia--tst1.custhelp.com/services/rest/connect/latest/tasks/, похожи на

{
    "id": 253,
    "lookupName": "task_quality34",
    "createdTime": "2017-08-03T05:34:34Z",
    "updatedTime": "2017-08-03T05:34:34Z",
    "links": [{
        "rel": "canonical",
        "href": "https://lavazzaindia--tst1.custhelp.com/services/rest/connect/latest/tasks/253"
    }]
}, {
    "id": 255,
    "lookupName": "task_quality-test12",
    "createdTime": "2017-08-03T05:48:26Z",
    "updatedTime": "2017-08-03T05:48:26Z",
    "links": [{
        "rel": "canonical",
        "href": "https://lavazzaindia--tst1.custhelp.com/services/rest/connect/latest/tasks/255"
    }]
}

И я пытаюсь update какое-то поле этого ресурса, используя метод PATCH по этому URL-адресу https://lavazzaindia--tst1.custhelp.com/services/rest/connect/latest/tasks/255

Но каждый раз я получаю ошибку

java.io.IOException: Server returned HTTP response code: 400 for URL: https://lavazzaindia--tst1.custhelp.com/services/rest/connect/latest/tasks/255
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
    at com.cloud.task.TaskUpdate.main(TaskUpdate.java:80)

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


person Shambhu    schedule 03.08.2017    source источник
comment
этот сервис где-нибудь задокументирован? только служба может сказать, как построить правильный запрос   -  person nandsito    schedule 03.08.2017
comment
Я успешно собрал запросы GET и POST, используя HttpUrlConnection. Но в методе PUT, пожалуйста, укажите мне коды, делаю ли я что-то неправильно.   -  person Shambhu    schedule 03.08.2017
comment
обратитесь к моему комментарию выше. Я понятия не имею, что ожидает эта конечная точка HTTP   -  person nandsito    schedule 03.08.2017
comment
@SNSingh, запрос 400 Bad может быть в основном из-за кодировки URL, но вы говорите, что успешно выполнили вызов методов GET и POST, тогда я сомневаюсь, что параметры в json отсутствуют или добавлены дополнительные, которые вы отправляете в PUT.   -  person Raju Sharma    schedule 03.08.2017
comment
@nandsito хорошо, я добавил ресурсы, доступные в конечной точке, и ввел любой из них после того, как просто добавил идентификатор с этим. Я могу создать новый ресурс, используя POST, но не могу обновить существующий.   -  person Shambhu    schedule 03.08.2017
comment
@RajuSharma Я проверил это, я могу отправлять параметры, которые хочу обновить, в этом ресурсе, единственное, что мне нужно использовать, это метод PATCH, но я получаю ту же ошибку.   -  person Shambhu    schedule 03.08.2017
comment
Кстати, HttpURLConnection не поддерживает метод PATCH и многие другие команды. Насколько я знаю, только GET, PUT, POST и DELETE и, возможно, HEAD. Если вы хотите использовать другие глаголы, вам нужно будет использовать другой HTTP-клиент, например, Apache, или этот заголовок X-HTTP-Method-Override.   -  person user207421    schedule 28.08.2017


Ответы (1)


Ну, я отвечаю на собственный вопрос.

Я просто изменил несколько строк кода, и это сработало для меня. Ниже приведен рабочий код:

        try {
            URL url = new URL(serUrl); //Enter URL here
            HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
            httpURLConnection.setDoOutput(true);
            httpURLConnection.setRequestMethod("POST");
            httpURLConnection.setRequestProperty("Authorization", "Basic " + authStringEnc);
            httpURLConnection.setRequestProperty("Accept", "application/json");
            httpURLConnection.setRequestProperty("Content-Type", "application/json");
            httpURLConnection.setRequestProperty("X-HTTP-Method-Override", "PATCH");
            httpURLConnection.connect();

            DataOutputStream wr = new DataOutputStream(httpURLConnection.getOutputStream());
            wr.write(inputJson.getBytes());
            wr.flush();
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    (httpURLConnection.getInputStream())));


            StringBuffer bfr = new StringBuffer();
            String output = "";
            String res = "";

            while ((output = br.readLine()) != null) {
                bfr.append(output);
            }
            resCode = httpURLConnection.getResponseCode();
//            System.out.println("response code = "+resCode);
            if (resCode != 200) {
                throw new RuntimeException("Failed : HTTP error code : "
                        + resCode +"\n"
                        +bfr.toString());
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

В переменной inputJson мы не должны отправлять параметр id, пока он уже есть в url.

Я продолжал пробовать с количеством программ-примеров, и, наконец, ресурс стал обновляться.

person Shambhu    schedule 28.08.2017