当前位置: 移动技术网 > IT编程>移动开发>Android > Android使用URLConnection提交请求的实现

Android使用URLConnection提交请求的实现

2019年07月24日  | 移动技术网IT编程  | 我要评论

个人爱好及特长范文,建平人事考试网,铁血大民

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程序运行效果界面截图如下:

这里写图片描述这里写图片描述

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网