Как решить Retrofit Android java.net.UnknownHostException: host == null в числовом домене

Я использую Retrofit Android последней версии 1.6 с OKhttp2.0.0-RC2 с Okio

введите здесь описание изображения

Когда я вызываю метод Post, этот вызов URL генератора Json код отлично работает с кодом состояния 200 (т. е. он вызывает метод успеха (..), анализирует json, все работает нормально!

Json:

{
    "responseCode": "200",
    "responseMessage": "OK",
    "responseDetail": {
        "surname": "Trevor",
        "forename": "Ross",
        "dob": "10101960",
        "appRefNo": "1258866",
        "result": "Success"
    }
}

Код: String hostUrl=введите здесь описание изображения

void doTrackRef(Map<String, String> paramsref2) {
    RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint(hosturl)

.setLogLevel(RestAdapter.LogLevel.FULL) .setErrorHandler(новый MyErrorHandler()).build();

    TrackerRefRequest userref = restAdapter.create(TrackerRefRequest.class);
    userref.login(paramsref2,
            new Callback<TrackerRefResponse>() {
                @Override
                public void success(
                        TrackerRefResponse trackdetailresponse,
                        Response response) {

                    Toast.makeText(TrackerActivity.this, "Success",
                    Toast.LENGTH_SHORT).show();

                }

                @Override
                public void failure(RetrofitError retrofitError) {


                    Toast.makeText(TrackerActivity.this, "No internet",
                        Toast.LENGTH_SHORT).show();
                }


            });
}

Класс MyErrorHandler:

class MyErrorHandler implements ErrorHandler {
      @Override public Throwable handleError(RetrofitError cause) {
        Response r = cause.getResponse();
        if (r != null && r.getStatus() == 401) {
          return new Throwable(cause);
        }
        return cause;
      }
    }

}

Пожо:

public class TrackerRefResponse {

private String responseCode;

private String responseMessage;

private ResponseDetail responseDetail;

//Setters and Getters


}

Приведенный выше код работает на 100%, все в порядке.

Проблема: когда я меняю API URL-адреса Json на числовой URL-адрес с IP-адресом, например: введите описание изображения  здесь

Я получаю этот журнал ошибок:

 D/Retrofit(9114): ---> HTTP POST http://[IP-Address]/api/index.php/data/TrackerInfo
 D/Retrofit(9114): Content-Type: application/x-www-form-urlencoded; charset=UTF-8
 D/Retrofit(9114): Content-Length: 22
 D/Retrofit(9114): app_ref_no=E0000000001
 D/Retrofit(9114): ---> END HTTP (22-byte body)
 D/dalvikvm(9114): GC_FOR_ALLOC freed 224K, 7% free 4667K/4996K, paused 2ms, total 4ms
D/Retrofit(9114): ---- ERROR http://[IP-Address]/api/index.php/data/TrackerInfo
D/Retrofit(9114): java.net.UnknownHostException: host == null
D/Retrofit(9114):     at com.squareup.okhttp.internal.Dns$1.getAllByName(Dns.java:28)
D/Retrofit(9114):     at com.squareup.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:231)
D/Retrofit(9114):     at com.squareup.okhttp.internal.http.RouteSelector.next(RouteSelector.java:124)
D/Retrofit(9114):     at com.squareup.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:317)
D/Retrofit(9114):     at com.squareup.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:241)
D/Retrofit(9114):     at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:420)
D/Retrofit(9114):     at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:105)
D/Retrofit(9114):     at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:239)
D/Retrofit(9114):     at retrofit.client.UrlConnectionClient.prepareRequest(UrlConnectionClient.java:68)
D/Retrofit(9114):     at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:37)
D/Retrofit(9114):     at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:321)
D/Retrofit(9114):     at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:220)
D/Retrofit(9114):     at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.java:278)
D/Retrofit(9114):     at retrofit.CallbackRunnable.run(CallbackRunnable.java:42)
D/Retrofit(9114):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
D/Retrofit(9114):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
D/Retrofit(9114):     at retrofit.Platform$Android$2$1.run(Platform.java:142)
D/Retrofit(9114):     at java.lang.Thread.run(Thread.java:841)
D/Retrofit(9114): ---- END ERROR

Обновлять:

Эта проблема решается принятым ответом!


person LOG_TAG    schedule 20.06.2014    source источник
comment
это анализируется на https://github.com/square/okhttp/issues/951.   -  person Alécio Carvalho    schedule 21.06.2014


Ответы (1)


Классу URI Android не нравится лишний 0 в четвертом октете 192.168.100.06. Замените его каноническим IP-адресом 192.168.100.6, и все готово.

Я сообщил об об этой ошибке в систему отслеживания ошибок AOSP. Я не уверен на 100%, что они это исправят; есть серьезные недостатки в использовании неканонических имен хостов.

person Jesse Wilson    schedule 21.06.2014
comment
Большое спасибо, теперь все работает отлично! Я скопировал URL-адрес из документации REST API, созданной внутренним разработчиком REST API :) - person LOG_TAG; 23.06.2014