欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android使用URLConnection提交请求的实现

程序员文章站 2023-12-10 13:27:52
url的openconnection()方法将返回一个urlconnection对象,该对象表示应用程序和url之间的通信连接。程序可以通过urlconnection实例向...

url的openconnection()方法将返回一个urlconnection对象,该对象表示应用程序和url之间的通信连接。程序可以通过urlconnection实例向该url发送请求,读取url引用的资源。

通常创建一个和url的连接,并发送请求、读取此url引用的资源需要如下几个步骤:
step1: 通过调用url对象的openconnection()方法来创建urlconnection对象;
step2:设置urlconnection的参数和普通请求属性;
step3:如果只是发送get方式的请求,那么使用connect方法建立和远程资源之间的实际连接即可;如果需要发送post方式的请求,则需要获取urlconnection实例对应的输出流来发送请求参数;
step4:远程资源变为可用,程序可以访问远程资源的头字段,或通过流入流读取远程资源的数据。

下面的程序demo示范了如何向web站点发送get请求、post请求,并从web站点取得响应。该程序中用到一个get、post请求的工具类,该类代码如下:

getpostutil.java逻辑代码如下:

package com.fukaimei.getposttest;

import android.util.log;

import java.io.bufferedreader;
import java.io.ioexception;
import java.io.inputstreamreader;
import java.io.printwriter;
import java.net.url;
import java.net.urlconnection;
import java.util.list;
import java.util.map;

/**
 * created by fukaimei on 2017/10/2.
 */

public class getpostutil {

  private static final string tag = "getpostutil";

  /**
   * 向指定url发送get方式的请求
   *
   * @param url  发送请求的url
   * @param params 请求参数,请求参数应该是name1=value1 & name2=value2的形式
   * @return url所代表远程资源的响应
   */
  public static string sendget(string url, string params) {
    string result = "";
    bufferedreader in = null;
    try {
      string urlname = url + "?" + params;
      url realurl = new url(urlname);
      // 打开和url之间的连接
      urlconnection conn = realurl.openconnection();
      // 设置通用的请求属性
      conn.setrequestproperty("accept", "*/*");
      conn.setrequestproperty("connection", "keep-alive");
      conn.setrequestproperty("user-agent", "mozilla/4.0 (compatible; msie 6.0; windows nt 5.1; sv1)");
      // 建立实际的连接
      conn.connect();
      // 获取所有的响应头字段
      map<string, list<string>> map = conn.getheaderfields();
      // 遍历所有的响应头字段
      for (string key : map.keyset()) {
        log.d(tag, key + "---->" + map.get(key));
      }
      // 定义bufferedreader输入流来读取url的响应
      in = new bufferedreader(new inputstreamreader(conn.getinputstream()));
      string line;
      while ((line = in.readline()) != null) {
        result += "\n" + line;
      }
    } catch (exception e) {
      log.d(tag, "发送get请求出现异常!" + e);
      e.printstacktrace();
    } finally { // 使用finally块来关闭输入流
      try {
        if (in != null) {
          in.close();
        }
      } catch (ioexception e) {
        e.printstacktrace();
      }
    }
    return result;
  }

  /**
   * 向指定url发送post方式的请求
   *
   * @param url  发送请求的url
   * @param params 请求参数,请求参数应该是name1=value1 & name2=value2的形式
   * @return 所代表远程资源的响应
   */
  public static string sendpost(string url, string params) {
    printwriter out = null;
    bufferedreader in = null;
    string result = "";
    try {
      url realurl = new url(url);
      // 打开和url之间的连接
      urlconnection conn = realurl.openconnection();
      // 设置通用的请求属性
      conn.setrequestproperty("accept", "*/*");
      conn.setrequestproperty("connection", "keep-alive");
      conn.setrequestproperty("user-agent", "mozilla/4.0 (compatible; msie 6.0; windows nt 5.1; sv1)");
      // 发送post请求必须设置如下两行
      conn.setdooutput(true);
      conn.setdoinput(true);
      // 获取urlconnection对象对应的输出流
      out = new printwriter(conn.getoutputstream());
      // 发送请求参数
      out.print(params);
      // flush输出流的缓存
      out.flush();
      // 定义bufferedreader输入流来读取url的响应
      in = new bufferedreader(new inputstreamreader(conn.getinputstream()));
      string line;
      while ((line = in.readline()) != null) {
        result += "\n" + line;
      }
    } catch (exception e) {
      log.d(tag, "发送post请求出现异常!" + e);
      e.printstacktrace();
    } finally { // 使用finally块来关闭输出流、输入流
      try {
        if (out != null) {
          out.close();
        }
        if (in != null) {
          in.close();
        }
      } catch (ioexception e) {
        e.printstacktrace();
      }
    }
    return result;
  }
}

从上面的程序demo可以看出,如果需要发送get请求,只要调用urlconnection的connect()方法去建立实际的连接即可。如果需要发送post请求,则需要获取urlconnection的outputstream,然后再向网络中输出请求参数。
提供了上面发送get请求、post请求的工具类之后,接下来就可以在activity类中通过该工具类发送请求了。该程序的界面中包含两个按钮,一个按钮用于发送get请求,一个按钮用于发送post请求。程序还提供了一个edittext来显示服务器的响应。

layout/activity_main.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">

  <linearlayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="horizontal">

    <button
      android:id="@+id/get"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="发送get请求" />

    <button
      android:id="@+id/post"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="发送post请求" />
  </linearlayout>

  <textview
    android:id="@+id/show"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffff"
    android:gravity="top"
    android:textcolor="#f000"
    android:textsize="16sp" />
</linearlayout>

mainactivity.java逻辑代码如下:

package com.fukaimei.getposttest;

import android.os.handler;
import android.os.message;
import android.support.v7.app.appcompatactivity;
import android.os.bundle;
import android.view.view;
import android.widget.button;
import android.widget.textview;

public class mainactivity extends appcompatactivity {

  button get, post;
  textview show;
  // 代表服务器响应的字符串
  string response;
  handler handler = new handler() {
    @override
    public void handlemessage(message msg) {
      if (msg.what == 0x123) {
        // 设置show控件服务器响应
        show.settext(response);
      }
    }
  };

  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.activity_main);
    get = (button) findviewbyid(r.id.get);
    post = (button) findviewbyid(r.id.post);
    show = (textview) findviewbyid(r.id.show);
    get.setonclicklistener(new view.onclicklistener() {
      @override
      public void onclick(view v) {
        new thread() {
          @override
          public void run() {
            response = getpostutil.sendget("https://www.mi.com/", null);
            // 发送消息通知ui线程更新ui组件
            handler.sendemptymessage(0x123);
          }
        }.start();
      }
    });
    post.setonclicklistener(new view.onclicklistener() {
      @override
      public void onclick(view v) {
        new thread() {
          @override
          public void run() {
            response = getpostutil.sendpost("http://172.xx.xx.xxx:8080/fukaimei/login.jsp", "name=android&pass=123");
          }
        }.start();
        // 发送消息通知ui线程更新ui组件
        handler.sendemptymessage(0x123);
      }
    });
  }
}

上面程序demo中用于发送get请求、post请求。从上面的代码可以发现,借助于urlconnection类的帮助,应用程序可以非常方便地与指定站点交换信息,包括发送get请求、post请求,并获取网站的响应等。

注意:由于该程序需要访问互联网,因此还需要在清单文件androidmanifest.xml文件中授权访问互联网的权限:

<!-- 授权访问互联网-->
  <uses-permission android:name="android.permission.internet" />

demo程序运行效果界面截图如下:

Android使用URLConnection提交请求的实现Android使用URLConnection提交请求的实现

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。