Android http post/get

虽然在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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值