2015-09-24 2 views
2

Я пытаюсь сделать вызов 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) 
+0

HttpURLConnection.HTTP_ACCEPTED = 202, вы не хотите смотреть на 200 (HttpURLConnection.HTTP_OK)? Кстати, ваш код кажется хорошим. 401 может поступать только с сервера. Проверьте 'String urlReturned = httpsURLConnection.getURL(). ToString();', чтобы увидеть, не изменился ли URL-адрес. – xiaomi

+0

URL-адрес тот же. – Solidak

+0

Итак, вы можете увидеть выходные данные свойства 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

ответ

2

Я думаю, что вы забыли очистить выходной поток.

DataOutputStream out = new DataOutputStream(urlConnection.getOutputStream()); 
out.write(outputBytes); 
out.flush(); //Don't forgot to flush the output 
out.close(); 
+0

Никакой разницы вообще. Пожалуйста, проверьте мое редактирование для вывода на консоль. – Solidak

Смежные вопросы