本文介绍: WebView 已经在后台我们处理好了发送HTTP请求接收服务器响应解析返回数据,以及最终的页面展示这几步工作。只不过它封装得实在是太好了,反而使得我们不能那么直观地看出HTTP到底是如何工作的。因此,接下来我们通过方式,更加深入地理解这个过程。在过去,Android发送HTTP请求一般有两种方式:HttpURLConnection 和HttpClient。不过由于HttpClient 存在API数量过多、扩展困难等缺点,Android团队越来越不建议我们使用这种方式。

WebView 已经在后台帮我们处理好了发送HTTP请求接收服务器响应解析返回数据,以及最终的页面展示这几步工作。只不过它封装得实在是太好了,反而使得我们不能那么直观地看出HTTP到底是如何工作的。因此,接下来我们通过手动发送HTTP请求的方式,更加深入地理解这个过程

在过去,Android上发送HTTP请求一般有两种方式:HttpURLConnection 和HttpClient 。不过由于HttpClient 存在API数量过多、扩展困难等缺点,Android团队越来越不建议我们使用这种方式。终于在Android 6.0 系统中,HttpClient 的功能被完全移除了,标志着此功能被正式弃用。

现在,官方建议使用HttpURLConnection

HttpURLConnection

class MainActivity : AppCompatActivity() {
	override fun onCreate(savedInstanceState: Bundle?) { 
		super.onCreate(savedInstanceState) 
		setContentView(R.layout.activity_main) 
		
		sendRequestBtn.setOnClickListener {
			sendRequestWithHttpURLConnection() 
		}
	}
	/**
	在这个方法中先是开启一个线程然后在子线程使用HttpURLConnection 发出一条HTTP请求。
	*/
	private fun sendRequestWithHttpURLConnection() { // 开启线程发起网络请求
		thread {
			var connection: HttpURLConnection? = null 
			try {
				val response = StringBuilder()
				//首先,需要获取HttpURLConnection 的实例,一般只需创建一个URL对象,并传入目标网络地 址
				val url = URL("https://www.baidu.com")
				//然后调用一下openConnection()方法即可
				connection = url.openConnection() as HttpURLConnection 
				
				//设置:HTTP请求所使用方法连接超时读取超时的毫秒数
				connection.requestMethod = "GET"
				connection.connectTimeout = 8000 
				connection.readTimeout = 8000
				
				//之后,再调用getInputStream()方法可以获取服务器返回输入流了
				val input = connection.inputStream
				
				//接着利用BufferedReader服务器返回的流进行读取
				val reader = BufferedReader(InputStreamReader(input)) 
				reader.use {
					reader.forEachLine {
						response.append(it) 
					}
				}
				//将结果传入showResponse() 方法中。
				showResponse(response.toString()) 
			} catch (e: Exception) {
				e.printStackTrace() 
			} finally {
				connection?.disconnect() 
			}
		} 
	}
	private fun showResponse(response: String) { 
		runOnUiThread {
			// 在这里进行UI操作,将结果显示界面
			responseText.text = response 
		}
	}
}
<!-- AndroidManifest.xml 声明一下网络权限--&gt;
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
	package="com.example.networktest"&gt;
	<uses-permission android:name="android.permission.INTERNET" /&gt;
    ...
</manifest&gt;
<!-- activity_main.xml --&gt;
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
	android:orientation="vertical"
	android:layout_width="match_parent" 
	android:layout_height="match_parent" >
	
	<Button
	android:id="@+id/sendRequestBtn" 
	android:layout_width="match_parent" 
	android:layout_height="wrap_content" 
	android:text="Send Request" />
	
	<ScrollView 
		android:layout_width="match_parent" 
		android:layout_height="match_parent" >
		
		<TextView
		android:id="@+id/responseText" 
		android:layout_width="match_parent" 
		android:layout_height="wrap_content" />
		
	</ScrollView>
	
</LinearLayout>

提交数据服务器

connection.requestMethod = "POST"
val output = DataOutputStream(connection.outputStream) output.writeBytes("username=admin&amp;password=123456")

OkHttp

dependencies {
    ...
	implementation 'com.squareup.okhttp3:okhttp:4.1.0' 
}

下面我们来看一下OkHttp 的具体用法
首先,需要创建一个OkHttpClient的实例如下所示:

val client = OkHttpClient()

接下来如果想要发起一条HTTP请求,就需要创建一个Request对象:

val request = Request.Builder().build()

当然,上述代码只是创建了一个空的Request对象,并没有什么实际作用,我们可以在最终的 build()方法之前连缀很多其他方法来丰富这个Request对象比如可以通过url()方法来设置目标网络地址如下所示:

val request = Request.Builder()
		.url("https://www.baidu.com")
		.build()

之后调用OkHttpClient 的newCall()方法来创建一个Call对象,并调用它的execute()方法 来发送请求并获取服务返回数据写法如下:

val response = client.newCall(request).execute()

Response对象就是服务器返回数据了,我们可以使用如下写法来得到返回的具体内容:

val responseData = response.body?.string()

如果是发起一条POST请求,会比GET请求稍微复杂一点,我们需要构建一个Request Body 对象来存放提交参数,如下所示:

val requestBody = FormBody.Builder() 
		.add("username", "admin")
		.add("password", "123456") 
		.build()

然后在Request.Builder 中调用一下post()方法,并将RequestBody对象传入:

val request = Request.Builder() 
		.url("https://www.baidu.com")
		.post(requestBody) 
		.build()

接下来操作就和GET请求一样了,调用execute()方法来发送请求并获取服务器返回的数据即可

原文地址:https://blog.csdn.net/m0_60641871/article/details/134733687

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_23932.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注