Android网络开发中GET与POST请求详解

作者:小徐加油 时间:2022-05-28 23:23:53 

1.URI与URL

URI(Uniform Resource Identifier,统一资源标志符),表示web上的每一种可用资源,具体的东西例如HTML文档,图像、视频、程序等。

URL(Uniform Resource Locator,统一资源定 位 器),也就是网络地址。

URL是URI的一种。

URI是对网络资源更宽泛的一种标识。

URL通常指的是网络连接,更多以http://www开头。

2.申请一个天气的免费API

网址:https://www.yiketianqi.com/index/doc,登陆后会自动生成属于自己的appid和appsecret

Android网络开发中GET与POST请求详解

3.GET请求

主要目的:从服务端获取符合条件的数据。

会向服务端发送少量数据,携带的参数会拼接在URL后面,参数是少量而有限的

GET请求的URL举例:

https://www.tianqiapi.com/free/day?cityid=10010&cityname=北京&data=20220728

协议(https://)域名及端口(www.tianqiapi.com:80) 路径(/free/day)条件(cityid=10010&cityname=北京&data=20220728)

NetUtil程序如下:

public class NetUtil{
public static String BASE_URL="https://v0.yiketianqi.com/free/day";
public static String APP_ID="14846972";
public static String APP_SECRET="Guya4Gz2";
public static String doGet(String url){
BufferedReader reader = null;
String bookHSONString = null;
try{
//1.HttpURLConnection建立连接
HttpURLConnection httpURLConnection = null;
URL requestUrl = new URL(url);
httpURLConnection = (HttpURLConnection)requestUrl.openconnection();//打开连接
httpURLConnection.setRequestMethod("GET");//两种方法GET/POST
httpURLConnection.setConnectionTimeout(5000);//设置超时连接时间
httpURLConnection.connect();
//2.InputStream获取二进制流
InputStream inputstream = httpURLConnection.getInputStream();
//3.InputStreamReader将二进制流进行包装成BufferedReader
reader = new BufferedReader(new InputStreamReader(inputStream));
//4.从BufferedReader中读取String字符串,用StringBulider接收
StringBulider bulider = new StringBulider();
String line;
while((line=reader.readLine())!=null){
bulider.append(line);
bulider.append("\n");
}
if(bulider.length()==0)
{
return null;
}
//5.StringBulider将字符串进行拼接
bookJSONString = bulider.toString();
}catch(MalformedURLException e){
e.printStackTrace();
}finally {
           // 关闭连接
           if (urlConnection != null) {
               urlConnection.disconnect();
           }
           if (reader != null) {
               try {
                   reader.close();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
       }
return bookJSONString;
}
public static String getWeatherOfCity(String city){
//拼接处get请求的url
String weatherUrl = BASE_URL+"?"+"appid="+APP_ID+"&"+"appsecret="+APP_SECRET+"&"+"city="+city;
//打印上面的url
Log.d("fan","-----weatherUrl----"+weatherUrl);
//调用上文所写的doGet方法,传参
String weatherResult = doGet(weatherUrl);
return decodeUnicode(weatherResult);
}
//解码Unicode,将其转化为我们认识的汉字
public static String decodeUnicode(String unicodeStr) {
       if (unicodeStr == null) {
           return null;
       }
       StringBuffer retBuf = new StringBuffer();
       int maxLoop = unicodeStr.length();
       for (int i = 0; i < maxLoop; i++) {
           if (unicodeStr.charAt(i) == '\\') {
               if ((i < maxLoop - 5) && ((unicodeStr.charAt(i + 1) == 'u') || (unicodeStr.charAt(i + 1) == 'U')))
                   try {
                       retBuf.append((char) Integer.parseInt(unicodeStr.substring(i + 2, i + 6), 16));
                       i += 5;
                   } catch (NumberFormatException localNumberFormatException) {
                       retBuf.append(unicodeStr.charAt(i));
                   }
               else
                   retBuf.append(unicodeStr.charAt(i));
           } else {
               retBuf.append(unicodeStr.charAt(i));
           }
       }
       return retBuf.toString();
   }
}

MainActivity.java程序如下:

public class MainActivity extends AppCompatActivity{
private TextView tvContent;
//此处写一个handler程序
private Handler mHandler = new Handler(Looper.myLooper()){
@Override
public void handleMessage(@NonNull Message msg){
super.handlerMessage(msg);
if(msg.what==0){
String strData = (String)msg.obj;
tvContent.setText(strData);
Toast.makeText(MainActivity.this,"主线程收到网络消息啦!",Toast.LENGTH_SHORT).show();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       tvContent = findViewById(R.id.tv_content);
   }
   public void start(View view){
   //做一个耗时任务
   new Thread(new Runnable(){
   @Override
   public void run(){
   String stringFormNet = getStringFormNet();
   //使用handler来发送消息
Message message = new Message();
message.what = 0;//用于区分是谁发的消息
   message.obj = stringFormNet;
   mHandler.sendMessage(meaasge);
   }
   }).start();
   Toast.makeText(MainActivity.this,"开启子线程请求网络!",Toast.LENGTH_SHORT).show();
   }
   private String getStringFormNet(){
//从网络上获取字符串
return NetUtil.getWeatherofCity("深圳");
}
}

运行结果:

Android网络开发中GET与POST请求详解

4.POST请求

主要目的:向服务端提交数据。

也会接收少量服务端的响应数据,携带的参数会单独放到map中,参数是大量的。

POST请求的URL举例:

https://www.tianqiapi.com/free/day+Map<String,String><city_id,1010><city_name,北京><date,20220728>

来源:https://blog.csdn.net/tou_tu_le/article/details/126040394

标签:Android,GET,POST,网络请求
0
投稿

猜你喜欢

  • 关于后端如何解决跨域的问题说明

    2023-09-19 00:59:10
  • C#定义简单的反射工厂实例分析

    2021-08-21 15:16:16
  • C语言 奇偶排序算法详解及实例代码

    2023-04-17 04:47:39
  • 老生常谈设计模式之动态代理

    2021-06-12 06:15:50
  • java并发编程_线程池的使用方法(详解)

    2023-03-29 22:23:00
  • C#实现翻转字符串的方法

    2021-11-23 11:51:48
  • C#使用CefSharp实现内嵌网页详解

    2022-04-12 15:02:00
  • 深入理解C#之继承

    2022-02-25 07:25:44
  • springboot 高版本后继续使用log4j的完美解决方法

    2021-12-06 11:12:41
  • C#的回调机制浅析

    2022-04-06 19:10:32
  • SpringBoot和Swagger结合提高API开发效率

    2023-11-25 01:23:16
  • android I/0流操作文件(文件存储)

    2021-11-13 19:42:37
  • 在Java中使用redisTemplate操作缓存的方法示例

    2023-07-04 09:03:28
  • C语言代码实现三子棋小游戏

    2023-04-16 02:12:41
  • Java实现List集合转树形结构的示例详解

    2021-11-11 10:48:33
  • springboot 整合 sa-token简介及入门教程

    2023-03-24 01:10:45
  • 重新启动IDEA时maven项目SSM框架文件变色所有@注解失效

    2021-12-08 06:42:23
  • 通过图例了解PowerDesigner使用方法

    2021-06-05 23:16:24
  • Android编程中context及全局变量实例详解

    2023-11-17 05:58:40
  • C#设计模式之策略模式

    2023-08-08 21:00:11
  • asp之家 软件编程 m.aspxhome.com