2016-07-29 2 views
1

У меня возник вопрос о правильном синтаксисе и порядке кода в отношении доступа к API REST.Доступ к API REST в Android с использованием заголовков запросов

Я пытаюсь получить доступ к базе данных, которую я сделал на mBaas, называемом backendless.com. (Следующая информация относится к этому mBaas, но мой вопрос касается общего процесса доступа к API REST в Android)

В соответствии с их руководством по массовому удалению (https://backendless.com/documentation/data/rest/data_deleting_data_objects.htm) Мне нужен URL-адрес, который запрашивает мою базу данных для и затем удаляет его. У меня такая ценность. Они также нуждаются в 3 заголовках запроса (идентификатор приложения, секретный ключ, тип приложения). У меня есть и те же.

Я использовал всю эту информацию в классе ASyncTask, который технически должен открыть URL-адрес, установить заголовки запроса и сделать вызов API REST. Моя единственная проблема: я понятия не имею, не хватает ли здесь какого-то кода? Является ли текущий код в правильном порядке? Каждый раз, когда мой класс выполняется, ничего не происходит.

Я также получаю исключение кота журнала в отношении моего URL: java.io.FileNotFoundException: api.backendless.com/v1/data/bulk/...

URL-адрес не приводит ни к чему когда это Я размещаю его в своем браузере, но мне говорят, что это не так, поскольку браузер отправляет его как запрос GET.

В любом случае, вот мой класс ASyncTask со всей информацией. Кто-нибудь знает, выглядит ли этот код правильно или я что-то пропустил? Я новичок в создании этих типов вызовов и не очень понимаю, как эти ролики запросов обрабатываются при доступе к API REST. Пожалуйста, дайте мне знать. Спасибо!

class DeleteBulkFromBackEnd extends AsyncTask<Void,Void,String>{ 
    final String API_URL = "https://api.backendless.com/v1/data/bulk/LocalPhoneNum?where%3DuserEmailID%[email protected]"; 

    @Override 
    protected String doInBackground(Void... params) { 
     HttpURLConnection urlConnection = null; 


     try { 
      URL url = new URL(API_URL); 
      urlConnection = (HttpURLConnection)url.openConnection(); 

     urlConnection.setRequestProperty("application-id","12345678"); 
      urlConnection.setRequestProperty("secret-key","12345678"); 
      urlConnection.setRequestProperty("application-type", "REST"); 
      urlConnection.connect(); 



     } catch (MalformedURLException e) { 

      e.printStackTrace(); 
     } catch (IOException e) { 
      Log.d("Contact","ERROR " + e.toString());//IO Exception Prints in log cat not recognizing URL 
      e.printStackTrace(); 
     }finally { 
      urlConnection.disconnect(); 
     } 

     return null; 
    } 

} 
+1

Учитывая правильность параметров API_URL и заголовка, может потребоваться вызвать 'urlConnection.setRequestMethod (" DELETE ");' перед вызовом 'urlConnection.connect();' –

+0

Да, это ответ! Пожалуйста, опубликуйте, чтобы я мог принять. Благодаря! –

ответ

1

Как я уже отметил, вот решение:

class DeleteBulkFromBackEnd extends AsyncTask<Void,Void,String>{ 
    final String API_URL = "https://api.backendless.com/v1/data/bulk/LocalPhoneNum?where%3DuserEmailID%[email protected]"; 

    @Override 
    protected String doInBackground(Void... params) { 
     HttpURLConnection urlConnection = null; 


     try { 
      URL url = new URL(API_URL); 
      urlConnection = (HttpURLConnection)url.openConnection(); 

      urlConnection.setRequestProperty("application-id","12345678"); 
      urlConnection.setRequestProperty("secret-key","12345678"); 
      urlConnection.setRequestProperty("application-type", "REST"); 
      urlConnection.setRequestMethod("DELETE"); 

      urlConnection.connect(); 



     } catch (MalformedURLException e) { 

      e.printStackTrace(); 
     } catch (IOException e) { 
      Log.d("Contact","ERROR " + e.toString());//IO Exception Prints in log cat not recognizing URL 
      e.printStackTrace(); 
     }finally { 
      urlConnection.disconnect(); 
     } 

     return null; 
    } 

} 
2

Я рекомендую использовать okhttp для удобства доступа к сети.

И проверьте код ответа и тело ответа.

В вашем build.gradle:

compile 'com.squareup.okhttp3:okhttp:3.4.1' 

Ваш AsyncTask будет выглядеть следующим образом:

class DeleteBulkFromBackEnd extends AsyncTask<Void, Void, String> { 

    final String API_URL = "https://api.backendless.com/v1/data/bulk/LocalPhoneNum?where%3DuserEmailID%[email protected]"; 
    final OkHttpClient mClient; 

    public DeleteBulkFromBackEnd(OkHttpClient client) { 
     mClient = client; 
    } 

    @Override 
    protected String doInBackground(Void... params) { 
     try { 
      Request request = new Request.Builder() 
        .url(API_URL) 
        .delete() 
        .header("application-id", "12345678") 
        .header("secret-key", "12345678") 
        .header("application-type", "REST") 
        .build(); 

      Response response = mClient.newCall(request).execute(); 

      Log.d("DeleteBulkFromBackEnd", "Code: " + response.code()); 
      Log.d("DeleteBulkFromBackEnd", "Body: " + response.body().string()); 

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

     return null; 
    } 
} 

Выполнить AsyncTask так:

OkHttpClient client = new OkHttpClient(); 

void someMethod() { 
    ... 
    new DeleteBulkFromBackEnd(client).execute(); 
    ... 
} 
Смежные вопросы