最近在做Android的一个项目,涉及到Android studio与服务器端通信问题,在网上看了很多,找到了一些解决办法,这篇文章就简单介绍一下如何获取以及向服务器上传json数据。
在这个项目中,我们使用的json数据格式获取和上传数据,不多说废话,直接上代码,代码里有详细注释。
1.获取服务器端数据
以下是采用get方式获取服务器端数据,不需要传值,直接获得数据,所以直接采用默认的get方式,建立http连接,获取数据就行了,在我们的项目中,我们获取数据都是先获取到String类型的数据,再将其转化为json数据并解析,下面是获取String数据的函数:
public static String gethttpresult(String urlStr){
try {
URL url=new URL(urlStr);
HttpURLConnection connect=(HttpURLConnection)url.openConnection();
InputStream input=connect.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(input));
String line = null;
System.out.println(connect.getResponseCode());
StringBuffer sb = new StringBuffer();
while ((line = in.readLine()) != null) {
sb.append(line);
}
return sb.toString();
} catch (Exception e) {
System.out.println(e.toString());
return null;
}
}
除了直接获取结果外,更多的时候我们需要向服务器端传递一些参数,在我们的项目中采用post方式,向服务器传递参数获取想要的数据,对于post的json数据,我们也做了两种尝试:
第一种json构造方式,直接构造json数据
/**
* 检查用户账号密码是否正确
* @param urlStr 接口url
* @param user_phone 用户输入的帐号
* @param user_password 用户输入的密码
* @return
*/
public static String checkuser(String urlStr,String user_phone,String user_password){
String params = "{\"user_phone\":" +user_phone +",\"user_password\":" + user_password+ "}";
try {
URL url=new URL(urlStr);
HttpURLConnection connect=(HttpURLConnection)url.openConnection();
connect.setDoInput(true);
connect.setDoOutput(true);
connect.setRequestMethod("POST");
connect.setUseCaches(false);
connect.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
OutputStream outputStream = connect.getOutputStream();
outputStream.write(params.getBytes());
int response = connect.getResponseCode();
if (response== HttpURLConnection.HTTP_OK)
{
System.out.println(response);
InputStream input=connect.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(input));
String line = null;
StringBuffer sb = new StringBuffer();
while ((line = in.readLine()) != null) {
sb.append(line);
}
return sb.toString();
}
else {
System.out.println(response);
return " ";
}
} catch (Exception e) {
Log.e("e:", String.valueOf(e));
return e.toString();
}
}
第二种构造方式,采用json数据格式转换
/**
* 获得搜索结果
* @param bookName 用户输入的书籍关键字
* @return
*/
public static String getsearchresult(String bookName){
String h="http://122.114.237.201/getbook/search";
JSONObject object=new JSONObject();
try {
object.put("bookName",bookName);
String content = String.valueOf(object);
URL url=new URL(h);
HttpURLConnection connect=(HttpURLConnection)url.openConnection();
connect.setDoInput(true);
connect.setDoOutput(true);
connect.setRequestMethod("POST");
connect.setUseCaches(false);
connect.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
OutputStream outputStream = connect.getOutputStream();
outputStream.write(content.getBytes());
int response = connect.getResponseCode();
System.out.println(connect);
if (response== HttpURLConnection.HTTP_OK)
{
System.out.println(response);
InputStream input=connect.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(input));
String line = null;
System.out.println(connect.getResponseCode());
StringBuffer sb = new StringBuffer();
while ((line = in.readLine()) != null) {
sb.append(line);
}
return sb.toString();
}
else {
System.out.println(response);
return "not exsits";
}
} catch (Exception e) {
Log.e("e:", String.valueOf(e));
return "internet errar";
}
}
在一些情况下两种方法使用都没有问题,但是在一些情况下只有第二种方法才有效,至今未搞懂为什么,如果有知道的,欢迎在下方评论,建议使用第二种,犯错误的概率会小很多。
2.解析json数据
获取到String数据以后,我们要做的事就是把他转化为json数据格式并且解析,对于不同的json数据,其内容也不尽相同,一下是示例代码:
new Thread(){
@Override
public void run() {
String result= internet.gethttpresult(url);
System.out.println(result);
if(result==null)
{
Looper.prepare();
Toast.makeText(getContext(),"网络连接错误!",Toast.LENGTH_SHORT).show();
Looper.loop();
}
else
{
try {
JSONObject result_json=new JSONObject(result);
JSONArray picture=result_json.getJSONArray("picture");
JSONArray booklist=result_json.getJSONArray( "Booklist");
JSONArray articlelist=result_json.getJSONArray("Articlelist");
for (int i = 0; i < picture.length(); i++) {
JSONObject object=picture.getJSONObject(i);
picture_urls.add(object.getString("url"));
}
for (int i = 0; i < 3; i++) {
JSONObject object=booklist.getJSONObject(i);
book_id.add(object.getInt("bookId"));
book_name.add(object.getString("bookName"));
book_img.add(object.getString("bookPicture"));
}
for (int i = 0; i < 2; i++) {
JSONObject object=articlelist.getJSONObject(i);
System.out.println(object.getString("articleContext"));
article_id.add(object.getInt("articleId"));
article_name.add(object.getString("articleName"));
article_img.add(object.getString("articlePicture"));
article_author.add(object.getString("articleAuthor"));
article_hot.add(object.getInt("articleHot"));
}
} catch (JSONException e) {
e.printStackTrace();
System.out.println(e.toString());
Looper.prepare();
Toast.makeText(getContext(),"文件解析错误!",Toast.LENGTH_SHORT).show();
Looper.loop();
}
}
}
}.start();
3.一些错误的解决办法。
在与服务器端的交互通信过程中,不管是获取还是上传数据,在做的时候都遇到了很多问题,比如json格式问题等。下面列举一些常见问题。
1.在Android中进行网络连接最需要注意的地方是不能再ui线程进行网络访问,一定要new一个子线程进行访问。
2.在子线程进行网络访问时往往需要更改控件,然而在子线程中不能更改控件,解决办法是可以用runable,具体大家可以百度。
4.其他。
另外提一句,我们做的项目是一个阅读app,做出来的效果大概是下面这样。
下面附上源码以及app,大家感兴趣的可以尝试,如果有需要可以留言或发邮件给我(1823044724@qq.com)