改造Json数据被截断

时间:2018-02-12 07:11:56

标签: android json retrofit

我正在使用Retrofit和RxAndroid将GET请求发送到基于Django的服务器,以及带有JSON数据的服务器响应。    我发现有趣的是,与stetho一样,Json的最后右支撑丢失了。所以我收到了这个错误信息:

W/System.err: java.io.EOFException: End of input at line 1 column 812 path $.user
W/System.err:     at com.google.gson.stream.JsonReader.nextNonWhitespace(JsonReader.java:1393)
W/System.err:     at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:482)
W/System.err:     at com.google.gson.stream.JsonReader.hasNext(JsonReader.java:414)
W/System.err:     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:214)
W/System.err:     at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:37)
W/System.err:     at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:25)
W/System.err:     at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:117)
W/System.err:     at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:211)
W/System.err:     at retrofit2.OkHttpCall.execute(OkHttpCall.java:174)
W/System.err:     at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$RequestArbiter.request(RxJavaCallAdapterFactory.java:171)
W/System.err:     at rx.Subscriber.setProducer(Subscriber.java:211)
W/System.err:     at rx.internal.operators.OnSubscribeMap$MapSubscriber.setProducer(OnSubscribeMap.java:102)
W/System.err:     at rx.Subscriber.setProducer(Subscriber.java:205)
W/System.err:     at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:152)
W/System.err:     at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:138)
W/System.err:     at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
W/System.err:     at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
W/System.err:     at rx.Observable.unsafeSubscribe(Observable.java:10142)
W/System.err:     at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:48)
W/System.err:     at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:33)
W/System.err:     at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
W/System.err:     at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
W/System.err:     at rx.Observable.unsafeSubscribe(Observable.java:10142)
W/System.err:     at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:48)
W/System.err:     at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:33)
W/System.err:     at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
W/System.err:     at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
W/System.err:     at rx.Observable.unsafeSubscribe(Observable.java:10142)
W/System.err:     at rx.internal.operators.OperatorSubscribeOn$1.call(OperatorSubscribeOn.java:94)
W/System.err:     at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
W/System.err:     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:457)
W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
W/System.err:     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
W/System.err:     at java.lang.Thread.run(Thread.java:764)

这是来自stetho的json数据:

{"id":47,"credit_card":"","order_ordereditem_set":[{"id":36,"product_item":{"id":3,"category":{"id":1,"name":"Fruit"},"added_time":"2018-02-11 15:23:21","upc":"4321","desc":"Mandarin","price":150,"img_url":"http://15.32.134.74:8000/media/images/products/mandarin.jpg","not_sale":false,"is_hot":false,"is_recommended":false},"added_time":"2018-02-12 14:02:11","quantity":1,"order_id":47},{"id":37,"product_item":{"id":2,"category":{"id":1,"name":"Fruit"},"added_time":"2018-02-08 13:29:07","upc":"123456","desc":"Kiwi","price":500,"img_url":"http://15.32.134.74:8000/media/images/products/kiwi.jpg","not_sale":false,"is_hot":true,"is_recommended":false},"added_time":"2018-02-12 14:02:11","quantity":1,"order_id":47}],"added_time":"2018-02-12 14:02:11","payment":"0","total_quantity":2,"total_price":6.5,"user":1

但是我检查过wireshark,没有右支撑缺失。 我也用过邮差,但没有问题。

此问题出现了30%。

以下是我的代码详情:

private HttpUtil() {
        Gson gson = new GsonBuilder()
                .setDateFormat("yyyy-MM-dd HH:mm:ss")
                .create();

        Retrofit retrofit = new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create(gson))
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .client(getOkHttpClient())
                .baseUrl(SERVER_BASE_URL)
                .build();
        mService = retrofit.create(RestAPIService.class);
    }

    static public HttpUtil getHttpUtilInstance() {
        if (mHttpUtil == null) {
            synchronized (HttpUtil.class) {
                mHttpUtil = new HttpUtil();
            }
        }
        return mHttpUtil;
    }

    public RestAPIService getService() {
        return mService;
    }

    private OkHttpClient getOkHttpClient() {
        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();

        if (GlobalConfig.CONFIG_DEBUG)
            loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        else
            loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.NONE);

        OkHttpClient.Builder httpClientBuilder = new OkHttpClient
                .Builder();
        httpClientBuilder.addInterceptor(loggingInterceptor)
                .addInterceptor(mTokenInterceptor)
                .addNetworkInterceptor(new StethoInterceptor());

        //httpClientBuilder.addNetworkInterceptor(loggingInterceptor);
        return httpClientBuilder.build();
    }

    private boolean shouldAddToken(String url) {
        return !url.contains("api/login");
    }

    private boolean alreadyHasAuthorizationHeader(Request request) {
        return request.header("Authorization") != null;
    }

    // Interceptor used for inserting token into Header
    private Interceptor mTokenInterceptor = new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request;
            Request originalRequest = chain.request();

            //request = originalRequest.newBuilder().addHeader("Connection", "close").build();
            request = originalRequest;
            String token = UserDataRepository.getInstance().getToken();
            if (token == null || token.length() == 0 || alreadyHasAuthorizationHeader(originalRequest)) {
                return chain.proceed(originalRequest);
            }

            if (shouldAddToken(originalRequest.url().toString())) {
                request = request.newBuilder()
                        .header("Authorization", "JWT " + token)
                        .build();
            }
            return chain.proceed(request);
        }
    };




  @Headers({"Content-Type: application/json", "Accept: application/json"})
    @GET("api/order")
    Observable<List<Order>> getOrder();

0 个答案:

没有答案