当前位置:   article > 正文

Android App网络通信中通过okhttp调用HTTP接口讲解及实战(包括GET、表单格式POST、JSON格式POST 附源码)_androidjson格式的post请求

androidjson格式的post请求

需要全部源码或运行有问题请点赞关注收藏后评论区留言~~~

一、通过okhttp调用HTTP接口

尽管使用HttpURLConnection能够实现大多数的网络访问操作,但是操作过于繁琐,于是Andorid从9.0是使用okhttp这个框架

由于okhttp属于第三方框架  所以使用前要修改模块的build.gradle 增加下面一行依赖配置

implementation 'com.squareup.okhttp3:okhttp:4.9.1

当然访问网络之前需要先申请上网权限,也就是在AndroidManifest.xml中补充以下权限

<uses-permission android:name="android.permission.INTERNET"/>

 okhttp的网络访问功能非常强大,单就HTTP接口调用而言,它就支持三种访问方式。分别是GET方式的请求,表单格式的POST请求,JSON格式的POST请求 下面分别进行讲解以及实战

1:GET方式的请求

不管是GET还是POST方式 okhttp在访问网络时都要经历以下四个步骤

1:使用OkHttpClient类创建一个okhttp客户端对象

2:使用Request类创建一个GET或POST方式的请求结构

3:调用第一步骤中客户点对象的newCall方法 方法参数为第二步骤中的请求结构

4:调用第三步骤中Call对象的enquene方法,将本次请求加入HTTP访问的执行队列

综合以下四个步骤 接下来查询新浪网的证券板块的上证指数作为实战例子

读者可自行查询其他网址 进行替换即可

 

 

 2:表单格式的POST请求

对于okhttp来说,POST方式与GET方式的调用过程大同小异,主要区别在于如何创建请求结构,除了通过post方法表示本次请求采取POST方式外,还要给post方法填入请求参数

下面以登录功能为例,用户输入用户名和密码,App会把它们封装进FormBody结构后提交给后端服务器进行验证

当然首先你要确保后端服务器接口正常开启和运行~

 3:JSON格式的POST请求

由于表单格式不能传递复杂的数据,因此App在于服务端交互时经常使用JSON格式,设定好JSON串的字符编码后再放入RequestBody结构中

同样要确保服务器接口开启并且正常运行

 最后 全部代码如下

Java类

  1. package com.example.network;
  2. import android.os.Bundle;
  3. import android.view.View;
  4. import android.widget.EditText;
  5. import android.widget.LinearLayout;
  6. import android.widget.RadioGroup;
  7. import android.widget.TextView;
  8. import androidx.appcompat.app.AppCompatActivity;
  9. import com.example.network.constant.NetConst;
  10. import org.json.JSONObject;
  11. import java.io.IOException;
  12. import okhttp3.Call;
  13. import okhttp3.Callback;
  14. import okhttp3.FormBody;
  15. import okhttp3.MediaType;
  16. import okhttp3.OkHttpClient;
  17. import okhttp3.Request;
  18. import okhttp3.RequestBody;
  19. import okhttp3.Response;
  20. public class OkhttpCallActivity extends AppCompatActivity {
  21. private final static String TAG = "OkhttpCallActivity";
  22. private final static String URL_STOCK = "https://hq.sinajs.cn/list=s_sh000001";
  23. private final static String URL_LOGIN = NetConst.HTTP_PREFIX + "login";
  24. private LinearLayout ll_login; // 声明一个线性布局对象
  25. private EditText et_username; // 声明一个编辑框对象
  26. private EditText et_password; // 声明一个编辑框对象
  27. private TextView tv_result; // 声明一个文本视图对象
  28. private int mCheckedId = R.id.rb_get; // 当前选中的单选按钮资源编号
  29. @Override
  30. protected void onCreate(Bundle savedInstanceState) {
  31. super.onCreate(savedInstanceState);
  32. setContentView(R.layout.activity_okhttp_call);
  33. ll_login = findViewById(R.id.ll_login);
  34. et_username = findViewById(R.id.et_username);
  35. et_password = findViewById(R.id.et_password);
  36. tv_result = findViewById(R.id.tv_result);
  37. RadioGroup rg_method = findViewById(R.id.rg_method);
  38. rg_method.setOnCheckedChangeListener((group, checkedId) -> {
  39. mCheckedId = checkedId;
  40. int visibility = mCheckedId == R.id.rb_get ? View.GONE : View.VISIBLE;
  41. ll_login.setVisibility(visibility);
  42. });
  43. findViewById(R.id.btn_send).setOnClickListener(v -> {
  44. if (mCheckedId == R.id.rb_get) {
  45. doGet(); // 发起GET方式的HTTP请求
  46. } else if (mCheckedId == R.id.rb_post_form) {
  47. postForm(); // 发起POST方式的HTTP请求(报文为表单格式)
  48. } else if (mCheckedId == R.id.rb_post_json) {
  49. postJson(); // 发起POST方式的HTTP请求(报文为JSON格式)
  50. }
  51. });
  52. }
  53. // 发起GET方式的HTTP请求
  54. private void doGet() {
  55. OkHttpClient client = new OkHttpClient(); // 创建一个okhttp客户端对象
  56. // 创建一个GET方式的请求结构
  57. Request request = new Request.Builder()
  58. //.get() // 因为OkHttp默认采用get方式,所以这里可以不调get方法
  59. .header("Accept-Language", "zh-CN") // 给http请求添加头部信息
  60. .url(URL_STOCK) // 指定http请求的调用地址
  61. .build();
  62. Call call = client.newCall(request); // 根据请求结构创建调用对象
  63. // 加入HTTP请求队列。异步调用,并设置接口应答的回调方法
  64. call.enqueue(new Callback() {
  65. @Override
  66. public void onFailure(Call call, IOException e) { // 请求失败
  67. // 回到主线程操纵界面
  68. runOnUiThread(() -> tv_result.setText("调用股指接口报错:"+e.getMessage()));
  69. }
  70. @Override
  71. public void onResponse(Call call, final Response response) throws IOException { // 请求成功
  72. String resp = response.body().string();
  73. // 回到主线程操纵界面
  74. runOnUiThread(() -> tv_result.setText("调用股指接口返回:\n"+resp));
  75. }
  76. });
  77. }
  78. // 发起POST方式的HTTP请求(报文为表单格式)
  79. private void postForm() {
  80. String username = et_username.getText().toString();
  81. String password = et_password.getText().toString();
  82. // 创建一个表单对象
  83. FormBody body = new FormBody.Builder()
  84. .add("username", username)
  85. .add("password", password)
  86. .build();
  87. OkHttpClient client = new OkHttpClient(); // 创建一个okhttp客户端对象
  88. // 创建一个POST方式的请求结构
  89. Request request = new Request.Builder().post(body).url(URL_LOGIN).build();
  90. Call call = client.newCall(request); // 根据请求结构创建调用对象
  91. // 加入HTTP请求队列。异步调用,并设置接口应答的回调方法
  92. call.enqueue(new Callback() {
  93. @Override
  94. public void onFailure(Call call, IOException e) { // 请求失败
  95. // 回到主线程操纵界面
  96. runOnUiThread(() -> tv_result.setText("调用登录接口报错:"+e.getMessage()));
  97. }
  98. @Override
  99. public void onResponse(Call call, final Response response) throws IOException { // 请求成功
  100. String resp = response.body().string();
  101. // 回到主线程操纵界面
  102. runOnUiThread(() -> tv_result.setText("调用登录接口返回:\n"+resp));
  103. }
  104. });
  105. }
  106. // 发起POST方式的HTTP请求(报文为JSON格式)
  107. private void postJson() {
  108. String username = et_username.getText().toString();
  109. String password = et_password.getText().toString();
  110. String jsonString = "";
  111. try {
  112. JSONObject jsonObject = new JSONObject();
  113. jsonObject.put("username", username);
  114. jsonObject.put("password", password);
  115. jsonString = jsonObject.toString();
  116. } catch (Exception e) {
  117. e.printStackTrace();
  118. }
  119. // 创建一个POST方式的请求结构
  120. RequestBody body = RequestBody.create(jsonString, MediaType.parse("text/plain;charset=utf-8"));
  121. OkHttpClient client = new OkHttpClient(); // 创建一个okhttp客户端对象
  122. Request request = new Request.Builder().post(body).url(URL_LOGIN).build();
  123. Call call = client.newCall(request); // 根据请求结构创建调用对象
  124. // 加入HTTP请求队列。异步调用,并设置接口应答的回调方法
  125. call.enqueue(new Callback() {
  126. @Override
  127. public void onFailure(Call call, IOException e) { // 请求失败
  128. // 回到主线程操纵界面
  129. runOnUiThread(() -> tv_result.setText("调用登录接口报错:"+e.getMessage()));
  130. }
  131. @Override
  132. public void onResponse(Call call, final Response response) throws IOException { // 请求成功.setText("调用登录接口返回:\n"+resp));
  133. }
  134. });
  135. }
  136. }

XML文件

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent"
  4. android:orientation="vertical">
  5. <RadioGroup
  6. android:id="@+id/rg_method"
  7. android:layout_width="match_parent"
  8. android:layout_height="30dp"
  9. android:orientation="horizontal">
  10. <RadioButton
  11. android:id="@+id/rb_get"
  12. android:layout_width="0dp"
  13. android:layout_height="match_parent"
  14. android:layout_weight="1"
  15. android:checked="true"
  16. android:gravity="left|center"
  17. android:text="GET方式"
  18. android:textColor="@color/black"
  19. android:textSize="16sp" />
  20. <RadioButton
  21. android:id="@+id/rb_post_form"
  22. android:layout_width="0dp"
  23. android:layout_height="match_parent"
  24. android:layout_weight="1"
  25. android:checked="false"
  26. android:gravity="left|center"
  27. android:text="表单POST"
  28. android:textColor="@color/black"
  29. android:textSize="16sp" />
  30. <RadioButton
  31. android:id="@+id/rb_post_json"
  32. android:layout_width="0dp"
  33. android:layout_height="match_parent"
  34. android:layout_weight="1"
  35. android:checked="false"
  36. android:gravity="left|center"
  37. android:text="JSON POST"
  38. android:textColor="@color/black"
  39. android:textSize="16sp" />
  40. </RadioGroup>
  41. <LinearLayout
  42. android:id="@+id/ll_login"
  43. android:layout_width="match_parent"
  44. android:layout_height="wrap_content"
  45. android:paddingLeft="5dp"
  46. android:paddingRight="5dp"
  47. android:orientation="vertical"
  48. android:visibility="gone">
  49. <LinearLayout
  50. android:layout_width="match_parent"
  51. android:layout_height="40dp"
  52. android:orientation="horizontal">
  53. <TextView
  54. android:layout_width="wrap_content"
  55. android:layout_height="match_parent"
  56. android:gravity="center"
  57. android:text="用户名:"
  58. android:textColor="@color/black"
  59. android:textSize="17sp" />
  60. <EditText
  61. android:id="@+id/et_username"
  62. android:layout_width="0dp"
  63. android:layout_height="match_parent"
  64. android:layout_weight="1"
  65. android:background="@drawable/editext_selector"
  66. android:gravity="left|center"
  67. android:hint="请输入用户名"
  68. android:maxLength="11"
  69. android:textColor="@color/black"
  70. android:textSize="17sp" />
  71. </LinearLayout>
  72. <LinearLayout
  73. android:layout_width="match_parent"
  74. android:layout_height="40dp"
  75. android:layout_marginTop="10dp"
  76. android:orientation="horizontal">
  77. <TextView
  78. android:layout_width="wrap_content"
  79. android:layout_height="match_parent"
  80. android:gravity="center"
  81. android:text="密 码:"
  82. android:textColor="@color/black"
  83. android:textSize="17sp" />
  84. <EditText
  85. android:id="@+id/et_password"
  86. android:layout_width="0dp"
  87. android:layout_height="match_parent"
  88. android:layout_weight="1"
  89. android:background="@drawable/editext_selector"
  90. android:gravity="left|center"
  91. android:hint="请输入密码"
  92. android:inputType="numberPassword"
  93. android:maxLength="6"
  94. android:textColor="@color/black"
  95. android:textSize="17sp" />
  96. </LinearLayout>
  97. </LinearLayout>
  98. <Button
  99. android:id="@+id/btn_send"
  100. android:layout_width="match_parent"
  101. android:layout_height="wrap_content"
  102. android:text="发起接口调用"
  103. android:textColor="@color/black"
  104. android:textSize="17sp" />
  105. <TextView
  106. android:id="@+id/tv_result"
  107. android:layout_width="match_parent"
  108. android:layout_height="wrap_content"
  109. android:paddingLeft="5dp"
  110. android:textColor="@color/black"
  111. android:textSize="17sp" />
  112. </LinearLayout>

创作不易 觉得有帮助请点赞关注收藏~~~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/264966
推荐阅读
相关标签
  

闽ICP备14008679号