安卓GET与POST⽹络请求的三种⽅式
我们的应⽤常常要联⽹取得⽹络上的数据,然后进⾏解析,必须要先取到数据之后才能进⾏下⼀步的业务。
故⽹络请求是常⽤的操作,下⾯我介绍常⽤的三种⽅式,
第⼀是⽐较原始的⽅法,使⽤HttpURLConnection,
第⼆是Volley框架,
第三是xutils3框架。
1.HttpURLConnection⽅法
这是基于⽹络通信HTTP协议的⽹络请求,其它两种框架也是基于HTTP协议的。HTTP协议是⼀款基于短连接的协议,每次交互完毕后连接断开,⽽HTTP请求⼜分为GET和POST两种⽅式,GET请求⽐
较简单,只需要在⽹址后⾯⽤?拼接请求的资源路径,如百度图⽚输⼊动漫关键字的地址
image.baidu/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=ind
ex&fr=&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E5%8A%A8%E6%BC%AB
可以看到index?后⾯跟了很多&连接的项⽬,这个&就是代表了⼀个个搜索的条件,⽽最后⼀个word=%E5%8A%A8%E6%BC%AB⼜是什么意思呢
就是输⼊的两个字”动漫”,这就是UTF-8编码后的字节,中⽂⼀个字符会编成三个字节,这是⽤16进制表⽰了⼀个字节。
从中也可以看到GET请求的⼀个限制,那就是不能传递中⽂,也不适合⼤数据量的数据提交。
⽽POST则就没这个限制,且安全性也⽐GET请求⾼,总结就是简单的⽹络请求⽤GET,⽐较复杂的要与服务器与交互的就⽤POST请求。
接下来就是发送GET请求和POST请求了。
GET请求
//1. URL
URL url = new URL("image.baidu/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E5%8A%A8 //2. HttpURLConnection
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
//3. set(GET)
conn.setRequestMethod("GET");
//4. getInputStream
InputStream is = InputStream();
//5. 解析is,获取responseText,这⾥⽤缓冲字符流
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
while((adLine()) != null){
sb.append(line);
}
//获取响应⽂本
String responseText = sb.toString();
POST请求
//1. URL
URL url = new URL("image.baidu/search/index");
//2. HttpURLConnection
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
//3. POST
conn.setRequestMethod("POST");
//4. Content-Type,这⾥是固定写法,发送内容的类型
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
//5. output,这⾥要记得开启输出流,将⾃⼰要添加的参数⽤这个输出流写进去,传给服务端,这是socket的基本结构
conn.setDoOutput(true);
OutputStream os = OutputStream();
String param = "tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E5%8A%A8%E6%BC%AB";
//⼀定要记得将⾃⼰的参数转换为字节,编码格式是utf-8
os.Bytes("utf-8"));
os.flush();
//6. is
InputStream is = InputStream();
//7. 解析is,获取responseText
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
android学习教程StringBuilder sb = new StringBuilder();
String line = null;
while((adLine()) != null){
sb.append(line);
}
//获取响应⽂本
String responseText = sb.toString();
2.Volley框架
GET请求
//1. 创建RequestQueue,这是⼀个请求队列,相当于消息机制处理
private RequestQueue mQueue = wRequestQueue(this);
//2. StringRequest
String url = "www.baidu";
StringRequest req = new StringRequest(url,
new Listener<String>() {
//请求成功后回调在主线程中执⾏
public void onResponse(String responseText) {
/
/解析json 封装结果数据
Gson gson = new Gson();
//这⾥⽤的Gson解析JSON字符串
User result=gson.fromJson(responseText,RequestResult.class);
}
}, new ErrorListener() {
//请求出错时执⾏回调在主线程中执⾏
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});
/
/把req 添加到请求队列中,⼀定要记得这⼀步,不然就相当于没有发送请求
mQueue.add(req);
POST请求
private RequestQueue mQueue;
//post请求要⽤commonRequest请求实现
String url="www.baidu";
CommonRequest request = new CommonRequest(Request.Method.POST,url,new Response.Listener<String>() {
public void onResponse(String response) {
try {
//这⾥是请求成功后调⽤的接⼝,⽤JSON⼯具解析数据
JSONObject obj = new JSONObject(response);
} catch (JSONException e) {
e.printStackTrace();
}
}
},new Response.ErrorListener() {
public void onErrorResponse(VolleyError error) {
}
}){
//如果⽤POST请求,要添加参数,⼀定要重写这个⽅法来添加参数
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> resultMap = new HashMap<String, String>();
//这⾥的添加的具体参数 resultMap.put("username",Name());
resultMap.put("userAge",Age());
resultMap.put("userGender",Gender());
resultMap.put("userSchool",School());
return resultMap;
}
};
mQueue.add(request);
}
3.Xutils3框架
GET请求
//第⼀步,新建⼀个请求参数对象
RequestParams params=new RequestParams("www.baidu?inm=2");
//直接调⽤x.http().get()⽅法,这⾥注意x是要⽤全局MyApplication中初始化后才可以使⽤,初始化⽅法为x.Ext.init(this)
x.http().get(params, new Callback.CommonCallback<String>() {
@Override
public void onCancelled(CancelledException arg0) {
}
@Override
public void onError(Throwable arg0, boolean arg1) {
Log.i("hap.zhu", "http_on_error,请求⽹络数据失败");
}
@Override
public void onFinished() {
}
@Override
public void onSuccess(String result) {
Log.i("hap.zhu", "请求数据结果为:"+result);
Gson gson=new Gson();
Result result=gson.fromJson(result,Result.class);
Log.i("hap.zhu", "加载结果为:"+String());
}
});
POST请求
//⽅法同GET,就是这么简单,⽹络请求成功会回调⾥的success接⼝,直接处理数据结果就⾏
RequestParams params=new RequestParams("www.baidu");
params.addBodyParameter("email", username);
params.addBodyParameter("password", password);
x.http().post(params, new CommonCallback<String>() {
@Override
public void onCancelled(CancelledException arg0) {
}
@Override
public void onError(Throwable arg0, boolean arg1) {
//⽹络错误也会提⽰错误
callback.String());
}
@Override
public void onFinished() {
}
@Override
public void onSuccess(String result) {
Gson gson=new Gson();
LoginResult loginResult=gson.fromJson(result, LoginResult.class);
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,谢谢⼤家对的⽀持。如果你想了解更多相关内容请查看下⾯相关链接
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论