发布:2023/2/23 10:43:29作者:管理员 来源:本站 浏览次数:1094
Android studio
一、安卓基于HTTP网络编程
(一)、两种请求方式
(二)、安卓基于HTTP网络编程的两种方式
1、使用HttpURLConnection访问网络资源**
2、利用HttpClient访问网络资源**
(1)HttpGet
(2)HttpPost
二、基础Okhttp的网络编程
1、okhttp的环境配置
2、OkHttp介绍
2.1 okhttp get的同步请求
2.2 okhttp get的异步请求
2.3 okhttp post的同步请求
2.4okhttp post的异步请求
3.获取案例演示
1.postschooldata.java
2.myapplication.java
3.activity_postdata.xml
4.activity_querydrive.xml
5.AndroidManifest.xml
6.xml文件夹下的:network_https_config.xml
7.运行结果截图
一、安卓基于HTTP网络编程
(一)、两种请求方式
HTTP协议中有两种不同的请求方式——GET方式和POST方式。
GET方式在进行数据请求时,会把数据附加到URL后面传递给服务器,比如常见的:http://XXX.XXX.XXX/XX.jsp?id=1
POST方式则是将请求的数据放到HTTP请求头中,作为请求头的一部分传入服务器。
所以,在进行HTTP编程前,首先要明确究竟使用的哪种方式进行数据请求的。
(二)、安卓基于HTTP网络编程的两种方式
1、使用HttpURLConnection访问网络资源**
HttpURLConnection conn = null;
String strUrl = "http://www.baidu.com";
URL url = new URL(strUrl);
conn = (HttpURLConnection) url.openConnection();
HttpURLConnection对网络资源的请求在默认情况下是使用GET方式的,所以当使用GET方式时,不需要我们做太多的工作;当我们需要使用POST方式时,就需要使用setRequestMethod(“POST”)来设置POST请求方式了。
2、利用HttpClient访问网络资源**
HttpClient类不是来自安卓,而是来自org.apache.http。和HttpURLConnection相同,HttpClient也存在GET和POST两种请求方式。
(1)HttpGet
在HttpClient中,我们可以非常轻松使用HttpGet对象来通过GET方式进行数据请求操作,当获得HttpGet对象后我们可以使用HttpClient的execute方法来向我们的服务器发送请求。在发送的GET请求被服务器相应后,会返回一个HttpResponse响应对象,利用这个响应的对象我们能够获得响应回来的状态码,如:200、400、401等等。
public String HttpGetMethod() {
String result = "";
try {
HttpGet httpRequest = new HttpGet(strUrl);
HttpClient httpClient = new DefaultHttpClient();
HttpResponse httpResponse = httpClient.execute(httpRequest);
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
result = EntityUtils.toString(httpResponse.getEntity());
} else {
result = "null";
}
return result;
} catch (Exception e) {
return null;
}
}
(2)HttpPost
当我们使用POST方式时,我们可以使用HttpPost类来进行操作。当获取了HttpPost对象后,我们就需要向这个请求体传入键值对,这个键值对我们可以使用NameValuePair对象来进行构造,然后再使用HttpRequest对象最终构造我们的请求体,最后使用HttpClient的execute方法来发送我们的请求,并在得到响应后返回一个HttpResponse对象。其他操作和我们在HttpGet对象中的操作一样。
public String HttpPostMethod(String key, String value) {
String result = "";
try {
// HttpPost连接对象
HttpPost httpRequest = new HttpPost(strUrl);
// 使用NameValuePair来保存要传递的Post参数
List<NameValuePair> params = new ArrayList<NameValuePair>();
// 添加要传递的参数
params.add(new BasicNameValuePair(key, value));
// 设置字符集
HttpEntity httpentity = new UrlEncodedFormEntity(params, "Utf-8");
// 请求httpRequest
httpRequest.setEntity(httpentity);
// 取得默认的HttpClient
HttpClient httpclient = new DefaultHttpClient();
// 取得HttpResponse
HttpResponse httpResponse = httpclient.execute(httpRequest);
// HttpStatus.SC_OK表示连接成功
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
// 取得返回的字符串
result = EntityUtils.toString(httpResponse.getEntity());
return result;
} else {
return "null";
}
} catch (Exception e) {
return null;
}
}
二、基础Okhttp的网络编程
android网络框架之OKhttp,一个处理网络请求的开源项目,是安卓端最火热的轻量级框架。android在开发的时候很少直接与数据库打交道,所以就有了通过接口的方式使android与数据库间接通信,通信方式就是使用okhttp插件。
1、okhttp的环境配置
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
并且在清单文件中打开网络权限
2、OkHttp介绍
OkHttp分为get和post请求,在这两种请求中又分为同步和异步的请求。同步的意思就是得等到服务器有相应才会继续往下走,所以同步的方式都需要开启一个线程。
2.1 okhttp get的同步请求
//注意网络同步请求必须要有一个子线程
//get同步请求
public void getSync(View view) {
new Thread(){
@Override
public void run() {
//get请求参数可以直接写在url后面
//https://www.httpbin.org/get为开源测试网址
Request request = new Request.Builder().url("https://www.httpbin.org/get?a=1&b=2").build();
//请求的call对象
Call call=okHttpClient.newCall(request);
try{
Response response =call.execute();
Log.e("get同步请求:", "getSync:"+response.body().string() );
}catch (IOException e){
e.printStackTrace();
}
}
}.start();
}
2.2 okhttp get的异步请求
//异步不需要创建线程
public void getAsync(View view) {
Request request = new Request.Builder().url("https://www.httpbin.org/get?a=1&b=2").build();
//请求的call对象
Call call=okHttpClient.newCall(request);
//异步请求
call.enqueue(new Callback() {
//失败的请求
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
}
//结束的回调
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
//响应码可能是404也可能是200都会走这个方法
if(response.isSuccessful()){
Log.e("get异步请求:", "getASync:"+response.body().string() );
}
}
});
}
2.3 okhttp post的同步请求
//okp默认是get请求,post需要有请求体,即formBody
public void postSync(View view) {
new Thread(){
@Override
public void run() {
FormBody formBody = new FormBody.Builder().add("a", "1").add("b", "2").build();
Request request = new Request.Builder().url("https://www.httpbin.org/post")
.post(formBody)
.build();
//请求的call对象
Call call=okHttpClient.newCall(request);
try{
Response response =call.execute();
Log.e("pot同步请求", "postSync:"+response.body().string() );
}catch (IOException e){
e.printStackTrace();
}
}
}.start();
}
2.4okhttp post的异步请求
public void postAsync(View view) {
FormBody formBody = new FormBody.Builder().add("a", "1").add("b", "2").build();
Request request = new Request.Builder().url("https://www.httpbin.org/post")
.post(formBody)
.build();
Call call=okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
if(response.isSuccessful()){
Log.e("pot异步请求", "postASync:"+response.body().string() );
}
}
});
}
3.获取案例演示
1.postschooldata.java
package com.example.newnewnet.school;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.text.Html;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import com.example.newnewnet.R;
import com.example.newnewnet.myapplication;
import com.example.newnewnet.entities.newRoot;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import okhttp3.Cookie;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class postschooldata extends AppCompatActivity {
private TextView showdata;
private OkHttpClient okHttpClient;
private Map<String,List<Cookie>> cookies = new HashMap<>();
private String token;
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_postdata);
showdata = findViewById(R.id.showdata);
okHttpClient = new OkHttpClient.Builder().build();
token = myapplication.token;
}
public void postData(View view){
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("username","user10");
jsonObject.addProperty("password","lisnso");
MediaType mediaType = MediaType.Companion.parse("application/json;charset=utf-8");
RequestBody body = RequestBody.Companion.create(String.valueOf(jsonObject),mediaType);
new Thread(() -> {
Request request = new Request.Builder()
.url("http://192.168.176.22:80/rest/account/login")
.post(body).build();
try {
Response execute = okHttpClient.newCall(request).execute();
String result = execute.body().string();
System.out.println(result);
runOnUiThread(new Runnable() {
@Override
public void run() {
showdata.setText(Html.fromHtml(result,Html.FROM_HTML_MODE_COMPACT));
Gson gson = new Gson();
newRoot response = gson.fromJson(result, new TypeToken<newRoot>() {
}.getType());
token = response.getData().getToken();
myapplication.token = token;
System.out.println(token);
//
Intent intent = new Intent(postschooldata.this, querydriveActivity.class);
startActivity(intent);
}
});
Log.d("这个是token", String.valueOf(token));
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
public void userdata(View view){
new Thread(() -> {
FormBody add = new FormBody.Builder().add("aa", "bb").build();
Request request = new Request.Builder()
.url("http://192.168.176.20/rest/sysmodel/listDeviceControlTypes")
.addHeader("Content-Type","application/json")
.addHeader("authorization",token)
.post(add).build();
try {
Response execute = okHttpClient.newCall(request).execute();
System.out.println(execute.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
}
2.myapplication.java
package com.example.newnewnet;
import android.app.Application;
public class myapplication extends Application{
private static myapplication mApp;
public static String token;
public static myapplication getInstance(){
return mApp;
}
}
3.activity_postdata.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="post数据"
android:onClick="postData"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="post数据"
android:onClick="userdata"/>
<TextView
android:id="@+id/showdata"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
4.activity_querydrive.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="post所有设备信息"
android:onClick="postqurayDrive"/>
<TextView
android:id="@+id/showdata"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
5.AndroidManifest.xml
打开网络权限
<uses-permission android:name="android.permission.INTERNET" />
6.xml文件夹下的:network_https_config.xml
<?xml version ="1.0" encoding ="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
7.运行结果截图
© Copyright 2014 - 2025 柏港建站平台 ejk5.com. 渝ICP备16000791号-4