Почему этот Java-код API Cloudant не обновляет существующую запись в базе данных?

У меня есть этот фрагмент кода, написанный для обновления существующей записи в базе данных. Он возвращается без ошибок, но не обновляет запись. Я убедился, что параметры "_rev" и "_id" совпадают с последним прочитанным, и проверил его. Что-то не так в этом коде?

private void updateUserInfo(String dataTmp) {
    try {
        JSONObject newObj = new JSONObject(dataTmp);
        String data = newObj.toString();
        System.out.println("About to add the following string to database: " + data);
        URL url = new URL("https://abc:[email protected]:443/databaseName/");

        HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();
        httpCon.setDoOutput(true);
        httpCon.setRequestMethod("POST");
        final String encodedUserPass = new String(Base64.encodeBase64(("abc" + ":" + "abc").getBytes()));

        @SuppressWarnings("deprecation")
        String encodedData = URLEncoder.encode(data);
        httpCon.setRequestProperty("Content-type", "application/json");
        httpCon.setRequestProperty("Content-Length", String.valueOf(encodedData.length()));
        httpCon.setRequestProperty("Authorization", "Basic " + encodedUserPass);

        OutputStreamWriter out = new OutputStreamWriter(httpCon.getOutputStream());
        out.write(data);
        out.close();

        Runtime.getRuntime().gc();

    } catch (Exception e) {
        e.printStackTrace();
        System.out.println("Error while updating the user record");
    }
}

person London guy    schedule 25.08.2014    source источник


Ответы (1)


Думаю, ваш URL неверный.

Вы правильно отправляете свои учетные данные, используя заголовок Basic Authentication - их не следует включать непосредственно в URL-адрес. Некоторые библиотеки / утилиты HTTP (например, cURL) имеют функцию, при которой они анализируют учетные данные в URL-адресе и преобразуют их в базовый заголовок аутентификации, но при использовании большинства стандартных библиотек HTTP вам придется делать это самостоятельно. Следующее должно работать:

private void updateUserInfo(String dataTmp) {
    try {
        JSONObject newObj = new JSONObject(dataTmp);
        String data = newObj.toString();
        System.out.println("About to add the following string to database: " + data);
        URL url = new URL("https://pqr.cloudant.com/databaseName/");

        HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();
        httpCon.setDoOutput(true);
        httpCon.setRequestMethod("POST");
        final String encodedUserPass = new String(Base64.encodeBase64(("abc" + ":" + "abc").getBytes()));

        @SuppressWarnings("deprecation")
        String encodedData = URLEncoder.encode(data);
        httpCon.setRequestProperty("Content-type", "application/json");
        httpCon.setRequestProperty("Content-Length", String.valueOf(encodedData.length()));
        httpCon.setRequestProperty("Authorization", "Basic " + encodedUserPass);

        OutputStreamWriter out = new OutputStreamWriter(httpCon.getOutputStream());
        out.write(data);
        out.close();

        Runtime.getRuntime().gc();

    } catch (Exception e) {
        e.printStackTrace();
        System.out.println("Error while updating the user record");
    }
}
person Will Holley    schedule 26.08.2014
comment
Спасибо, @Will, я попробую и дам тебе знать. - person London guy; 26.08.2014