How do I access the returned value from a Web API Method in Android?
在对如何这样做感到困惑之后(可以在这里和这里看到,我现在已经成功地连接到我的服务器应用程序和适当的RESTful方法,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | public void onFetchBtnClicked(View v){ if(v.getId() == R.id.FetchBtn){ Toast.makeText(getApplicationContext(),"You mashed the button, dude.", Toast.LENGTH_SHORT).show(); new CallAPI().execute("http://10.0.2.2:28642/api/Departments/GetCount?serialNum=4242"); } } public static class CallAPI extends AsyncTask<String, String, String> { @Override protected String doInBackground(String... params) { String urlString=params[0]; // URL to call String resultToDisplay =""; InputStream in = null; // HTTP Get try { URL url = new URL(urlString); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); in = new BufferedInputStream(urlConnection.getInputStream()); } catch (Exception e ) { System.out.println(e.getMessage()); return e.getMessage(); } return resultToDisplay; } protected void onPostExecute(String result) { Log.i("FromOnPostExecute", result); } } // end CallAPI |
我意识到我需要将一些东西(初始化时的空字符串除外)分配给ResultToDisplay,但是什么呢?我需要"in"的什么部分来访问/隐藏字符串?
更新"手动"的方法对我来说很有效,但是狂热的ApacheIO实用程序"没有那么多"(嗯,它编译了…)。这是我的代码:
1 2 3 4 5 6 | try { URL url = new URL(urlString); HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection(); in = new BufferedInputStream(urlConnection.getInputStream()); resultToDisplay = getStringFromInputStream(in); total = IOUtils.toString(in); |
结果显示任务工作(我得到"18")。道达尔的作业没有(我得到"")。
注意:"getStringFromInputStream()"方法来自Raghunandan的链接。
更新2这很好用(使用willjbd的想法使用ApacheCommons的ioutils):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | new CallWebAPI().execute("http://10.0.2.2:28642/api/Departments/GetCount?serialNum=4242"); . . . private class CallWebAPI extends AsyncTask<String, String, String> { @Override protected String doInBackground(String... params) { String urlString=params[0]; // URL to call String result =""; // HTTP Get try { URL url = new URL(urlString); HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection(); InputStream inputStream = urlConnection.getInputStream(); if (null != inputStream) result= IOUtils.toString(inputStream); } catch (Exception e ) { System.out.println(e.getMessage()); return e.getMessage(); } return result; } @Override protected void onPostExecute(String result) { Log.i("RenameTheWashingtonFootballTeamTheRedskinPeanuts", result); } } |
…因此很明显,没有必要将"compile files('libs/commons-io-2.4.jar')"之类的内容添加到build.gradle的dependencies部分,根据这一点,至少一次是必要的。如果有人能验证这样一个[m,pp]的结尾来构建.gradle已经不再需要了,我会是gradleful。
更新4我只是注意到我无意中从onPostExecute()方法中删除了"@override",但是没有它就没什么区别了——没有它就可以正常工作,一旦我恢复它,它就可以正常工作。那么拥有它有什么好处呢?它只是多余的绒毛吗?
为什么不使用像ioutils这样的东西?
1 2 3 | InputStream inputStream = urlConnection.getInputStream(); if (inputStream != null) String content = IOUtils.toString(inputStream); |
http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/ioutils.html
现在,您可以使用许多库中的一个将字符串解析为JSON或XML。