Я пытаюсь сделать вызов RESTful API на сервер Parse.com с использованием HTTPURLConnection. К сожалению, когда я запускаю этот код, я получаю ошибку HTTP 401 (несанкционированный доступ)Использование HTTPUrlConnection для вызова REST API на сервер Parse
Вот коды
protected JSONObject doInBackground(String... params) {
HttpsURLConnection urlConnection = null;
try {
URL url = new URL("https://api.parse.com/1/functions/hello");
urlConnection =
(HttpsURLConnection) url.openConnection();
urlConnection.setConnectTimeout(20000);
urlConnection.setReadTimeout(20000);
urlConnection.setDoOutput(true);
urlConnection.setRequestMethod("POST");
urlConnection.setRequestProperty("X-Parse-Application-Id", appId);
urlConnection.setRequestProperty("X-Parse-REST-API-Key", restApiKey);
urlConnection.setRequestProperty("Content-Type", "application/json");
urlConnection.connect();
byte[] outputBytes = "{}".getBytes("UTF-8");
OutputStream out = urlConnection.getOutputStream();
out.write(outputBytes);
out.close();
int statusCode = urlConnection.getResponseCode();
if (statusCode != HttpURLConnection.HTTP_ACCEPTED) {
Log.d(TAG, "doInBackground(): connection failed: statusCode: " + statusCode);
// return null;
}
InputStream in = new BufferedInputStream(
urlConnection.getInputStream());
String responseText = getResponseText(in);
Log.d(TAG, "doInBackground() responseText: " + responseText);
return new JSONObject(responseText);
} catch (IOException | JSONException e) {
e.printStackTrace();
} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
}
return null;
В принципе, все, что мне нужно, чтобы повторить функциональность этого Curl:
curl -X POST \
-H "X-Parse-Application-Id: {APP_ID}" \
-H "X-Parse-REST-API-Key: {API_KEY}" \
-H "Content-Type: application/json" \
-d '{}' \
https://api.parse.com/1/functions/hello
Я запустил ту же самую команду cURL с тем же идентификатором приложения и ключом API, и они вернули правильный результат.
Любые предложения?
EDIT:
Вот выход консоли я получаю:
09-24 14:28:43.101 21868-22057/com.example.versiontrack D/Module_VersionTracker﹕ doInBackground(): connection failed: statusCode: 401
09-24 14:28:43.102 21868-22057/com.example.versiontrack W/System.err﹕ java.io.FileNotFoundException: https://api.parse.com/1/functions/hello
09-24 14:28:43.102 21868-22057/com.example.versiontrack W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:197)
09-24 14:28:43.103 21868-22057/com.example.versiontrack W/System.err﹕ at com.android.okhttp.internal.http.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210)
09-24 14:28:43.103 21868-22057/com.example.versiontrack W/System.err﹕ at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:25)
09-24 14:28:43.104 21868-22057/com.example.versiontrack W/System.err﹕ at com.example.module_versiontracker.Module_VersionTracker$ParseVersionCheckTask.doInBackground(Module_VersionTracker.java:215)
09-24 14:28:43.104 21868-22057/com.example.versiontrack W/System.err﹕ at com.example.module_versiontracker.Module_VersionTracker$ParseVersionCheckTask.doInBackground(Module_VersionTracker.java:115)
09-24 14:28:43.104 21868-22057/com.example.versiontrack W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java:288)
09-24 14:28:43.104 21868-22057/com.example.versiontrack W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:237)
09-24 14:28:43.104 21868-22057/com.example.versiontrack W/System.err﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
09-24 14:28:43.104 21868-22057/com.example.versiontrack W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
09-24 14:28:43.104 21868-22057/com.example.versiontrack W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
09-24 14:28:43.105 21868-22057/com.example.versiontrack W/System.err﹕ at java.lang.Thread.run(Thread.java:818)
HttpURLConnection.HTTP_ACCEPTED = 202, вы не хотите смотреть на 200 (HttpURLConnection.HTTP_OK)? Кстати, ваш код кажется хорошим. 401 может поступать только с сервера. Проверьте 'String urlReturned = httpsURLConnection.getURL(). ToString();', чтобы увидеть, не изменился ли URL-адрес. – xiaomi
URL-адрес тот же. – Solidak
Итак, вы можете увидеть выходные данные свойства request с помощью: 'Map> map = httpURLConnection.getRequestProperties(); для (Map.Entry > entry: map.entrySet()) { Log.d (TAG, "entry:" + entry.getKey()); for (String str: entry.getValue()) { Log.d (TAG, "значение:" + str); } } 'и проверьте правильность вашей аутентификации. –
xiaomi