【问题标题】:What are the Efficient and optimized ways of making an API call in android在android中进行API调用的有效和优化方法是什么
【发布时间】:2017-01-08 22:29:46
【问题描述】:

我是 android 的初学者,我正在尝试调用返回 JSON 响应的 simple weather api

我想知道进行 api 调用的有效方法是什么,以及我可以从哪里研究这些方法。

我已经尝试使用 Jackson 来实现它:

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 错误: Connection{api.openweathermap.org:80, proxy=DIRECT hostAddress=128.199.109.89 cipherSuite=none protocol=http/1.1} 上的流意外结束(循环计数=0);嵌套异常是 java.io.IOException:Connection{api.openweathermap.org:80, proxy=DIRECT hostAddress=128.199.109.89 cipherSuite=none protocol=http/1.1} 上的流意外结束(回收次数=0) 01-04 07:21:51.536 21098-21137/com.example.rajatgupta.weatherapp W/System.err:在 org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:491)

请告诉我我做错了什么,或任何其他方式使 API 命中。

【问题讨论】:

  • 这个问题正在吸引图书馆推荐答案(主要基于意见)
  • 无论您选择何种“高效和优化”方式,都取决于它的编码方式。在这里查看您的代码,您总是在每个方法中创建新对象 - 我建议您首先应该采用一些代码重用。

标签: android


【解决方案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);

【讨论】:

  • 问题是关于“高效和优化”的 Api 调用 - 我想说指向库是基于意见的。
【解决方案2】:

查看Retrofit,它是一个非常简单且严格的库,可帮助您实现与 REST API 的接口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 2016-12-09
    • 2018-07-08
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多