Android 网络基础学习笔记三
三、 java原生代码网络请求(根据api发送请求,提交评论、带参请求)
提交评论
-
api:
"/post/comment" -
访问后台地址和端口(模拟器同一电脑访问): " http: //10.0.2.2:9102 "
创建变量:static final String BaseUrl = "http://10.0.2.2:9102" -
创建连接,URL对象:
URL url = new URL(BaseUrl + "/post/comment"); -
准备数据:
CommentItem commentItem = new CommentItem("888888888","学到了!"); //自定义Bean类,传两个参数
Gson gson = new Gson();
String jsonStr = gson.toJson(commentItem); //Gson对象将bean类对象转为json字段;
byte[] bytes = jsonStr.getBytes("UTF-8");
Log.d("jsonStr = ",jsonStr);
Log.d("bytes.length = ", String.valueOf(bytes.length));
connection.setRequestProperty("Content-Length", String.valueOf(bytes.length)); //报头所要传的信息
提交评论的完整代码:
- 创建连接,指定提交评论的api,设置相关参数;
- 准备评论内容,转为json字符串;
- 传输数据;
- 获取返回数据;
//提交评论请求
public void postRequest(View view) {
new Thread(new Runnable() {
@Override
public void run() {
OutputStream outputStream = null;
InputStream inputStream = null;
try {
URL url = new URL(BaseUrl + "/post/comment");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST"); //请求方式 由后台文档给出
connection.setConnectTimeout(10000); //超时
//给报头??必须的吗? 尝试过后,是必须的,设置发送请求和接收数据的格式,与代码中的一致才能发送成功;
connection.setRequestProperty("Content-Type","application/json;charset=UTF-8");
connection.setRequestProperty("Accept", "application/json, text/plain, */*");
//准备请求内容
CommentItem commentItem = new CommentItem("888888888","学到了!");
Gson gson = new Gson();
String jsonStr = gson.toJson(commentItem);
byte[] bytes = jsonStr.getBytes("UTF-8");
Log.d("jsonStr = ",jsonStr);
Log.d("bytes.length = ", String.valueOf(bytes.length));
connection.setRequestProperty("Content-Length", String.valueOf(bytes.length));
//连接
connection.connect();
//传输数据
outputStream = connection.getOutputStream();
outputStream.write(bytes);
outputStream.flush();
//那结果
int responseCode = connection.getResponseCode();
Log.d(TAG,"responseCode = " + responseCode);
if (responseCode== HttpURLConnection.HTTP_OK) {
inputStream = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
Log.d(TAG,"BufferedReader -> " + reader.readLine());
}
} catch (java.io.IOException e) {
e.printStackTrace();
}finally {
try {
if (outputStream != null) {
outputStream.close();
}
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
}
提交带参请求
方法:get
接口api:/get/param
参数:
- keyword 关键字
- page 页码
- order 0 顺序 1 逆序
提交带参请求的使用情境之一为网页中的搜索,在此例中,如图:
搜索关键字:“数据”,网址跳转为: https: //www. sunofbeach.net/ search? keyword=数据& type=article & page=1
请求格式为:baseUrl + api + ? + key=value + & + key2=value2 (有key和value的话就以"&"隔开)
- 网页上显示出来的网址与请求格式有区别,请求时应该用
服务器地址+":"+端口号+api+信息;
- 准备带参数据:
Map<String,String> params = new HashMap<>();
params.put("keyword","我才是关键字");
params.put("page","12");
params.put("order","0");
- 包装带参数据:带参数据需要打包成规定格式的字符串
if (params != null && params.size() > 0) {
StringBuilder sBuilder = new StringBuilder("?");
Iterator<Map.Entry<String, String>> iterator = params.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, String> next = iterator.next();
sBuilder.append(next.getKey());
sBuilder.append("=");
sBuilder.append(next.getValue());
if (iterator.hasNext()) {
sBuilder.append("&");
}
}
String paramsData = sBuilder.toString();
Log.d(TAG,"data result ->" + paramsData);
}
- 创建URL:
String BaseUrl = "http://10.0.2.2:9102";
String api = "/get/param";
url = new URL(BaseUrl + api + paramsData);
- 创建连接(省略介绍)
完整代码:
//提交带参请求;
public void getWithParams(View view) {
Map<String,String> paramsMap = new HashMap<>();
paramsMap.put("keyword","我才是关键字");
paramsMap.put("page","12");
paramsMap.put("order","0");
startRequest(paramsMap,"GET","/get/param");
}
private void startRequest(final Map<String, String> params, final String method, final String api) {
new Thread(new Runnable() {
@Override
public void run() {
//把流挪到try外面,方便关掉;
BufferedReader reader = null;
try {
URL url = null;
//包装参数数据(网页的请求网址): baseUrl + api + ? + key=value + & + key2=value2 (有key和value的话就以"&"隔开)
// 例:https: //www.sunofbeach.net/search?keyword=数据&type=article&page=1
if (params != null && params.size() > 0) {
StringBuilder sBuilder = new StringBuilder("?");
Iterator<Map.Entry<String, String>> iterator = params.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, String> next = iterator.next();
sBuilder.append(next.getKey());
sBuilder.append("=");
sBuilder.append(next.getValue());
if (iterator.hasNext()) {
sBuilder.append("&");
}
}
String paramsData = sBuilder.toString();
Log.d(TAG,"data result ->" + paramsData);
url = new URL(BaseUrl + api + paramsData);
}else {
url = new URL(BaseUrl + api);
}
//建立连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod(method);
connection.setRequestProperty("Accept-Language","zh-CH,zh;q=0.9");
connection.setRequestProperty("Accept","*/*");
connection.setConnectTimeout(10000);
connection.connect();
//拿到返回值
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String json = reader.readLine();
Log.d(TAG,"json:\r\n >>> " + json);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
}