当使用androids的URL和HttpUrlConnection将GET请求发送到后端时,有时(每10个中的1个)发生该请求失败的原因是:
java.net.ProtocolException:意外的状态行:1.1 200 OK

就像说的那样,这种情况仅在somtimes发生过,我尝试了3种不同的后端(其中之一是自托管的),但仍然会发生。

        System.setProperty("http.keepAlive", "false");
        URL url = new URL(callUrl);
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setUseCaches(false);
        con.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
        con.setConnectTimeout(5000);
        con.setReadTimeout(4000);
        con.setRequestMethod(requestMethod);
        con.setRequestProperty("User-Agent", USER_AGENT);
        con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
        con.setRequestProperty("Accept-Charset", "UTF-8");
        con.setRequestProperty("charset", "UTF-8");
        con.setRequestProperty("Connection", "close");


也许有人知道如何解决?

最佳答案

首先,这是API参考链接:
  http://square.github.io/retrofit/


因此,请转到:
文件>项目结构,打开后,在模块-应用程序中,转到选项卡依赖项。

java - Android okhttp:随机获取java.net.ProtocolException:意外状态行:1.1 200 OK-LMLPHP

单击+符号并添加库

搜索并添加该库:com.squareup.retrofit2:retrofit:2.30,我强烈建议您也使用Jackson,如果需要,请将此库添加到:com.squareup.retrofit2:converter-jackson:2.3.0

完成所有操作后,让我们开始编写代码。

我使用以下代码创建了RetrofitInitialization类:

public class RetrofitInicializador {
public RetrofitInitialization() {

String url = "localhost:8080/webservice/";
retrofit = new Retrofit.Builder().baseUrl(url)
                .addConverterFactory(JacksonConverterFactory.create()).build();
}
}


我们也需要创建一个服务,因此,我创建了一个服务类:
对象服务

public interface ObjectService {

    @POST("post/example")
    Call<Object > postexemple(@Body Object object);

    @GET("get/example/{id}")
    Call<Object> getexemple(@Path("id") Integer id);

}


对象是您要接收或发送的模型。
之后,将服务添加到构造函数之后的RetrofitInitialization中。

与此类似:

public ObjectService getObjectService() {
    return retrofit.create(ObjectService.class);
}


在您的“活动”中或您想获取此信息的任何地方,执行以下操作:

 private void loadFromWS(Object object) {
        Call<Object> call = new RetrofitInicializador().getObjectService().postexemple(object);
        call.enqueue(new Callback<Object>() {
            @Override
            public void onResponse(Call<Object> call, Response<Object> response) {
                Object response = response.body();

               // DO your stuffs
            }

            @Override
            public void onFailure(Call<Object> call, Throwable t) {
                Toast.makeText(AgendaActivity.this, "Connection error", Toast.LENGTH_SHORT).show();
            }
        });
    }


编辑:忘记了,我在WS REST服务器上使用了它(更具体地说:JAX-RS和Jersey WS)

10-08 08:34