问题描述:
服务器返回一个json格式的base64加密的字符串,要求将字符串解码得到一个json获取字段url,然后根据url获取一个图片
问题1:
通过Base64.decode(str.getBytes(), Base64.DEFAULT)解析获取到的是乱码
结果是这样的:
原因:
简单来讲就是 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
));
结果
问题二:如何将一个json格式的字符串转换为json对象?
解决:通过gson
字符串转化为json对象
字符串转化为特定的json对象
代码段:
通过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); } }); }