Web Services 错误代码:第1行第1列的输入结束

k5hmc34c  于 2022-11-15  发布在  其他
关注(0)|答案(5)|浏览(147)

我使用Retrofit2调用了PATCHWeb服务,但没有调用onResponse,而是调用了onFailure****尽管如此,服务操作在服务器端仍然成功
每当我尝试使用fiddler检查服务是否正常工作时,我发现问题在于序列化服务的后续响应,而在使用fiddler时,我发现JSON响应没有内容,因此Retrofit服务认为它失败了,因为没有内容,它无法序列化EMPTY内容,并向我显示此错误

java.io.EOFException: End of input at line 1 column 1

小提琴手原始回应

HTTP/1.1 200 OK
Server: nginx/1.9.4
Date: Wed, 02 Mar 2016 09:55:55 GMT
Content-Type: application/json
Content-Length: 0
Connection: close
Status: 200 OK
X-Content-Type-Options: nosniff

Fiddler Json响应为空
Java中的Web服务

Call<Object> call = TimeCapp.services.accept_invited_alerts(HomeActivity.api_token, alert_id);

call.enqueue(new Callback<Object>()
{
    @Override
    public void onResponse (Call<Object> call, Response<Object> response)
    {
        if (response.isSuccess()) {
            String x = response.body();
        }
    }
    @Override
    public void onFailure (Call<Object>call, Throwable t)
    {
        String x = t.getMessage();//java.io.EOFException: End of input at line 1 column 1
    }
}

我尝试将object替换为字符串、JsonObject、emptyCalssBody ...,但失败

Web服务的接口

@PATCH("alerts/{alert_id}/accept")
Call<Object> accept_invited_alerts(@Header("X-Api-Token") String  
api_token, @Path("alert_id") int alert_id);
bd1hkmkf

bd1hkmkf1#

如果主体为空,则返回void

@PATCH("alerts/{alert_id}/accept") Call<Void> accept_invited_alerts(@Header("X-Api-Token") String api_token, @Path("alert_id") int alert_id);

对于Rxjava改进,您可以使用如下代码

@PATCH("alerts/{alert_id}/accept") Observable<Response<Void>> accept_invited_alerts(@Header("X-Api-Token") String api_token, @Path("alert_id") int alert_id);

编辑:对于Kotlin

@PATCH("alerts/{alert_id}/accept")
fun accept_invited_alerts(@Header("X-Api-Token")  api_token: String, @Path("alert_id") alert_id: Int): Call<Unit>

@PATCH("alerts/{alert_id}/accept")
fun accept_invited_alerts(@Header("X-Api-Token") api_token: String, @Path("alert_id") alert_id: Int): Observable<Response<Unit>>
tsm1rwdh

tsm1rwdh2#

您可以创建空转换器工厂为空的类

import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;

import okhttp3.ResponseBody;
import retrofit2.Converter;
import retrofit2.Retrofit;

public class NullOnEmptyConverterFactory extends Converter.Factory {

    @Override
    public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
        final Converter<ResponseBody, ?> delegate = retrofit.nextResponseBodyConverter(this, type, annotations);
        return new Converter<ResponseBody, Object>() {
            @Override
            public Object convert(ResponseBody body) throws IOException {
                if (body.contentLength() == 0) return null;
                return delegate.convert(body);               
            }
        };
    }
}

并添加到代码创建中。例如:

UploadImageNghiemThuApi uploadService = new Retrofit.Builder()
            .baseUrl(Config.URL+"/")
            .client(okHttpClient)
            // -----add here-------
            .addConverterFactory(new NullOnEmptyConverterFactory())
            //---------------------
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(UploadImageNghiemThuApi.class);

我希望它能帮助你的问题。谢谢!
编辑!!!
对于Kotlin用例,您可以检查以下内容

class NullOnEmptyConverterFactory : Converter.Factory() {
override fun responseBodyConverter(
    type: Type,
    annotations: Array<Annotation>,
    retrofit: Retrofit
): Converter<ResponseBody, *> {
    val delegate: Converter<ResponseBody, *> =
        retrofit.nextResponseBodyConverter<Any>(this, type, annotations)
    return Converter { body -> if (body.contentLength() == 0L) null else delegate.convert(body) }
}

}

uttx8gqw

uttx8gqw3#

非常感谢您的光临。
阿皮

@FormUrlEncoded
@POST("/rebu/insertusuario.php")
Call<Void> insertLogin(
        @Field("email") String email,
        @Field("senha") String senha,
        @Field("codCondutor") Long codCondutor
);

班级:

Call call = service.insertLogin(login.getEmail(), login.getSenha(), login.getCodCondutor());
cotxawn7

cotxawn74#

对于我在laravel我没有发送任何响应后,函数完成只是添加以下行在服务器端帮助。这可以适应您正在使用的语言。只是发送一些响应从服务器端。

use Response;

return Response::json(array(
            'result' => 'success',

        ));
oyt4ldly

oyt4ldly5#

我在我的Sping Boot 服务中也遇到了类似的问题。问题出在Content-Length头值上。任何超过指定字节数的内容都会导致问题。
取出顶盖后,问题得到解决。
您可以移除信头,或尝试使用较大的值。

相关问题