base64解码urlencode乱码

问题描述:

服务器返回一个json格式的base64加密的字符串,要求将字符串解码得到一个json获取字段url,然后根据url获取一个图片

问题1:

通过Base64.decode(str.getBytes(), Base64.DEFAULT)解析获取到的是乱码

结果是这样的:

base64解码urlencode乱码_第1张图片

原因:

简单来讲就是 base64编码->网络传输时urlencode编码->urldecode->base64decode

1:base64编码里面有一个 “+” 号,在urlecode编码中 “+” 会被解码成空格,urlencode时,"+" 号肯定是由空格编码出来的,但是base64编码的结果中 "+" 不是空格编码出来的,如果将base64编码作为安全的url编码使用,则 “+” 将被解码成空格,这是我们不愿看到的; 所以不要base64编码作为url编码来使用.
用base64编码后再进行URL编码,再传输可能会避免此类问题。
2. 我们知道http头里面可能会用base64编码来传输一些信息,因为这些信息不会被web服务器默认做url解码的,我们可以得到原始的编码信息,所以http头里面使用base64编码是可以接受的。
解决
1.去掉\n
2.替换空格为+ 
android自带可以解析base64在网络传输中因为url encode编码带来的问题。
String jsonstr = new String(Base64.decode(str.getBytes(), Base64.URL_SAFE ));
结果
base64解码urlencode乱码_第2张图片

问题二:如何将一个json格式的字符串转换为json对象?

解决:通过gson
字符串转化为json对象


字符串转化为特定的json对象


ADImage一个bean类 可以通过gsonformat自动生成

代码段:
通过okhttp3 post请求网络
  private void postAsynHttp() {
        OkHttpClient mOkHttpClient=new OkHttpClient().newBuilder()
                .connectTimeout(10000,TimeUnit.MILLISECONDS)
                .readTimeout(10000,TimeUnit.MILLISECONDS)
                .writeTimeout(10000,TimeUnit.MILLISECONDS).build();

        RequestBody formBody = new FormBody.Builder()
                .add("width", String.valueOf(SCREEN_width))
                .add("height", String.valueOf(SCREEN_height))
                .build();

        Request request = new Request.Builder()
                .addHeader("Accept", "application/json")
                .addHeader("Content-Type", "application/json")
                .url(ADURL)
                .post(formBody)
                .build();
        Call call = mOkHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.i(TAG,"post onFailure");
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String str = response.body().string();
                Log.i(TAG,"post onResponse:"+str);
                String jsonstr = new String(Base64.decode(str.getBytes(), Base64.URL_SAFE));
//                JsonObject data = new JsonParser().parse(jsonstr).getAsJsonObject();
                Gson gson = new Gson();
                ADImage adImage =  gson.fromJson(jsonstr,ADImage.class);
                ADUrl = adImage.getRes().getPic();
                Log.i(TAG, "ADUrl:" + ADUrl);
            }

        });
    }


你可能感兴趣的:(工作中遇到的问题,android)