FileNotFoundException при вызове API RESTFul с использованием AsyncTask
Я разрабатываю простое приложение для входа. Но я застрял в точке, где я получаю FileNotFoundException
после вызова (или удара) API с помощью Android Asynctask
, Также код состояния, который я получил после звонка, - 400. Но я не понимаю, где я ошибся. Ниже приведен код вызова API из метода asInctask doInBackground.
@Override
protected JSONObject doInBackground(String... params) {
HttpURLConnection urlConnection = null;
BufferedWriter writer = null;
OutputStream out = null;
try
{
String email = params[0];
String password = params[1];
URL url = new URL("http://192.168.1.67:8080/eye/api/login");
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setConnectTimeout(10000);
urlConnection.setReadTimeout(10000);
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
urlConnection.setRequestMethod("POST");
urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
urlConnection.setRequestProperty("Accept", "application/json");
List<NameValuePair> loginCredentials = new ArrayList<>();
loginCredentials.add(new BasicNameValuePair("username", email));
loginCredentials.add(new BasicNameValuePair("password", password));
out = urlConnection.getOutputStream();
writer = new BufferedWriter(
new OutputStreamWriter(out, "UTF-8"));
writer.write(getQuery(loginCredentials));
writer.flush();
int statusCode = urlConnection.getResponseCode();
if (statusCode != HttpURLConnection.HTTP_OK)
{
Log.d("LoginActivity", "Connection failed: StatusCode: " + statusCode);
}
else
{
Log.d("LoginActivity", "Connection Success: StatusCode: " + statusCode);
}
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
responseText = getResponseText(in);
return new JSONObject(responseText);
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
PS:- getQuery() - это функция, которая будет добавлять и кодировать параметры URL. А getResponseText() - это функция, которая читает ответ, полученный от сервера. Просто FYI, контроль выполнения входит в блок catch после строки InputStream in = new BufferedInputStream(urlConnection.getInputStream());
Кроме того, если я нажму этот конкретный URL через Почтальона, я получу 200(HTTP OK) в качестве кода ответа.
Вот что сообщает журнал ошибок:
12-15 16:24:07.028 26145-26182/krixi.com.spanpumploginhit W/System.err﹕ java.io.FileNotFoundException: http://192.168.1.67:8080/eye/api/login
12-15 16:24:07.029 26145-26182/krixi.com.spanpumploginhit W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:206)
12-15 16:24:07.029 26145-26182/krixi.com.spanpumploginhit W/System.err﹕ at krixi.com.spanpumploginhit.Login$AsyncCheckLogin.doInBackground(Login.java:213)
12-15 16:24:07.029 26145-26182/krixi.com.spanpumploginhit W/System.err﹕ at krixi.com.spanpumploginhit.Login$AsyncCheckLogin.doInBackground(Login.java:153)
12-15 16:24:07.029 26145-26182/krixi.com.spanpumploginhit W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java:292)
12-15 16:24:07.029 26145-26182/krixi.com.spanpumploginhit W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:237)
12-15 16:24:07.029 26145-26182/krixi.com.spanpumploginhit W/System.err﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
12-15 16:24:07.029 26145-26182/krixi.com.spanpumploginhit W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
12-15 16:24:07.029 26145-26182/krixi.com.spanpumploginhit W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
12-15 16:24:07.029 26145-26182/krixi.com.spanpumploginhit W/System.err﹕ at java.lang.Thread.run(Thread.java:818)
Спасибо:-)
2 ответа
Если вы работаете на localhost, используйте адрес 10.0.2.2:[portNumber].
Извините за столь поздний ответ. Если вам надоела отладка приведенного выше кода, попробуйте использовать HttpClient
вместо HttpURLConnection
, Это сработало для меня. Просто попробуйте код ниже, в вашем doInBackground().
String email = params[0];
String password = params[1];
InputStream inputStream = null;
String result = "";
try {
// 1. create HttpClient
HttpClient httpclient = new DefaultHttpClient();
// 2. make POST request to the given URL
HttpPost httpPost = new HttpPost("http://192.168.1.67:8080/eye/api/login");
String json = "";
// 3. build jsonObject
JSONObject jsonObject = new JSONObject();
jsonObject.accumulate("username", email);
jsonObject.accumulate("password", password);
// 4. convert JSONObject to JSON to String
json = jsonObject.toString();
// 5. set json to StringEntity
StringEntity se = new StringEntity(json);
// 6. set httpPost Entity
httpPost.setEntity(se);
// 7. Set some headers to inform server about the type of the content
httpPost.setHeader("Content-type", "application/json");
// 8. Execute POST request to the given URL
HttpResponse httpResponse = httpclient.execute(httpPost);
// 9. receive response as inputStream
inputStream = httpResponse.getEntity().getContent();
// 10. convert inputstream to string
if (inputStream != null)
result = convertInputStreamToString(inputStream);
else
result = "Did not work!";
}catch (Exception e){
}
Не забудьте добавить ниже зависимости в уровне вашего приложения build.gradle
compile group: 'cz.msebera.android' , name: 'httpclient', version: '4.4.1.1'
Дайте мне знать, если это сработало!
PS:- convertInputStreamToString(inputStream) - это вспомогательный метод для преобразования inputtream в String
Спасибо.