2017-01-08 2 views
0

Я начинаю работать в android, я пытаюсь вызвать simple weather api, который возвращает ответ JSON.Каковы эффективные и оптимизированные способы вызова API в android

Я хотел знать, каковы эффективные способы совершения вызова api и откуда я могу изучить эти способы.

Я попытался его реализации с помощью Джексон:

WebService.java (копия пасты из некоторой ссылки)

public class WebService { 

    public <T> T get(String url, T object) throws Exception { 
     RestTemplate restTemplate = new RestTemplate(); 
     HttpHeaders headers = new HttpHeaders(); 
     headers.set("x-system-code", "mobile"); 
     headers.set("x-server-api-password", "mobile"); 
     headers.set("x-server-api-key", "mobile"); 
     headers.set("Connection", "Close"); 
     HttpEntity entity = new HttpEntity("parameters", headers); 
     restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); 
     return (T) restTemplate.exchange(url, HttpMethod.GET, entity, object.getClass()).getBody(); 
    } 

    public <T> T get(String url, T object, Map uriVariables) throws Exception { 
     RestTemplate restTemplate = new RestTemplate(); 
     HttpHeaders headers = new HttpHeaders(); 
     headers.set("Connection", "Close"); 
     HttpEntity entity = new HttpEntity("parameters", headers); 
     restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); 
     return (T) restTemplate.exchange(url, HttpMethod.GET, entity, object.getClass(), uriVariables).getBody(); 
    } 


    public <T> T post(String url, Object request, T object) throws Exception { 
     RestTemplate restTemplate = new RestTemplate(); 
     HttpHeaders headers = new HttpHeaders(); 
     headers.set("x-system-code", "mobile"); 
     headers.set("x-server-api-password", "mobile"); 
     headers.set("x-server-api-key", "mobile"); 
     headers.set("Connection", "Close"); 
     HttpEntity entity = new HttpEntity(request, headers); 
     restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); 
     return (T) restTemplate.exchange(url, HttpMethod.POST, entity, object.getClass()).getBody(); 
    } 

    public void put(String url, Object request) { 
     try { 
      RestTemplate restTemplate = new RestTemplate(); 
      restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); 
      restTemplate.put(url, request); 

     } catch (Exception e) { 
      Log.e("WebService - put", e.getMessage(), e); 
     } 
    } 

    public void delete(String url, Object request) { 
     try { 
      RestTemplate restTemplate = new RestTemplate(); 
      restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); 
      restTemplate.delete(url); 
     } catch (Exception e) { 
      Log.e("WebService - delete", e.getMessage(), e); 
     } 
    } 
}` 

MainActivity.java

public class MainActivity extends AppCompatActivity { 

    WebService webService=new WebService(); 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     GetWeather getWeather=new GetWeather(); 
     getWeather.execute(); 

    } 

    public class GetWeather extends AsyncTask<URL, Integer, response>{ 

     String url; 
     public GetWeather(){ 
      url="http://api.openweathermap.org/data/2.5/weather?q=Gurgaon&units=metric&appid=94d605bef2c15307c23f65a326d*****"; 
     } 


     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
     } 
     @Override 
     protected response doInBackground(URL... params) { 
      try { 
       response weatherResponse= webService.get(url,new response()); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(response response) { 
      super.onPostExecute(response); 
      Log.i("response", response.toString()); 
     } 
    } 
} 

Ошибка

org.springframework.web.client.ResourceAccessException: I/O error: unexpected end of stream on Connection{api.openweathermap.org:80, proxy=DIRECT hostAddress=128.199.109.89 cipherSuite=none protocol=http/1.1} (recycle count=0); nested exception is java.io.IOException: unexpected end of stream on Connection{api.openweathermap.org:80, proxy=DIRECT hostAddress=128.199.109.89 cipherSuite=none protocol=http/1.1} (recycle count=0) 01-04 07:21:51.536 21098-21137/com.example.rajatgupta.weatherapp W/System.err: at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:491)

Пожалуйста, скажите мне, что я делаю неправильно или любой другой способ сделать API ударом.

+0

Этот вопрос привлекает ответы на рекомендации библиотеки (в первую очередь на основе мнения) –

+0

Каким бы способом вы не выбрали «Эффективный и оптимизированный» до тех пор, пока он не закодирован. Рассматривая свой код здесь, вы всегда создаете новые объекты в каждом методе - я бы предположил, что во-первых, вы должны использовать повторное использование кода. –

ответ

1

Я предлагаю взглянуть на Volley, есть куча хороших учебников на сайте разработчиков Android и по всему Интернету.

Пример использования:

JsonObjectRequest jsonRequest = new JsonObjectRequest(GET, url, null, 
     new Response.Listener<JSONObject>() { 
      @Override 
      public void onResponse(JSONObject response) { 

       try { 
        Log.d("JSON", response.toString()); 
        //Do something with the data 

       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
     }, 
     new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       Log.e("JSON", error.toString()); 
      } 
     }); 

VolleyRequestQueue.getInstance(getActivity()).addToRequestQueue(jsonRequest); 
+1

Вопрос касается «Эффективных и оптимизированных» звонков Api - я бы сказал, что указание на библиотеку основано на мнениях. –

0

Посмотрите в Retrofit, его довольно просто и по обе стороны пролива вперед библиотеки, чтобы помочь вам реализации интерфейсы REST API.

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