विशेष वर्ण जैसे (" ”,') में परिवर्तित हो जाता है ? रेट्रोफिट 2 में इंटरसेप्टर लगाते समय। रेट्रोफिट 2 से प्रतिक्रिया प्राप्त करते समय, मुझे विशेष वर्ण मिल रहे हैं लेकिन इंटरसेप्टर विशेष चरित्र को बदल देता है? और प्रदर्शित करता है? विशेष पात्रों के बजाय

इंटरसेप्टर में रेट्रोफिट जोड़ना:

 CustomRequestInterceptor requestInterceptor = newCustomRequestInterceptor();
 HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
 logging.setLevel(BuildConfig.DEBUG ? HttpLoggingInterceptor.Level.BODY : 
 HttpLoggingInterceptor.Level.NONE);
 OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
 httpClient.addInterceptor(requestInterceptor);
 httpClient.addInterceptor(logging);

रेट्रोफिट 2 के लिए इंटरसेप्टर क्लास (CustomRequestInterceptor.java):

public class CustomRequestInterceptor implements Interceptor {

    private static String newToken;
    private String bodyString;

    private final String TAG = getClass().getSimpleName();


    @Override
    public Response intercept(Chain chain) throws IOException {


        String token = "";
        Request request = chain.request();
        RequestBody oldBody = request.body();

        Buffer buffer = new Buffer();
        oldBody.writeTo(buffer);

        String strOldBody = buffer.readUtf8();
        Log.i(TAG, "original req " + strOldBody);
        MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
        JSONObject jsonObject = new JSONObject();
        String decodedStr = decoder(strOldBody.replace("data=", ""));
        try {

            if (decodedStr != null && decodedStr.equalsIgnoreCase("")) {
                token = getRandomNumber();
                jsonObject.put("auth_token", token);
            } else {
                jsonObject = new JSONObject(decodedStr);
                token = getRandomNumber();
                jsonObject.put("auth_token", token);
            }

        } catch (Exception e) {
            Log.e(AppConstants.TAG, "Exception", e);
        }

        Log.i(AppConstants.TAG, "Request JSONObject " + jsonObject.toString());
        String strNewBody = "data=" + URLEncoder.encode(Encryption.encryptString(jsonObject.toString()));


        Log.i(TAG, "strNewBody " + strNewBody);
        RequestBody body = RequestBody.create(mediaType, strNewBody);

        Log.i(TAG, "content type is " + body.contentType().toString());
        Log.i(TAG, "content length is " + String.valueOf(body.contentLength()));
        Log.i(TAG, "method is " + request.method());

        request = request.newBuilder().header("Content-Type", body.contentType().toString())
                .header("Content-Length", String.valueOf(body.contentLength()))
                .method(request.method(), body).build();


        Response response = chain.proceed(request);
        String responseString = new String(response.body().bytes());
        Log.i(TAG, "Response: " + responseString);
        String newResponseString = Encryption.decryptString(responseString);
        Log.i(TAG, "Response edited: " + URLDecoder.decode(newResponseString));
        JSONObject res_JsonObject = new JSONObject();
        if (newResponseString.startsWith("{")) {
            try {
                res_JsonObject = new JSONObject(newResponseString);
                String response_token = res_JsonObject.getString("auth_token");
                if (response_token.equalsIgnoreCase("" + token)) {

                } else {
                    res_JsonObject.put("status", false);
                    res_JsonObject.put("message", "Authentication Failed");
                    Toast.makeText(new AppController().getApplicationContext(), "Authentication Failed", Toast.LENGTH_LONG).show();
                }

            } catch (Exception e) {
                Log.e(AppConstants.TAG, "Exception", e);
            }
        }

        byte[] ptext = res_JsonObject.toString().getBytes(ISO_8859_1);
        String value = new String(ptext, UTF_16);

        return response.newBuilder()
                .body(ResponseBody.create(response.body().contentType(), value))
                .build();
    }

    public String decoder(String encodedStr) {
        try {
            return URLDecoder.decode(encodedStr);

        } catch (Exception e) {

            Log.e(AppConstants.TAG, "Exception", e);
            return encodedStr;
        }
    }
}

अपेक्षित उत्पादन:

{
  "comment": "“hello”"
}

वास्तविक आउटपुट:

{
  "comment": "?hello?"
}
1
Rishi 8 जिंदा 2019, 17:53

1 उत्तर

सबसे बढ़िया उत्तर

समस्या इंटरसेप्ट विधि के रिटर्न स्टेटमेंट में है, जब हम ResponseBody.create() को कॉल करते हैं, तो रिस्पॉन्सबॉडी क्लास डेटा को UTF-8 फॉर्मेट में कनवर्ट करता है और UTF-8 (",") जैसे वर्णों का समर्थन नहीं करता है, इसलिए यह हमें "? " साइन करें क्योंकि हमने response.body().contentType() दिया है, इसलिए यह UTF-8 में बदल जाता है जो कि डिफ़ॉल्ट है। समाधान बनाने के लिए response.body().contentType() पास नहीं करना है और अपना खुद का contentType देना है। यहाँ अद्यतन वर्ग है।

public class CustomRequestInterceptor implements Interceptor {

    private static String newToken;
    private String bodyString;

    private final String TAG = getClass().getSimpleName();


    @Override
    public Response intercept(Chain chain) throws IOException {


        String token = "";
        Request request = chain.request();
        RequestBody oldBody = request.body();

        Buffer buffer = new Buffer();
        oldBody.writeTo(buffer);

        String strOldBody = buffer.readUtf8();
        Log.i(TAG, "original req " + strOldBody);
        MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
        JSONObject jsonObject = new JSONObject();
        String decodedStr = decoder(strOldBody.replace("data=", ""));
        try {

            if (decodedStr != null && decodedStr.equalsIgnoreCase("")) {
                token = getRandomNumber();
                jsonObject.put("auth_token", token);
            } else {
                jsonObject = new JSONObject(decodedStr);
                token = getRandomNumber();
                jsonObject.put("auth_token", token);
            }

        } catch (Exception e) {
            Log.e(AppConstants.TAG, "Exception", e);
        }

        Log.i(AppConstants.TAG, "Request JSONObject " + jsonObject.toString());
        String strNewBody = "data=" + URLEncoder.encode(Encryption.encryptString(jsonObject.toString()));


        Log.i(TAG, "strNewBody " + strNewBody);
        RequestBody body = RequestBody.create(mediaType, strNewBody);

        Log.i(TAG, "content type is " + body.contentType().toString());
        Log.i(TAG, "content length is " + String.valueOf(body.contentLength()));
        Log.i(TAG, "method is " + request.method());

        request = request.newBuilder().header("Content-Type", body.contentType().toString())
                .header("Content-Length", String.valueOf(body.contentLength()))
                .method(request.method(), body).build();


        Response response = chain.proceed(request);
        String responseString = new String(response.body().bytes());
        Log.i(TAG, "Response: " + responseString);
        String newResponseString = Encryption.decryptString(responseString);
        JSONObject res_JsonObject = new JSONObject();
        if (newResponseString.startsWith("{")) {
            try {
                res_JsonObject = new JSONObject(newResponseString);
                String response_token = res_JsonObject.getString("auth_token");
                if (response_token.equalsIgnoreCase("" + token)) {

                } else {
                    res_JsonObject.put("status", false);
                    res_JsonObject.put("message", "Authentication Failed");
                    Toast.makeText(new AppController().getApplicationContext(), "Authentication Failed", Toast.LENGTH_LONG).show();
                }

            } catch (Exception e) {
                Log.e(AppConstants.TAG, "Exception", e);
            }
        }

        MediaType contentType = MediaType.parse(response.body().contentType() + "; charset=utf-32");

        return response.newBuilder()
                .body(ResponseBody.create(contentType, newResponseString.getBytes()))
                .build();
    }

    public String decoder(String encodedStr) {
        try {
            return URLDecoder.decode(encodedStr);

        } catch (Exception e) {

            Log.e(AppConstants.TAG, "Exception", e);
            return encodedStr;
        }
    }

} 
2
Rishi 9 जिंदा 2019, 16:31