【发布时间】: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