android – 将Retrofit RestAdapter.LogLevel设置为FULL以外的任何内容导致Empty Response Body

android – 将Retrofit RestAdapter.LogLevel设置为FULL以外的任何内容导致Empty Response Body,第1张

概述我的项目中有以下3个类和1个接口.将日志记录设置为NONE会导致“成功”,但会有一个空的响应正文(见下面的getMovies() – > success()).可以删除在该错误中输出的URL&粘贴到浏览器中,它完美地运行.如果我将日志记录更改为FULL,则一切正常,但是,我的API密钥在LogCat输出中明显可见. public class RestClient { private Ap 我的项目中有以下3个类和1个接口.将日志记录设置为NONE会导致“成功”,但会有一个空的响应正文(见下面的getMovIEs() – > success()).可以删除在该错误中输出的URL&粘贴到浏览器中,它完美地运行.如果我将日志记录更改为FulL,则一切正常,但是,我的API密钥在LogCat输出中明显可见.

public class RestClIEnt {    private APIService APIService;    public RestClIEnt(String endpoint,boolean enableLogging) {        Gson gson = new GsonBuilder()                .registerTypeAdapterFactory(new ItemTypeAdapterFactory())                .setDateFormat("yyyy-MM-dd")                .setPrettyPrinting()                .excludeFIEldsWithoutExposeAnnotation()                .create();        RestAdapter restAdapter = new RestAdapter.Builder()                .setLogLevel(BuildConfig.DEBUG && enableLogging ? RestAdapter.LogLevel.FulL : RestAdapter.LogLevel.NONE)                .setEndpoint(endpoint)                .setConverter(new GsonConverter(gson))                .setRequestInterceptor(new SessionRequestInterceptor())                .build();        APIService = restAdapter.create(APIService.class);    }    public APIService getAPIService() {        return APIService;    }}public class ServiceEventHandler {    private boolean isRetrofitLoggingEnabled;    private String rottenTomatoesUrl;    private String rottenTomatoesAPIKey;    public ServiceEventHandler(Context context) {        isRetrofitLoggingEnabled = Boolean.valueOf(context.getString(R.string.retrofit_logging_enabled));        rottenTomatoesUrl = context.getString(R.string.movIEs_url);        rottenTomatoesAPIKey = context.getString(R.string.rotten_tomatoes_API_key); /* Look in res/values/secret.xml */        if (rottenTomatoesAPIKey.equals("REPLACE WITH YOUR KEY")) {            Toast.makeText(context,context.getString(R.string.error_replace_API_key),Toast.LENGTH_LONG).show();        }    }    /**     * 'IN THEATER' MOVIES     */    @Subscribe    public voID getMovIEs(final GetMovIEsEvent event) {        /**         * rotten_tomatoes_API_key is stored in a strings resource file named secret.xml and         * located in res/values,but secret.xml has been added to .gitignore so my key doesn't         * end up in source control.         *         * simply create your own res/values/secret.xml file with your own Rotten Tomatoes API         * key and the app will run as expected.         */        APIService APIService = new RestClIEnt(rottenTomatoesUrl,isRetrofitLoggingEnabled).getAPIService();        APIService.getMovIEs(rottenTomatoesAPIKey,event.getPageNumber(),event.getPagelimit(),new RestCallback<MovIEs>(event.getCallNumber()) {            @OverrIDe            public voID success(MovIEs movIEs,Response response) {                if (response.getbody().length() > 0) {                    EventBus.post(movIEs);                } else {                    EventBus.post(new APIErrorEvent(RetrofitError.unexpectedError(response.getUrl(),new httpException("Empty Body")),event.getCallNumber()));                }            }        });    }}public abstract class RestCallback<T> implements Callback<T> {    private int callNumber;    public RestCallback(int callNumber) {        this.callNumber = callNumber;    }    @OverrIDe    public voID failure(RetrofitError error) {        EventBus.post(new APIErrorEvent(error,this.callNumber));    }    public int getCallNumber() {        return callNumber;    }}public interface APIService {    final static String APPSETTINGS = "/application_settings.Json";    final static String MOVIES = "/in_theaters.Json";    // IN THEATER MOVIES    @GET(MOVIES)    voID getMovIEs(@query("APIkey") String key,@query("page") int page,@query("page_limit") int page_limit,Callback<MovIEs> cb);}
解决方法 response.getbody()将返回一个Typedinput,其长度方法( http://square.github.io/retrofit/javadoc/retrofit/mime/TypedInput.html#length–)不保证在存在响应主体时返回大于零的数字.小于或等于0的值并不意味着您没有身体,只是它无法告诉您它有多长.

我猜测只有在关闭日志记录时才显示的原因是由于支持日志记录所需的缓冲细节.

您可能希望在onSuccess中对该长度以外的其他内容进行测试(例如:响应状态代码或MovIEs对象).

总结

以上是内存溢出为你收集整理的android – 将Retrofit RestAdapter.LogLevel设置为FULL以外的任何内容导致Empty Response Body全部内容,希望文章能够帮你解决android – 将Retrofit RestAdapter.LogLevel设置为FULL以外的任何内容导致Empty Response Body所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1125410.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存