2017-01-08 17 views
0

私はアンドロイドで初心者です。私はsimple weather apiを呼び出してJSON応答を返します。効率的かつ最適化された方法は、アンドロイドでAPI呼び出しを行う方法です

私は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をご覧になることをお勧めします。アンドロイドの開発者サイトとウェブ上のチュートリアルのヒープがあります。使い方

例:

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

あなたはREST APIへのインタフェースを実装するのに役立つRetrofitに見て、その非常にシンプルかつ海峡前方のライブラリを持っています。

関連する問題