Android http post/get

2023-05-16

虽然在Android开发中有很多网络框架,可是都比较臃肿,要考虑很多请求姿势,所以自己写了一个。感谢大家发表评论!
1.网络请求一般分为post和get两种方式,在工作中我比较常用的post的方式,不过我的框架兼容了两种方式,考虑到了文件、图片上传,代码有比较多的注释,看源码。
2.一般网络请求我们都会加密传输,这里为了简单没有加密的,自己可以将数据先用Rsa等工具处理再传数据。
3.说下我遇到的坑(都已解决了):
a.我在公司的接口数据返回时遇到500错误码,但是能返回正确的数据体,这里网上有写个“content-type:zh-cn”的解决,我是告诉后台php他将debug关闭就可以;
b.通过url下载图片时,大部分服务器是不予许post方式请求静态资源(图片),在conn连接对象中设置setDooutPut(true),这样我捉包时每次都是post方式,可以我设置了Get方式了,每次还是返回405错误码,按情况Get的化setdooutput(false)才可以。
c.提示大家,token(登录就有)有时后台要我们拿着去请求接口,这里我也提供了获取的方式。
程序运行情况:
这里写图片描述

这里写图片描述
这里写图片描述
`/**
* 要使用本网络框架,只要在基类中显示MyCallBack,然后你创建的类继承基类就可以了
* 注意MyhttpTaskBasic中cookie(即token)的key,我的是 PHPSESSID,用的时候根据你的服务器返回全部都要更改,
*/
public class AtHttpPost extends AppCompatActivity implements MyHttpCallback {

//http
private MyHttpRequest myHttpRequest;    //可以创建多个对象,对应不同的请求
private ProgressDialog progressDialog;
private int mRequestType = 0;           //区分请求的url

//控件
private EditText et_url;
private ImageView img_result;
private TextView tv_result;

//测试路径  有些网址为了避免攻击是做了请求无效,我这个是旧公司的普遍网址有请求就有返回。
public static final String kURL_TEXT = "http://www.huitwo.com";

//权限请求
public static final int REQUEST_PERMISSION_WRITE = 0x87;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_at_http_post);
    initHttp();
    initView();
    initPermisson();
}

private void initHttp() {
    this.myHttpRequest = new MyHttpRequest(this);
    this.myHttpRequest.mRequestMethod = "POST";
    this.progressDialog = GlobalCode.newProgressDialog(this);
}

private void initView() {
    this.et_url = (EditText) findViewById(R.id.et_url);
    this.img_result = (ImageView) findViewById(R.id.img_result);
    this.tv_result = (TextView) findViewById(R.id.tv_result);

// String imgurl = “http://p1.wmpic.me/article/2017/11/09/1510216599_fOLEvpJH.jpg“;
// Glide.with(this).load(imgurl).placeholder(R.mipmap.ic_launcher)
// .into(img_result);
}

private void initPermisson() {
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        //权限发生了改变 true  //  false,没有权限时
        if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            new AlertDialog.Builder(this).setTitle("title")
                    .setPositiveButton("ok", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // 请求授权
                            ActivityCompat.requestPermissions(AtHttpPost.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
                        }
                    }).setNegativeButton("cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    //不请求权限的操作
                }
            }).create().show();
        } else {
            ActivityCompat.requestPermissions(AtHttpPost.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION_WRITE);
        }
    } else {

// take_photo();//已经授权了就调用打开的方法
}
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case REQUEST_PERMISSION_WRITE:
            //判断是否有权限
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

// openAlbum();//打开相册
SnackbarUtil.ShortSnackbar(tv_result, “已经获取权限”, 1).show();
} else {
SnackbarUtil.ShortSnackbar(tv_result, “你需要权限许可!”, 3).show();
}
break;
default:
break;
}
}

//触发网络请求事件
public void click_imgurl(View view) {
    if (new File(path_saveimg).exists() && new File(path_saveimg).length() > 0) {
        //确定有本地图片
    } else {
        SnackbarUtil.ShortSnackbar(tv_result, "请先下载图片", 3).show();    //第一个参数随意控件就行
        return;
    }
    httpPostImg(kURL_TEXT, path_saveimg);
}

//触发网络请求事件
public void click_jsonurl(View view) {
    if (et_url.getText().toString().length() == 0) {
        httpRequest(kURL_TEXT);
    } else {
        httpRequest(et_url.getText().toString());
    }
}

//触发下载图片
public void click_download(View view) {
    httpDownLoadImg(et_url.getText().toString());
}

//进行post请求
private void httpRequest(String url) {
    this.mRequestType = 0;
    this.myHttpRequest.mRequestMethod = "POST";
    this.myHttpRequest.requestCancel(); //可以不写,写是为了频繁恶意的请求
    List<MyHttpParameters> list = new ArrayList<>();
    list.add(new MyHttpParameters("id", "id")); //实际中写入对应的key-value
    list.add(new MyHttpParameters("username", "jason"));
    this.myHttpRequest.requestString(url, MyHttpParameters.parameterstoString(list));
    this.progressDialog.setMessage("加载中...");
    this.progressDialog.show();
}

//post请求上传图片    上传图片对应的key="image_id"(根据自己接口改)
private void httpPostImg(String url, String imgPath) {
    this.mRequestType = 1;
    this.myHttpRequest.mRequestMethod = "POST";
    this.myHttpRequest.requestCancel();
    List<MyHttpParameters> list = new ArrayList<>();
    list.add(new MyHttpParameters("id", "id"));
    list.add(new MyHttpParameters("username", "jason"));
    this.myHttpRequest.requestString(url, MyHttpParameters.parameterstoString(list), GlobalCode.token, new File(imgPath), "image_id");
    this.progressDialog.setMessage("加载中...");
    this.progressDialog.show();
}

private void httpDownLoadImg(String url) {
    this.mRequestType = 2;
    this.myHttpRequest.requestCancel();
    this.myHttpRequest.mRequestMethod = "GET";  //部分服务器是不允许post方式请求静态资源,如图片网址
    //注意,这个图片url不是后缀。jpg的一般的图片是加载不出来的,用webview可以,但是内容会不全
    //这里我的做法是将图片下载下来,保存成bitmap到本地,这样就简单了。注意:图片路径存在失效的

// String imgurl = “http://120.24.44.102/fuc/api/web/imageapi/get.html?id=sjDo5VnfYnk%2BzChRLjpeiZvlEhoLpenz9emPATEPpkN9yKxuj%2FJfZOvP%2Bg3WC96E0Z0wzK8mh8hbS1jqHF61Ug%3D%3D“;
String imgurl = “http://p1.wmpic.me/article/2017/11/09/1510216599_fOLEvpJH.jpg“;
if (url == null || url.equals(“”)) {
this.myHttpRequest.requestBitmap(imgurl, GlobalCode.token);
} else {
this.myHttpRequest.requestBitmap(url, GlobalCode.token);
}
this.progressDialog.setMessage(“下载图片中…”);
this.progressDialog.show();
}

//
private void parserJsonStr(String result) {
    GlobalCode.printLog(result);    //result是返回的数据,这里我们调用测试数据str
    String str =
            "{" +
                    "\"success\" : \"0\"," +
                    "\"info\" : \"\"," +
                    "\"total\" : \"5\"," +
                    "\"list\" : [" +
                    "{\"id\": \"167\",  \"date\": \"2016-06-10\", \"content\": \"钢琴(1~2)\", \"pay\" : \"3072\", \"type\": \"1\"}," +
                    "{\"id\": \"222\",  \"date\": \"2016-07-10\", \"content\": \"书法\", \"pay\" : \"1000\", \"type\": \"1\"}," +
                    "{\"id\": \"222\",  \"date\": \"2016-07-1\", \"content\": \"拉丁舞A班\", \"pay\" : \"3200\", \"type\": \"1\"}," +
                    "{\"id\": \"222\",  \"date\": \"2016-06-12\", \"content\": \"小提琴(1~2)\", \"pay\" : \"1920\", \"type\": \"1\"}" +
                    "]" +
                    "}";
    try {
        JSONObject jsonObject = new JSONObject(str);
        if (jsonObject.getInt("success") == 0) {
            JSONArray jsonArray = jsonObject.getJSONArray("list");
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject jsonValue = jsonArray.getJSONObject(i);
                sb.append(jsonValue.getString("id"));
                sb.append("/");
                sb.append(jsonValue.getString("date"));
                sb.append("/");
                sb.append(jsonValue.getString("content"));
                sb.append("\n");
            }
            tv_result.setText(sb.toString());
            SnackbarUtil.ShortSnackbar(tv_result, "成功解析返回的数据", 1).show();
        } else {
            GlobalCode.alert(this, "提示", jsonObject.getString("info"));
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }

}

private void parserImg(String result) {
    //根据你的接口解析数据
    GlobalCode.printLog(result);
    SnackbarUtil.ShortSnackbar(tv_result, "成功上传图片和数据", 1).show();
}

String path_saveimg = "/sdcard/house_rent/pic/userhead.jpg";//这里写死了,根据手机sd卡决定

/**
 * 保存bitmap到本地
 *
 * @param context
 * @param mBitmap
 * @return
 */
public static String saveBitmap(Context context, Bitmap mBitmap) {
    String savePath;
    File filePic;
    if (Environment.getExternalStorageState().equals(
            Environment.MEDIA_MOUNTED)) {
        savePath = "/sdcard/house_rent/pic/";
    } else {
        savePath = context.getApplicationContext().getFilesDir()
                .getAbsolutePath()
                + "/house_rent/pic/";
    }
    try {
        filePic = new File(savePath + "userhead" + ".jpg");
        if (!filePic.exists()) {
            filePic.getParentFile().mkdirs();
            filePic.createNewFile();
        }
        GlobalCode.printLog("path=" + filePic.getAbsolutePath());
        FileOutputStream fos = new FileOutputStream(filePic);
        mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
        fos.flush();
        fos.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return null;
    }

    return filePic.getAbsolutePath();
}

@Override
public void onHttpRequestSessionID(MyHttpRequest request, String sessionID) {
    //获取网络返回的token,一般我们会保存它用来继续请求其他接口
    //在登录后就会获取到token,将值记录
    GlobalCode.token = sessionID;
}

@Override
public void onStringFinishLoading(MyHttpRequest request, String str) {
    progressDialog.cancel();
    progressDialog.hide();
    GlobalCode.printLog("loading_json>>>>");
    //json对象文本返回
    if (request.equals(myHttpRequest)) {
        if (mRequestType == 0) {
            parserJsonStr(str);
        } else if (mRequestType == 1) {
            parserImg(str);
        }
    }
}

@Override
public void onStringFailWithError(MyHttpRequest request) {
    progressDialog.cancel();
    progressDialog.hide();
    GlobalCode.printLog("error_json>>>>");
}

@Override
public void onBitmapFinishLoading(MyHttpRequest request, Bitmap bitmap) {
    progressDialog.cancel();
    progressDialog.hide();
    GlobalCode.printLog("loading_bitmap>>>");
    if (request.equals(myHttpRequest) && this.mRequestType == 2) {
        img_result.setImageBitmap(bitmap); //用glide直接加载url是不出来
        if (bitmap != null) {
            GlobalCode.printLog("bitmap=" + bitmap.getByteCount());

// 保存到本地1 - 这种方法是为了给大家一个使用数据库库框架
ACacheUtil aCacheUtil = ACacheUtil.get(AtHttpPost.this);
aCacheUtil.put(“mybitmap”, bitmap);
// 保存到本地2
saveBitmap(AtHttpPost.this, bitmap);
// 获取bitmap
// bitmap = aCacheUtil.getAsBitmap(“mybitmap”);
}
}
}

@Override
public void onBitmapFailWithError(MyHttpRequest request) {
    progressDialog.cancel();
    progressDialog.hide();
    GlobalCode.printLog("error_bitmap>>>>>");
}

@Override
protected void onDestroy() {
    super.onDestroy();
    //释放资源
    this.progressDialog.dismiss();
    this.myHttpRequest.requestCancel();
}

//大家的Androidstudio版本可能都不同,这里下载解压后不要着急打开项目,打开项目文件夹修改几个文件可以使用你本地的gradle版本,打开你原来运行过的项目替换以下代码:
1.打开项目的build.gradle文件 ,修改替换成你原有的项目代码语句,保存文件。
//classpath ‘com.android.tools.build:gradle:2.2.2’
2.打开项目gradle/warpper/gradle-wrapper.properties文件,替换保存:
//distributionUrl=https://services.gradle.org/distributions/gradle-2.14.1-all.zip
3.打开项目app/build.gradle,修改以下工具版本,打开你原来运行过的项目替换以下代码:
//compileSdkVersion 25
//buildToolsVersion “25.0.3”
//compile ‘com.android.support:appcompat-v7:25.3.1’
//compile ‘com.android.support:design:25.3.1’

[本框架的demo代码下载戳这里](https://download.csdn.net/download/j7a2son/10348549)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android http post/get 的相关文章

  • 如何使用 SyncAdapter 处理远程服务器的 RESTful 更新

    我观看了 Google I O REST 演讲并阅读了幻灯片 http www google com events io 2010 sessions developing RESTful android apps html http www
  • Android P Beta - AlarmManager 通知不起作用

    我正在 Android P beta 版本 4 上测试我的应用程序 我的应用程序目标SdkVersion是27 据观察 警报管理器通知未按预期工作 我使用下面的代码来设置通知 if android os Build VERSION SDK
  • 更改 Android Spinner 布局/设计

    我正在尝试修改设计Spinner http developer android com intl de reference android widget Spinner html小部件 我可以更改背景 但找不到更改右侧箭头图标的方法 有办法
  • Spring webflow 应用程序:HTTP 302 暂时移动

    我的 java 应用程序中的每个请求都会生成另外 2 个带有 HTTP 302 错误的请求 例如 如果请求查看名为板 html 这个请求是从首页 html 我收到按以下顺序生成的 3 个请求 POST home html 302 Moved
  • 如何创建适用于 iPhone、iPad 和 Android 的 Extjs 应用程序?

    有人成功创建了适用于 iPhone iPad 和 Android 的 Extjs 应用程序吗 我知道 Sencha 不支持移动设备上的 Extjs 但我不想创建另一个仅针对移动设备的网站 我不需要奇特的移动界面 只需要基本的功能 我做了一些
  • 如何处理应用程序对 3d party 的依赖

    我当前正在开发的应用程序依赖于第三方应用程序 OIFileManager 我的问题是处理这些依赖关系的一般方法是什么 告诉用户解决它 嵌入 3d party apk 如果其许可证允许 自动解决 也许Android市场有相应的系统 没有自动的
  • Android BLE - 如何分块读取大特征值(使用偏移量)?

    我正在使用 Android SDKandroid 蓝牙 and android 蓝牙 le APIs 我想实现一个应用程序 发挥核心作用 并连接到 BLE 外设以读取特征值和描述符 应用程序需要读取的特征值较大 因此需要分块连续读取 我对如
  • 无法从后台服务通过 WiFi 访问互联网

    我将直接介绍我发现的一些事实 数据 如果您遇到 解决了类似的问题 请帮助我 我每 5 分钟向服务器发送一次数据 除非用户在服务器的帮助下手动将其关闭 wakeful broadcast receiver通过一个intent service
  • Android Mockito.verify 说参数不同!打印相同内容

    情况 我有一个界面Tracker其中有这个方法 fun trackEvent event String args Bundle null 我想验证是否使用特定的调用此方法event 被测试的内部对象调用此方法Bundle目的 所有事件都指定
  • CollapsingToolbarLayout 禁用绘制扩展

    我有一个已有条件禁用的 CollapsingToolbar 当用户在这种情况下加载视图时 它看起来就像一个普通的 ToolBar 对象 唯一奇怪的是 如果它们向下拖动 例如在拉动刷新样式操作中 折叠工具栏就会展开 尽管我的愿望和代码与此相反
  • 使用 Asp.Net 的 GCM 推送通知

    正如您可能已经看到的 Google 正在迁移其推送通知系统 http developer android com guide google gcm c2dm html http developer android com guide goo
  • Android 设备 ID(不是 IMEI)

    我使用命令 adb devices 列出连接的设备 在我的电脑上我得到 附加设备列表 HT9CTP820988 器件 我的问题是 如何以编程方式获取此 id HT9CTP820988 你所看到的adb devices命令是序列号 序列号 创
  • getViewByID 对于 Listview 返回 null

    我的 main xml 如下
  • 如何在 Fragment 中使用 onNewIntent(Intent Intent) 方法?

    我正在尝试从我的设备使用 NFC 硬件 但是 问题是当我注册 Activity 来接收 Intent 时 PendingIntent pendingIntent PendingIntent getActivity this 0 new In
  • 为什么在回收器视图中滚动后值会消失?

    Data before scrolling Data after scrolling 我的应用程序的问题如上图所示 输入数据后 如果我在将项目添加为可滚动后滚动 数据就会消失 作为进一步的解释 有时输入的数据出现在已添加的其他项目中 为了解
  • Android - 如何合并两个视频

    基本上 我正在寻找一种将两个 mp4 视频文件 在 SD 卡上 组合在一起的方法 更像是在第一个视频的末尾附加第二个视频 我进行了很多搜索 但找不到合适的解决方案 好吧 我根本找不到任何解决方案 所以我的问题是 是否有一个库可以组合 并可能
  • Android 在通话期间播放音频文件[重复]

    这个问题在这里已经有答案了 对于我的 Android 应用程序 我想在从应用程序接听电话后播放音频文件 应用程序将发起电话呼叫 一旦接收者接听电话 应用程序应开始播放录制的音频文件 通过在谷歌上进行大量搜索 我发现这对于未root的设备来说
  • Android 中的字符串加密

    我正在使用代码进行加密和加密 它没有给出字符串结果 字节数组未转换为字符串 我几乎尝试了所有方法将字节数组转换为字符 但没有给出结果 public class EncryptionTest extends Activity EditText
  • Phonegap - cordova 在 Android 和 iOS 设备上延迟且缓慢

    我刚刚开始使用 zend studio 开始我的第一个 PhoneGap 项目 但是 在我构建并部署它之后 该应用程序非常慢 Android 和 iOS 均可 滚动滞后 如果我按下按钮 转到下一页的速度很慢 有什么办法可以提高它的性能吗 提
  • 使用 PHP 将表单数据发送/发布到 URL [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有一个通过 POST 提交的表单 提交表单后我捕获变量 如何连接表单数据 然后将其 POST 到 url 然后重新定向到感谢页面 这不是确

随机推荐

  • activemq 动态消息队列

    前提 xff1a springboot整合activemq时利用注解及相关 配置类是可以直接 使用 activemq消息队列去处理业务逻辑的 xff0c 但是我在生产环境碰到了一个 情况是 真实数据 有几千万 直接用上面说的情况 xff0c
  • Springboot + Spring Security 实现前后端分离登录认证及权限控制

    Springboot 43 Spring Security 实现前后端分离登录认证及权限控制 前言本文主要的功能文章目录文章正文一 准备工作1 统一错误码枚举2 统一json返回体3 返回体构造工具4 pom5 配置文件 二 数据库表设计建
  • JVM内存分配规则

    JVM内存分配规则 堆内存分配 xff1a JDK8 默认的 xff0c 新生代 xff08 Young xff09 与老年代的比例值为 1 2 xff08 该值可以通过参数 XX NewRatio来指定 xff09 新生代分为 Eden和
  • RT-Thread 开发者能力认证考试样题(RCEA)

    V1 0 RT Thread 开发者能力认证考试样题 RCEA xff09 注 xff1a 样题仅为部分题目 第一小卷 单选题 40 题 40 分钟 40 0 分 1 对两个字符 a 和 b 进行初始化 xff1a char a 61 34
  • Collections.max(list) 和 Math.max() 效率比较实验

    前情提要 xff1a 在力扣 559 N叉树的最大深度 中 xff0c 官方题解出现了 Collections max 的用法 xff0c 本人使用的是 Math max 这一古老而强大的函数 为什么官方答案选用的是 list 呢 xff1
  • (原创)Lottie动画使用介绍

    前言 我们都知道 xff0c 安卓里面有三种基本的播放动画方式 xff1a 帧动画 xff0c 属性动画 xff0c 补间动画 今天介绍一种新的实现方式 xff1a Lottie动画 Lottie是爱彼迎开源的一个动画框架 可以支持iOS
  • 【JavaAgent】字节码编程 - 使用Byte-buddy工具实现插件化开发

    简介 假设我们有需求 xff1a 所有的控制器 xff08 Controller xff09 添加耗时 xff0c 对所有的服务 xff08 Service xff09 添加调用信息 xff0c 使用一个agent代理 xff0c 也就是所
  • onNewIntent详解

    记得刚开始学的时候 xff0c 感觉intent还挺简单 xff0c 结果现在总是被intent困扰 xff0c 发现自己太天真了 xff0c 为了弄清楚 xff0c 总结一下 xff0c 一 onNewIntent 老规矩 xff0c 先
  • import _ssl ImportError: DLL load failed

    问题描述 简单讲一下我的问题 xff1a 使用pycharm打开Django项目 xff08 虚拟环境编译器 xff09 xff0c 当测试发送邮件功能时 xff0c 出现报错 xff0c import ssl if we can t im
  • 【荐书】李彦宏《智能革命》:技术是时代的信仰

    我来了 xff0c 天上的云乘着风飞翔 xff0c 心中的梦占据一个反向 xff0c 方舟扬帆起航 xff0c 一路带着我们纵情歌唱 xff0c 方舟扬帆起航 xff0c 脉络就在大海之上 xff0c 进步的时光 xff0c 迎着你看涛浪潮
  • vue 打包去除console.log()

    忘记在哪里看到的 记录下 在vue config js中 xff0c 配置 chainWebpack span class token punctuation span config span class token punctuation
  • minio+thumbor

    minio 安装 span class token function wget span https dl min io server minio release linux amd64 minio span class token fun
  • axios自定义请求头跨域,thinkphp设置

    axios添加自定义请求头 在axios拦截器中 headers XXX 61 XX 配置后 thinkphp 返回跨域 需要对thinkphp中间件进行重新设置 主要配置在tp 复制 vendor topthink framework s
  • git webhook linux 切换www用户

    vim etc passwd 把 www x 1000 1000 home www sbin nologin 改成 www x 1000 1000 home www bin bash ESC键结束 wq 保存文件并退出编辑 切换www用户
  • mint下nginx和uwsgi部署django

    参考 xff1a http www cnblogs com fnng p 5268633 html 安装Nginx apt get install nginx 启动Nginx xff1a etc init d nginx start 启动
  • (原创)Android安装APK报错Installation failed due to: ‘INSTALL_FAILED_TEST_ONLY‘

    这个问题遇到是在vivo手机与oppo手机 xff0c 换成在华为 小米等手机中未发现该问题 其实是因为Android Studio 自3 0 开始自带一个隐藏的功能 xff0c 那就是编译打包 debug 包时 xff0c 会自动在 ap
  • strapi-api使用说明

    strapi controllers 返回项目中可用的控制器的对象 位于该 api controllers文件夹中的每个JavaScript文件都将被解析为该strapi controllers对象 由于这个对象 xff0c 您可以访问项目
  • sublime tex4配置vue开发环境

    前提 已安装package control 参考网站 https lsp sublimetext io https www prettier cn 安装包快捷键 ctrl 43 alt 43 p 输入install package 安装以下
  • win下mkcert+phpenv本地ssl环境配置

    环境win mkcert 安装过程略 使用Chocolatey安装比较方便 1 choco install mkcert 2 mkcert install 弹出窗口点安装 3 mkcert shop test 注意点 shop test 本
  • Android http post/get

    虽然在Android开发中有很多网络框架 xff0c 可是都比较臃肿 xff0c 要考虑很多请求姿势 xff0c 所以自己写了一个 感谢大家发表评论 xff01 1 网络请求一般分为post和get两种方式 xff0c 在工作中我比较常用的