Модифицировать SocketTimeoutException (и/или ошибку http 500) на http-POST

Я пытаюсь отправить запрос POST на наш внутренний сервер, но продолжаю получать ошибки SocketTimeOutException или HTTP 500. И он продолжает переключаться между этими двумя случайным образом (даже с одинаковыми значениями).

Вещи, которые я уже пробовал

  • добавление библиотеки OkHttp (v2.4.0) по какой-то причине я получаю сообщение об ошибке, что она может не поддерживаться, хотя модификация говорит, что поддерживает v2.0.0+ источник
  • внедрив Callback<Account> в класс вместо этого, это также дало мне на http500 больше, чем более новый версия
  • это, я добавил UrlFactory и OkHttp и выполнили эти шаги, но затем все приложение падает (log & изменения)

Ниже приведен упрощенный код

Войти

public class SignIn extends Activity implements Callback<Account>{
    private static final String TAG = "SignIn";
    private ImageButton sign_in_backBtn;
    private TextView sign_in_make_account;
    private Button btn_SignIn;
    private EditText email;
    private EditText password;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sign_in);

        btn_SignIn = (Button) findViewById(R.id.sign_in_btnSignIn);
        email = (EditText)findViewById(R.id.sign_in_email);
        password = (EditText)findViewById(R.id.sign_in_password);
        initListers();
    }

    private void initListers() {
        btn_SignIn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String emailAdres = email.getText().toString();
                String passWord = password .getText().toString();
                if(emailAdresValidate == true && passWordValidate == true){
                    Account account = new Account(passWord,emailAdres);
                    login(account);
                }
            }
        });
    }

    private void login(Account account){
        JppApplication.getService().logIn(account,this);
    }

    @Override
    public void success(Account account, Response response) {
        Log.d(TAG,response.toString());
        Log.d(TAG, "login success");
    }

    @Override
    public void failure(RetrofitError retrofitError) {
        Log.e(TAG,retrofitError.getKind().toString());
        Log.d(TAG, "login failed");
    }
}

Сервис

public interface Service {
    @POST("/accounts/login")
    void logIn(@Body Account account,Callback<Account> created);
}

Аккаунт

public class Account {
    @SerializedName("Email")
    private String email;

    @SerializedName("Password")
    private String paswoord;

    public Account(String paswoord, String email) {
        this.paswoord = paswoord;
        this.email = email;
    }
}

возможный журнал/ошибка, которую я получаю

05-18 09:41:29.800   26126-2080/be.kdgdemo D/Retrofit﹕ java.net.SocketTimeoutException: failed to connect to /10.134.216.25 (port 8017) after 15000ms
            at libcore.io.IoBridge.connectErrno(IoBridge.java:159)
            at libcore.io.IoBridge.connect(IoBridge.java:112)
            at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
            at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
            at java.net.Socket.connect(Socket.java:842)
            at libcore.net.http.HttpConnection.<init>(HttpConnection.java:76)
            at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
            at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
            at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
            at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
            at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315)
            at libcore.net.http.HttpEngine.connect(HttpEngine.java:310)
            at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289)
            at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239)
            at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273)
            at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:486)
            at retrofit.client.UrlConnectionClient.readResponse(UrlConnectionClient.java:73)
            at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:38)
            at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:321)
            at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:220)
            at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.java:278)
            at retrofit.CallbackRunnable.run(CallbackRunnable.java:42)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
            at retrofit.Platform$Android$2$1.run(Platform.java:142)
            at java.lang.Thread.run(Thread.java:856)
05-18 09:41:29.800   26126-2080/be.kdgdemo D/Retrofit﹕ ---- END ERROR

or

    05-18 10:04:01.455    6945-7465/be.kdgdemo D/Retrofit﹕ ---> HTTP POST http://10.134.216.25:8017/api/accounts/login
05-18 10:04:01.455    6945-7465/be.kdgdemo D/Retrofit﹕ Content-Type: application/json; charset=UTF-8
05-18 10:04:01.455    6945-7465/be.kdgdemo D/Retrofit﹕ Content-Length: 56
05-18 10:04:01.455    6945-7465/be.kdgdemo D/Retrofit﹕ {"Email":"[email protected]","Password":"Paswoord1!"}
05-18 10:04:01.455    6945-7465/be.kdgdemo D/Retrofit﹕ ---> END HTTP (56-byte body)
05-18 10:04:18.875    6945-7465/be.kdgdemo D/Retrofit﹕ <--- HTTP 500 http://10.134.216.25:8017/api/accounts/login (17419ms)
05-18 10:04:18.875    6945-7465/be.kdgdemo D/Retrofit﹕ : HTTP/1.1 500 Internal Server Error
05-18 10:04:18.875    6945-7465/be.kdgdemo D/Retrofit﹕ Cache-Control: no-cache
05-18 10:04:18.875    6945-7465/be.kdgdemo D/Retrofit﹕ Content-Length: 36
05-18 10:04:18.875    6945-7465/be.kdgdemo D/Retrofit﹕ Content-Type: application/json; charset=utf-8
05-18 10:04:18.875    6945-7465/be.kdgdemo D/Retrofit﹕ Date: Mon, 18 May 2015 08:04:18 GMT
05-18 10:04:18.875    6945-7465/be.kdgdemo D/Retrofit﹕ Expires: -1
05-18 10:04:18.875    6945-7465/be.kdgdemo D/Retrofit﹕ Pragma: no-cache
05-18 10:04:18.875    6945-7465/be.kdgdemo D/Retrofit﹕ Server: Microsoft-IIS/7.5
05-18 10:04:18.875    6945-7465/be.kdgdemo D/Retrofit﹕ X-Android-Received-Millis: 1431936258878
05-18 10:04:18.875    6945-7465/be.kdgdemo D/Retrofit﹕ X-Android-Sent-Millis: 1431936241463
05-18 10:04:18.875    6945-7465/be.kdgdemo D/Retrofit﹕ X-AspNet-Version: 4.0.30319
05-18 10:04:18.875    6945-7465/be.kdgdemo D/Retrofit﹕ X-Powered-By: ASP.NET
05-18 10:04:18.875    6945-7465/be.kdgdemo D/Retrofit﹕ {"Message":"An error has occurred."}
05-18 10:04:18.875    6945-7465/be.kdgdemo D/Retrofit﹕ <--- END HTTP (36-byte body)

person Edward    schedule 18.05.2015    source источник
comment
Кажется, что-то не так с вашим сервером. Вы проверили это, отправив запрос не из своего приложения?   -  person Ilya Vorobiev    schedule 18.05.2015
comment
Я могу войти через веб-приложение, если вы это имели в виду.   -  person Edward    schedule 18.05.2015
comment
ваш сервер использует тот же API для веб-приложения? Ошибка 500 — это только ошибка на стороне сервера. Проблема не может быть на стороне клиента. Я пытался отправить запрос через hurl.it, но всегда получал тайм-аут запроса. Проверьте проблему на стороне сервера   -  person Ilya Vorobiev    schedule 18.05.2015
comment
Соединение осуществляется через частный vpn, поэтому для посторонних в данный момент оно не работает, API тот же. Я провел еще несколько тестов, и кажется, что иногда, когда я публикую неверные учетные данные, он дает мне код 500, но 9/10 он просто дает мне исключение sockettimeout.   -  person Edward    schedule 18.05.2015
comment
Хорошо, 500 и исключение sockettimeout - это проблемы с сервером. Ошибка 500 возникает только в том случае, если на стороне сервера есть исключение. Исключение тайм-аута сокета означает, что сервер не отвечает на ваш запрос. Попробуйте проверить, что происходит на сервере с вашими запросами. Может быть что-то не так с настройками vpn.   -  person Ilya Vorobiev    schedule 18.05.2015


Ответы (1)


Хорошо, получается, что ошибка была из-за следующего. Наша школа использовала дешевый VPN, на котором работал сервер. Я всегда тестировал это приложение, запуская и отлаживая его на физическом устройстве, а не на эмуляторе.

Вы должны были использовать приложение VPN, чтобы иметь возможность подключиться к серверу, по какой-то причине соединение регулярно прерывалось, поэтому всякий раз, когда у нас было исключение тайм-аута, нам просто приходилось перезапускать VPN-соединение через приложение, и мы были уверены, что не получим любые исключения тайм-аута примерно на минуту или около того.

Вот что получается, когда школы везде пытаются урезать бюджет...

И, конечно же, HTTP-500 был из-за ошибки в нашем коде, очевидно :)

person Edward    schedule 05.05.2016