您的位置:首页 > 移动开发

Android APP测试可修改接口访问链接,无需重装apk

2017-06-07 15:39 1176 查看
APP项目开发的时候,我都是用一个全局变量来存放接口访问链接的前缀的。一般起初开发的过程都是在局域网,这个是有就是http://192.168.0.xx这种的。如果发布版本的时候就是http://www.xx.xx,然后某些时候又要改成其他网址,这样一来老是需要重新运行app生成新的apk,那怎么做到无需重装apk就可以修改网址前缀呢?

在你手机上新建一个xml配置文件,效果如下





我们可以通过编辑工具打开xml文件,对其进行修改path的路径然后进行保存、替换。然后我们写个方法每次调用接口的时候,就获取path+/.../...进行拼接。

1、PathXmlConfig.class :是xml文件的创建,写入,读取数据的配置类

/**
* @author SoBan
* @create 2017/6/2 14:53.
*/

public class PathXmlConfig {

private static String filePath = Environment.getExternalStorageDirectory() + "/gpinfo/";
private static String xmlName = "facerecognition.xml";
private static String PATH = "path";
private static String IMGPATH = "imgpath";

public static class PathBean {
private String path;
private String imgpath;

public PathBean() {
}

public String getPath() {
return path;
}

public void setPath(String path) {
this.path = path;
}

public String getImgpath() {
return imgpath;
}

public void setImgpath(String imgpath) {
this.imgpath = imgpath;
}
}

/**
* 生成文件夹 gpinfo
*/
public static void makeRootDirectory(String filePath) {
File file = null;
try {
file = new File(filePath);
if (!file.exists()) {
file.mkdir();
}
} catch (Exception e) {
Log.i("error:", e + "");
}
}

/**
* 生成xml
*/
public static File makeFilePath(String filePath, String fileName) {
File file = null;
makeRootDirectory(filePath);
try {
file = new File(filePath + fileName);
} catch (Exception e) {
e.printStackTrace();
}
return file;
}

/**
* xml是否存在
* @return
*/
public static boolean isExistsXml() {
File file = makeFilePath(filePath, xmlName);
if (file.exists()) {
return true;
}
return false;
}

/**
* 向xml写入数据
*
* @param bean
*/
public static void createXML(PathBean bean) {
try {
// 获取外部存储路径,并创建文件
File file = makeFilePath(filePath, xmlName);
if (file.exists()) {
return;
}
// 创建一个文件输出流
FileOutputStream os = new FileOutputStream(file);
String enter = System.getProperty("line.separator");//换行
XmlSerializer serializer = Xml.newSerializer();
// 设置输出的编码格式
serializer.setOutput(os, "UTF-8");
// 设置文档的编码格式,这个会在xml中显示出来
serializer.startDocument("UTF-8", true);
// 添加
// 注释
//            serializer.comment("comment, xml file test");
changeLine(serializer, enter);
serializer.startTag(null, PATH);
serializer.text(bean.getPath());
serializer.endTag(null, PATH);
changeLine(serializer, enter);
serializer.startTag(null, IMGPATH);
serializer.text(bean.getImgpath());
serializer.endTag(null, IMGPATH);

serializer.endDocument();        // 文档结束
serializer.flush();
os.close();                    // 关闭输出流
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* tag标签换行
*
* @param serializer
* @param enter
*/
public static void changeLine(XmlSerializer serializer, String enter) {
try {
serializer.text(enter);
} catch (IOException e) {
System.out.println(e.getMessage());
}
}

/**
* Pull方式,解析 XML
*/
public static PathBean pullParseXML() {
File file = new File(filePath, xmlName);

PathBean bean = null;
//        StringWriter xmlWriter = new StringWriter();
try {
//          // 方式一:使用Android提供的实用工具类android.util.Xml
//          XmlPullParser xpp = Xml.newPullParser();
// 方式二:使用工厂类XmlPullParserFactory的方式
InputStream is = new FileInputStream(file);
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xpp = factory.newPullParser();
xpp.setInput(is, "utf-8");
StringBuffer xmlHeader = null;          // 保存xml头部
String ele = null;      // Element flag

int eventType = xpp.getEventType();
while (XmlPullParser.END_DOCUMENT != eventType) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
xmlHeader = new StringBuffer();             // 初始化xmlHeader
bean = new PathBean();
break;
case XmlPullParser.START_TAG:
if (PATH.equals(xpp.getName())) {
//                            eventType = xpp.next();
//                            xmlHeader.append(xpp.getText());
bean.setPath(xpp.nextText());
} else if (IMGPATH.equals(xpp.getName())) {
//                            eventType = xpp.next();
//                            xmlHeader.append(xpp.getText());
bean.setImgpath(xpp.nextText());
}
break;
case XmlPullParser.TEXT:
if (null != ele) {
/*if("id".equals(ele)) {
person.setId(Integer.parseInt(xpp.getText()));
} else if("name".equals(ele)) {
person.setName(xpp.getText());
} else if("blog".equals(ele)) {
person.setBlog(xpp.getText());
}*/
}
break;
case XmlPullParser.END_TAG:
/*if("person".equals(xpp.getName())){
personsList.add(person);
person = null;
}*/
ele = null;
break;
}
eventType = xpp.next();     // 下一个事件类型
}
//            xmlWriter.append(xmlHeader);
} catch (XmlPullParserException e) {        // XmlPullParserFactory.newInstance
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
//        return xmlWriter.toString();
return bean;
}
}


2、CommonConfig.class:调用接口是需要的公用配置类

public class CommonConfig {
//是否打开本地配置链接文件(要给别人测试并支持修改path的时候是true)
public static final boolean isOpenConfig = false;
public static String PATH = "http://192.168.0.100/gpa/";
public static String IMGPATH = "http://192.168.0.100/";
/**
* 这里写的url指的是,访问接口链接的后缀
*/
public static String getPath(boolean isIMG, String url) {
if (!PathXmlConfig.isExistsXml()) {
PathXmlConfig.PathBean bean = new PathXmlConfig.PathBean();
bean.setPath(API.PATH);
bean.setImgpath(API.IMGPATH);
PathXmlConfig.createXML(bean);
}
PathXmlConfig.PathBean pathBean = PathXmlConfig.pullParseXML();
if (!url.startsWith("http://") && !url.startsWith("https://") && !TextUtils.isEmpty(url)) {
if (isIMG) {
if (!TextUtils.isEmpty(pathBean.getImgpath())) {
url = pathBean.getImgpath() + formatImageUrl(url);
} else {
url = IMGPATH + url;
}
} else {
if (!TextUtils.isEmpty(pathBean.getPath())) {
url = pathBean.getPath() + url;
} else {
url = PATH + url;
}
}
}
return url;
}

public static String getCommonURL(String url) {
if (isOpenConfig) {
return getPath(false, url);
}
if (!url.startsWith("http://") && !url.startsWith("https://") && !TextUtils.isEmpty(url)) {
url = PATH + url;
}
return url;
}
}


3、使用方式:

例如现在要调用登录的接口,链接假设:http://192.168.0.100/gpa/login

这个时候我们调用方法就是getCommonURL("login");

4、适用情况:

用这种情况最好是在测试的时候,不要发布版本的时候用,所以上面多了一个CommonConfig->isOpenConfig的配置,true是指打开xml配置,默认是false。

如果测试有这么多个地址:
http://192.168.0.100/gpa/login http://127.22.0.100/gpa/login http://www.baidu.com/gpa/login
不想重新安装apk,只是想改变网址前缀,可以通过这种方式配置
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐