Android之用HTTP的get,post,HttpClient三种方式向service提交文本数据

/**  * HTTP请求  * @author kesenhoo  *  */  public class HttpRequest   {         public static boolean sendXML(String path, String xml)throws Exception      {          byte[] data = xml.getBytes();          URL url = new URL(path);          HttpURLConnection conn = (HttpURLConnection)url.openConnection();          conn.setRequestMethod("POST");          conn.setConnectTimeout(5 * 1000);          //如果通过post提交数据,必须设置允许对外输出数据          conn.setDoOutput(true);          conn.setRequestProperty("Content-Type", "text/xml; charset=UTF-8");          conn.setRequestProperty("Content-Length", String.valueOf(data.length));          OutputStream outStream = conn.getOutputStream();          outStream.write(data);          outStream.flush();          outStream.close();          if(conn.getResponseCode()==200)          {              return true;          }          return false;      }      /**      * 通过get方式提交参数给服务器      * @param path      * @param params      * @param enc      * @return      * @throws Exception      */      public static boolean sendGetRequest(String path, Map<String, String> params, String enc) throws Exception      {          //构造如下形式的字符串,这里的字符串依情况不同          // ?method=save&title=435435435&timelength=89&                //使用StringBuilder对象          StringBuilder sb = new StringBuilder(path);          sb.append('?');               //迭代Map          for(Map.Entry<String, String> entry : params.entrySet())          {              sb.append(entry.getKey()).append('=')                  .append(URLEncoder.encode(entry.getValue(), enc)).append('&');          }          sb.deleteCharAt(sb.length()-1);          //打开链接          URL url = new URL(sb.toString());          HttpURLConnection conn = (HttpURLConnection)url.openConnection();          conn.setRequestMethod("GET");          conn.setConnectTimeout(5 * 1000);          //如果请求响应码是200,则表示成功          if(conn.getResponseCode()==200)          {              return true;          }          return false;      }            /**      * 通过Post方式提交参数给服务器      * @param path      * @param params      * @param enc      * @return      * @throws Exception      */      public static boolean sendPostRequest(String path, Map<String, String> params, String enc) throws Exception      {          //需要构造的字符串形式如下:          // title=dsfdsf&timelength=23&method=save          StringBuilder sb = new StringBuilder();          //如果参数不为空          if(params!=null && !params.isEmpty())          {              for(Map.Entry<String, String> entry : params.entrySet())              {                  //Post方式提交参数的话,不能省略内容类型与长度                  sb.append(entry.getKey()).append('=')                      .append(URLEncoder.encode(entry.getValue(), enc)).append('&');              }              sb.deleteCharAt(sb.length()-1);          }          //得到实体的二进制数据          byte[] entitydata = sb.toString().getBytes();          URL url = new URL(path);          HttpURLConnection conn = (HttpURLConnection)url.openConnection();          conn.setRequestMethod("POST");          conn.setConnectTimeout(5 * 1000);          //如果通过post提交数据,必须设置允许对外输出数据          conn.setDoOutput(true);          //这里只设置内容类型与内容长度的头字段          //内容类型Content-Type: application/x-www-form-urlencoded          //内容长度Content-Length: 38          conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");          conn.setRequestProperty("Content-Length", String.valueOf(entitydata.length));          OutputStream outStream = conn.getOutputStream();          //把实体数据写入是输出流          outStream.write(entitydata);          //内存中的数据刷入          outStream.flush();          outStream.close();          //如果请求响应码是200,则表示成功          if(conn.getResponseCode()==200)          {              return true;          }          return false;      }            /**      * 在遇上HTTPS安全模式或者操作cookie的时候使用HTTPclient会方便很多      * 使用HTTPClient(开源项目)向服务器提交参数      * @param path      * @param params      * @param enc      * @return      * @throws Exception      */      public static boolean sendRequestFromHttpClient(String path, Map<String, String> params, String enc) throws Exception      {          //需要把参数放到NameValuePair          List<NameValuePair> paramPairs = new ArrayList<NameValuePair>();          if(params!=null && !params.isEmpty())          {              for(Map.Entry<String, String> entry : params.entrySet())              {                  paramPairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));              }          }          //对请求参数进行编码,得到实体数据          UrlEncodedFormEntity entitydata = new UrlEncodedFormEntity(paramPairs, enc);          //构造一个请求路径          HttpPost post = new HttpPost(path);           //设置请求实体          post.setEntity(entitydata);          //浏览器对象          DefaultHttpClient client = new DefaultHttpClient();           //执行post请求          HttpResponse response = client.execute(post);          //从状态行中获取状态码,判断响应码是否符合要求          if(response.getStatusLine().getStatusCode()==200)          {              return true;          }          return false;      }  }  

android自动获取短信验证码

前言:android应用的自动化测试必然会涉及到注册登录功能,而许多的注册登录或修改密码功能常常需要输入短信验证码,因此有必要能够自动获得下发的短信验证码。
主要就是实时获取短信信息。
android上获取短信信息主要有BroadcastReceiver方式与数据库方式,要实时的话就BroadcastReceiver比较方便

public class SMSReceiver extends BroadcastReceiver{ private String verifyCode=""; public static final String TAG = "SMSReceiver"; public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED"; @Override public void onReceive(Context context, Intent intent){ if (intent.getAction().equals(SMS_RECEIVED_ACTION)){ SmsMessage[] messages = getMessagesFromIntent(intent); for (SmsMessage message : messages){ Log.i(TAG, message.getOriginatingAddress() + " : " + message.getDisplayOriginatingAddress() + " : " + message.getDisplayMessageBody() + " : " + message.getTimestampMillis()); String smsContent=message.getDisplayMessageBody(); Log.i(TAG, smsContent); writeFile(smsContent);//将短信内容写入SD卡 } } } public final SmsMessage[] getMessagesFromIntent(Intent intent){ Object[] messages = (Object[]) intent.getSerializableExtra("pdus"); byte[][] pduObjs = new byte[messages.length][]; for (int i = 0; i < messages.length; i++) { pduObjs[i] = (byte[]) messages[i]; } byte[][] pdus = new byte[pduObjs.length][]; int pduCount = pdus.length; SmsMessage[] msgs = new SmsMessage[pduCount]; for (int i = 0; i < pduCount; i++) { pdus[i] = pduObjs[i]; msgs[i] = SmsMessage.createFromPdu(pdus[i]); } return msgs; } //将短信内容写到SD卡上的文件里,便于将文件pull到PC,这样可方便其它如WWW/WAP平台的自动化 @SuppressLint("SdCardPath") public void writeFile(String str){ String filePath="/mnt/sdcard/verifyCode.txt"; byte [] bytes = str.getBytes(); try{ File file=new File(filePath); file.createNewFile(); FileOutputStream fos=new FileOutputStream(file); fos.write(bytes); fos.close(); }catch(IOException e){ e.printStackTrace(); } }


如此当有短信收到时就可以将短信内容写到SD卡中的文件里
在另一个java类中写个读取文件内容的方法,并在写测试用例过程中,将得到的String按验证码的具体位置截取即可。

public String read(String str) throws IOException{ File file=new File(str); FileInputStream fis=new FileInputStream(file); StringBuffer sb=new StringBuffer(); BufferedInputStream bis=new BufferedInputStream(fis); BufferedReader read = new BufferedReader (new InputStreamReader(bis)); int c=0; while ((c=read.read())!=-1) { sb.append((char) c); } read.close(); bis.close(); fis.close(); Log.i(TAG, sb.toString()); String verify=sb.toString(); return verify; }


最后需要在manifest中增加申明,且注册权限

<receiver android:name="com.cplatform.surfdesktop.test.util.SMSReceiver"><intent-filter><action android:name="android.provider.Telephony.SMS_RECEIVED" /></intent-filter></receiver><uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission><uses-permission android:name="android.permission.READ_SMS"/>


测试过程中需要用到短信验证码时就可以实时获取了



android如何实现开机自动启动Service或app

第一步:首先创建一个广播接收者,重构其抽象方法 onReceive(Context context, Intent intent),在其中启动你想要启动的Service或app。

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class BootBroadcastReceiver extends BroadcastReceiver {
//重写onReceive方法
@Override
public void onReceive(Context context, Intent intent) {
//后边的XXX.class就是要启动的服务
Intent service = new Intent(context,XXXclass);
context.startService(service);
Log.v("TAG", "开机自动服务自动启动.....");
//启动应用,参数为需要自动启动的应用的包名
Intent intent = getPackageManager().getLaunchIntentForPackage(packageName);
context.startActivity(intent );
}

}

第二步:配置xml文件,在receiver接收这种添加intent-filter配置
<receiver android:name="BootBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</receiver>
第三步:添加权限 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />


Android之使用Http协议实现文件上传功能


注意一般使用Http协议上传的文件都比较小,一般是小于2M

这里示例是上传一个小的MP3文件

1.主Activity:MainActivity.java

public class MainActivity extends Activity   {      private static final String TAG = "MainActivity";      private EditText timelengthText;      private EditText titleText;      private EditText videoText;            @Override      public void onCreate(Bundle savedInstanceState)       {         super.onCreate(savedInstanceState);         setContentView(R.layout.main);         //提交上传按钮         Button button = (Button) this.findViewById(R.id.button);         timelengthText = (EditText) this.findViewById(R.id.timelength);         videoText = (EditText) this.findViewById(R.id.video);         titleText = (EditText) this.findViewById(R.id.title);         button.setOnClickListener(new View.OnClickListener()          {                          @Override              public void onClick(View v)               {                  String title = titleText.getText().toString();                  String timelength = timelengthText.getText().toString();                  Map<String, String> params = new HashMap<String, String>();                  params.put("method", "save");                  params.put("title", title);                  params.put("timelength", timelength);                  try                   {                                         //得到SDCard的目录                      File uploadFile = new File(Environment.getExternalStorageDirectory(), videoText.getText().toString());                      //上传音频文件                      FormFile formfile = new FormFile("02.mp3", uploadFile, "video", "audio/mpeg");                      SocketHttpRequester.post("http://192.168.1.100:8080/videoweb/video/manage.do", params, formfile);                      Toast.makeText(MainActivity.this, R.string.success, 1).show();                  }                  catch (Exception e)                   {                      Toast.makeText(MainActivity.this, R.string.error, 1).show();                      Log.e(TAG, e.toString());                  }              }          });              }  }  

2.上传工具类,注意里面构造协议字符串需要根据不同的提交表单来处理

public class SocketHttpRequester   {      /**      * 发送xml数据      * @param path 请求地址      * @param xml xml数据      * @param encoding 编码      * @return      * @throws Exception      */      public static byte[] postXml(String path, String xml, String encoding) throws Exception{          byte[] data = xml.getBytes(encoding);          URL url = new URL(path);          HttpURLConnection conn = (HttpURLConnection)url.openConnection();          conn.setRequestMethod("POST");          conn.setDoOutput(true);          conn.setRequestProperty("Content-Type", "text/xml; charset="+ encoding);          conn.setRequestProperty("Content-Length", String.valueOf(data.length));          conn.setConnectTimeout(5 * 1000);          OutputStream outStream = conn.getOutputStream();          outStream.write(data);          outStream.flush();          outStream.close();          if(conn.getResponseCode()==200){              return readStream(conn.getInputStream());          }          return null;      }            /**      * 直接通过HTTP协议提交数据到服务器,实现如下面表单提交功能:      *   <FORM METHOD=POST ACTION="http://192.168.0.200:8080/ssi/fileload/test.do" enctype="multipart/form-data">             <INPUT TYPE="text" NAME="name">             <INPUT TYPE="text" NAME="id">             <input type="file" name="imagefile"/>             <input type="file" name="zip"/>          </FORM>      * @param path 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,      *                  因为它会指向手机模拟器,你可以使用http://www.baidu.com或http://192.168.1.10:8080这样的路径测试)      * @param params 请求参数 key为参数名,value为参数值      * @param file 上传文件      */      public static boolean post(String path, Map<String, String> params, FormFile[] files) throws Exception      {             //数据分隔线          final String BOUNDARY = "---------------------------7da2137580612";           //数据结束标志"---------------------------7da2137580612--"          final String endline = "--" + BOUNDARY + "--/r/n";                    //下面两个for循环都是为了得到数据长度参数,依据表单的类型而定          //首先得到文件类型数据的总长度(包括文件分割线)          int fileDataLength = 0;          for(FormFile uploadFile : files)          {              StringBuilder fileExplain = new StringBuilder();              fileExplain.append("--");              fileExplain.append(BOUNDARY);              fileExplain.append("/r/n");              fileExplain.append("Content-Disposition: form-data;name=/""+ uploadFile.getParameterName()+"/";filename=/""+ uploadFile.getFilname() + "/"/r/n");              fileExplain.append("Content-Type: "+ uploadFile.getContentType()+"/r/n/r/n");              fileExplain.append("/r/n");              fileDataLength += fileExplain.length();              if(uploadFile.getInStream()!=null){                  fileDataLength += uploadFile.getFile().length();              }else{                  fileDataLength += uploadFile.getData().length;              }          }          //再构造文本类型参数的实体数据          StringBuilder textEntity = new StringBuilder();                  for (Map.Entry<String, String> entry : params.entrySet())           {                textEntity.append("--");              textEntity.append(BOUNDARY);              textEntity.append("/r/n");              textEntity.append("Content-Disposition: form-data; name=/""+ entry.getKey() + "/"/r/n/r/n");              textEntity.append(entry.getValue());              textEntity.append("/r/n");          }                    //计算传输给服务器的实体数据总长度(文本总长度+数据总长度+分隔符)          int dataLength = textEntity.toString().getBytes().length + fileDataLength +  endline.getBytes().length;                    URL url = new URL(path);          //默认端口号其实可以不写          int port = url.getPort()==-1 ? 80 : url.getPort();          //建立一个Socket链接          Socket socket = new Socket(InetAddress.getByName(url.getHost()), port);          //获得一个输出流(从Android流到web)          OutputStream outStream = socket.getOutputStream();          //下面完成HTTP请求头的发送          String requestmethod = "POST "+ url.getPath()+" HTTP/1.1/r/n";          outStream.write(requestmethod.getBytes());          //构建accept          String accept = "Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*/r/n";          outStream.write(accept.getBytes());          //构建language          String language = "Accept-Language: zh-CN/r/n";          outStream.write(language.getBytes());          //构建contenttype          String contenttype = "Content-Type: multipart/form-data; boundary="+ BOUNDARY+ "/r/n";          outStream.write(contenttype.getBytes());          //构建contentlength          String contentlength = "Content-Length: "+ dataLength + "/r/n";          outStream.write(contentlength.getBytes());          //构建alive          String alive = "Connection: Keep-Alive/r/n";                  outStream.write(alive.getBytes());          //构建host          String host = "Host: "+ url.getHost() +":"+ port +"/r/n";          outStream.write(host.getBytes());          //写完HTTP请求头后根据HTTP协议再写一个回车换行          outStream.write("/r/n".getBytes());          //把所有文本类型的实体数据发送出来          outStream.write(textEntity.toString().getBytes());                             //把所有文件类型的实体数据发送出来          for(FormFile uploadFile : files)          {              StringBuilder fileEntity = new StringBuilder();              fileEntity.append("--");              fileEntity.append(BOUNDARY);              fileEntity.append("/r/n");              fileEntity.append("Content-Disposition: form-data;name=/""+ uploadFile.getParameterName()+"/";filename=/""+ uploadFile.getFilname() + "/"/r/n");              fileEntity.append("Content-Type: "+ uploadFile.getContentType()+"/r/n/r/n");              outStream.write(fileEntity.toString().getBytes());              //边读边写              if(uploadFile.getInStream()!=null)              {                  byte[] buffer = new byte[1024];                  int len = 0;                  while((len = uploadFile.getInStream().read(buffer, 0, 1024))!=-1)                  {                      outStream.write(buffer, 0, len);                  }                  uploadFile.getInStream().close();              }              else              {                  outStream.write(uploadFile.getData(), 0, uploadFile.getData().length);              }              outStream.write("/r/n".getBytes());          }          //下面发送数据结束标志,表示数据已经结束          outStream.write(endline.getBytes());                  BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));          //读取web服务器返回的数据,判断请求码是否为200,如果不是200,代表请求失败          if(reader.readLine().indexOf("200")==-1)          {              return false;          }          outStream.flush();          outStream.close();          reader.close();          socket.close();          return true;      }            /**       * 提交数据到服务器       * @param path 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.baidu.com或http://192.168.1.10:8080这样的路径测试)       * @param params 请求参数 key为参数名,value为参数值       * @param file 上传文件       */      public static boolean post(String path, Map<String, String> params, FormFile file) throws Exception      {         return post(path, params, new FormFile[]{file});      }      /**      * 提交数据到服务器      * @param path 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.baidu.com或http://192.168.1.10:8080这样的路径测试)      * @param params 请求参数 key为参数名,value为参数值      * @param encode 编码      */      public static byte[] postFromHttpClient(String path, Map<String, String> params, String encode) throws Exception      {          //用于存放请求参数          List<NameValuePair> formparams = new ArrayList<NameValuePair>();          for(Map.Entry<String, String> entry : params.entrySet())          {              formparams.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));          }          UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, encode);          HttpPost httppost = new HttpPost(path);          httppost.setEntity(entity);          //看作是浏览器          HttpClient httpclient = new DefaultHttpClient();          //发送post请求            HttpResponse response = httpclient.execute(httppost);             return readStream(response.getEntity().getContent());      }      /**      * 发送请求      * @param path 请求路径      * @param params 请求参数 key为参数名称 value为参数值      * @param encode 请求参数的编码      */      public static byte[] post(String path, Map<String, String> params, String encode) throws Exception      {          //String params = "method=save&name="+ URLEncoder.encode("老毕", "UTF-8")+ "&age=28&";//需要发送的参数          StringBuilder parambuilder = new StringBuilder("");          if(params!=null && !params.isEmpty())          {              for(Map.Entry<String, String> entry : params.entrySet())              {                  parambuilder.append(entry.getKey()).append("=")                      .append(URLEncoder.encode(entry.getValue(), encode)).append("&");              }              parambuilder.deleteCharAt(parambuilder.length()-1);          }          byte[] data = parambuilder.toString().getBytes();          URL url = new URL(path);          HttpURLConnection conn = (HttpURLConnection)url.openConnection();          //设置允许对外发送请求参数          conn.setDoOutput(true);          //设置不进行缓存          conn.setUseCaches(false);          conn.setConnectTimeout(5 * 1000);          conn.setRequestMethod("POST");          //下面设置http请求头          conn.setRequestProperty("Accept", "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*");          conn.setRequestProperty("Accept-Language", "zh-CN");          conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)");          conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");          conn.setRequestProperty("Content-Length", String.valueOf(data.length));          conn.setRequestProperty("Connection", "Keep-Alive");                    //发送参数          DataOutputStream outStream = new DataOutputStream(conn.getOutputStream());          outStream.write(data);//把参数发送出去          outStream.flush();          outStream.close();          if(conn.getResponseCode()==200)          {              return readStream(conn.getInputStream());          }          return null;      }            /**       * 读取流       * @param inStream       * @return 字节数组       * @throws Exception       */      public static byte[] readStream(InputStream inStream) throws Exception      {          ByteArrayOutputStream outSteam = new ByteArrayOutputStream();          byte[] buffer = new byte[1024];          int len = -1;          while( (len=inStream.read(buffer)) != -1)          {              outSteam.write(buffer, 0, len);          }          outSteam.close();          inStream.close();          return outSteam.toByteArray();      }  }     public class StreamTool   {      /**      * 从输入流读取数据      * @param inStream      * @return      * @throws Exception      */      public static byte[] readInputStream(InputStream inStream) throws Exception{          ByteArrayOutputStream outSteam = new ByteArrayOutputStream();          byte[] buffer = new byte[1024];          int len = 0;          while( (len = inStream.read(buffer)) !=-1 ){              outSteam.write(buffer, 0, len);          }          outSteam.close();          inStream.close();          return outSteam.toByteArray();      }  }     /**  * 使用JavaBean封装上传文件数据  *   */  public class FormFile   {      //上传文件的数据       private byte[] data;      private InputStream inStream;      private File file;      //文件名称       private String filname;      //请求参数名称      private String parameterName;      //内容类型      private String contentType = "application/octet-stream";            /**      * 上传小文件,把文件数据先读入内存      * @param filname      * @param data      * @param parameterName      * @param contentType      */      public FormFile(String filname, byte[] data, String parameterName, String contentType)       {          this.data = data;          this.filname = filname;          this.parameterName = parameterName;          if(contentType!=null) this.contentType = contentType;      }            /**      * 上传大文件,一边读文件数据一边上传      * @param filname      * @param file      * @param parameterName      * @param contentType      */      public FormFile(String filname, File file, String parameterName, String contentType)       {          this.filname = filname;          this.parameterName = parameterName;          this.file = file;          try           {              this.inStream = new FileInputStream(file);          }          catch (FileNotFoundException e)           {              e.printStackTrace();          }          if(contentType!=null) this.contentType = contentType;      }            public File getFile()       {          return file;      }      public InputStream getInStream()       {          return inStream;      }      public byte[] getData()       {          return data;      }      public String getFilname()       {          return filname;      }      public void setFilname(String filname)      {          this.filname = filname;      }      public String getParameterName()       {          return parameterName;      }      public void setParameterName(String parameterName)       {          this.parameterName = parameterName;      }      public String getContentType()      {          return contentType;      }      public void setContentType(String contentType)       {          this.contentType = contentType;      }     }

更多相关文章

  1. Android通过http协议POST传输方式
  2. 【Android】Android中的数据传递(2)
  3. Android核心基础(五)
  4. Android处理POST请求、Android用SAX解析XML
  5. android volley https
  6. Android处理POST请求、Android用SAX解析XML
  7. 在android里保存数据的三种形式(Saving Data)
  8. 引用自定义资源需注意数据类型
  9. android常用数据库字段描述

随机推荐

  1. MySQL查看和修改事务隔离级别的实例讲解
  2. 重置mysql的root密码最简单的方法
  3. MySQL查询用户权限的方法总结
  4. MySQL处理重复数据的学习笔记
  5. 在MySQL concat里面使用多个单引号,三引
  6. 使用Grafana+Prometheus监控mysql服务性
  7. mysql MGR 单主多主模式切换知识点详解
  8. MySQL模式 Strict Mode知识点详解
  9. MySQL使用TEXT/BLOB类型的知识点详解
  10. linux 安装 mysql 8.0.19 详细步骤及问题