В настоящее время я работаю над приложением Android, и я делаю простой запрос GET, используя okttp3. Я использую мое flask приложение в качестве конечной точки API. Код Android:
OkHttpClient client = new OkHttpClient();
final Request request = new Request.Builder()
.url(url)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
String s = response.body().string();
System.out.println(s);
}
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
System.out.println(e.getMessage());
}
});
Код Flask
@app.route('/abc', methods=["GET"])
def abc():
return jsonify({"test": "abc"})
Когда я делаю запрос с помощью POSTMAN, у меня нет проблем : почтальон получает запрос Однако при использовании приведенного выше кода java иногда это работает, иногда я получаю следующую ошибку
D/OkHttp: java.net.ProtocolException: unexpected end of stream
at okhttp3.internal.http1.Http1ExchangeCodec$FixedLengthSource.read(Http1ExchangeCodec.kt:389)
at okhttp3.internal.connection.Exchange$ResponseBodySource.read(Exchange.kt:276)
at okio.Buffer.writeAll(Buffer.kt:1655)
at okio.RealBufferedSource.readString(RealBufferedSource.kt:95)
at okhttp3.ResponseBody.string(ResponseBody.kt:187)
at com.example.teste.MainActivity$2.onResponse(MainActivity.java:83)
at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:504)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
D/OkHttp: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)
Я пробовал несколько решений, которые были предложены на других сообщения типа:
OkHttpClient client = new OkHttpClient.Builder()
.retryOnConnectionFailure(true)
.build();
или
Request request = new Request.Builder()
.addHeader("Authorization", "Bearer " + apiToken)
.addHeader("content-type", "application/json")
.addHeader("Connection","close")
.url(uri)
.build();
, но ни один из них не работает. В чем здесь проблема? Я пытался делать запросы с тем же кодом с другим фиктивным API, и это всегда работает. Чего не хватает в моем flask API?
Ошибка происходит здесь:
val read = super.read(sink, minOf(bytesRemaining, byteCount))
if (read == -1L) {
connection.noNewExchanges() // The server didn't supply the promised content length.
val e = ProtocolException("unexpected end of stream")
responseBodyComplete()
throw e
}
Это связано с длиной содержимого, предоставляемого сервером. Как мне решить это?