API级别较低的设备上的Android UnkownHostException

时间:2016-08-16 11:15:47

标签: java android http url

当在较低的api级别(例如15或19)(在模拟器和真实设备上)上尝试我的应用时,我得到特定URL的UnknownHostException:http://jotihunt-api_v2.mysite123.nl/login mysite123是虚构的。但我没有得到谷歌等其他网址的UnknownHostException。所以我似乎URL是错误的,但在API级别22,例如我没有得到这个例外。我有一个Internet连接,我有所需的权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

我使用此代码执行对Web API的发布/获取请求:

    @Override
    protected List<WebResponse> doInBackground(WebRequest... params) {
        ArrayList<WebResponse> responses = new ArrayList<>();
        WebRequest current;

        for(int i = 0; i < params.length; i++)
        {
            current = params[i];

            try {
                InetAddress address = InetAddress.getByName(current.getUrl().getHost());
                Log.i("WebRequestTask", address.toString());
            } catch (UnknownHostException exception) {
                Log.e("WebRequestTask", exception.toString(), exception);
            }


            TRYCATCH:
            try
            {
                if(current.getUrl() == null) break TRYCATCH;

                HttpURLConnection connection = (HttpURLConnection)current.getUrl().openConnection();

                switch (current.getMethod())
                {
                    case WebRequestMethod.POST:
                        if(current.hasData())
                        {
                            connection.setDoOutput(true);
                            connection.setRequestMethod(WebRequestMethod.POST);

                            OutputStreamWriter streamWriter = new OutputStreamWriter(connection.getOutputStream());
                            streamWriter.write(current.getData());
                            streamWriter.flush();
                            streamWriter.close();
                        }
                        break;
                }

                InputStream response;
                if(connection.getResponseCode() == 200)
                {
                         /*
                        * Get the response stream.
                        * */
                    response = connection.getInputStream();
                }
                else
                {
                        /*
                        * Get the error stream.
                        * */
                    response = connection.getErrorStream();
                }

                /**
                 * Read the stream.
                 * */
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response));
                StringBuilder builder = new StringBuilder();
                String line;
                while ((line = bufferedReader.readLine()) != null) {
                    builder.append(line);
                }
                bufferedReader.close();

                /**
                 * Create a response
                 * */
                responses.add(new WebResponse(current, builder.toString(), connection.getResponseCode()));

                current.setExecutionDate(new Date());

                connection.disconnect();

            }
            catch(Exception e)
            {
                /**
                 * Print the stack trace
                 * */
                e.printStackTrace();

                /**
                 * Log a error.
                 * */
                Log.e("WebRequestTask", e.toString(), e);

                /**
                 * Add a response with as text the error message
                 * */
                responses.add(new WebResponse(current, e.toString(), 0));
            }
        }
        return responses;
    }

对象的状态:http://imgur.com/8ehGBUf

请求的创建和执行:

WebRequest request = new WebRequest.Builder()
            .setId(MY_REQUEST_ID)
            .setMethod(WebRequestMethod.POST)
            .setUrl(new UrlBuilder().append("http://jotihunt-api_v2.mysite123.nl/login").build())
            .setData("sfsf")
            .create();
    request.executeAsync(new WebRequest.OnWebRequestCompletedCallback() {
        @Override
        public void onWebRequestCompleted(WebResponse response) {
            Log.i("",response.getData());
        }
    });

这是我得到的例外:

08-16 12:33:36.340 4277-4356/nl.rsdt.japp W/System.err: java.net.UnknownHostException: http://jotihunt-api_v2.mysite123.nl/login
08-16 12:33:36.342 4277-4356/nl.rsdt.japp W/System.err:     at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:279)
08-16 12:33:36.344 4277-4356/nl.rsdt.japp W/System.err:     at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
08-16 12:33:36.346 4277-4356/nl.rsdt.japp W/System.err:     at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)
08-16 12:33:36.348 4277-4356/nl.rsdt.japp W/System.err:     at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)
08-16 12:33:36.352 4277-4356/nl.rsdt.japp W/System.err:     at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:89)
08-16 12:33:36.355 4277-4356/nl.rsdt.japp W/System.err:     at com.android.okhttp.internal.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:197)
08-16 12:33:36.356 4277-4356/nl.rsdt.japp W/System.err:     at com.rsdt.anl.WebRequestTask.doInBackground(WebRequestTask.java:53)
08-16 12:33:36.357 4277-4356/nl.rsdt.japp W/System.err:     at com.rsdt.anl.WebRequestTask.doInBackground(WebRequestTask.java:21)
08-16 12:33:36.358 4277-4356/nl.rsdt.japp W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:288)
08-16 12:33:36.359 4277-4356/nl.rsdt.japp W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
08-16 12:33:36.360 4277-4356/nl.rsdt.japp W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
08-16 12:33:36.365 4277-4356/nl.rsdt.japp W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
08-16 12:33:36.372 4277-4356/nl.rsdt.japp W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
08-16 12:33:36.373 4277-4356/nl.rsdt.japp W/System.err:     at java.lang.Thread.run(Thread.java:848)

更新 我可以使用InetAdress解析主机,但它仍无法正常工作

更新2 我在谷歌搜索后发现了类似的问题,似乎下划线不是有效的URL字符。

来源:

(我不能包含超过2个链接,所以我离开了链接的开头)

stackoverflow.com/questions/36074952/unknown-host-exception-using-emulator-and-httpurlconnection

code.google.com/p/android/issues/detail?id=37577

github.com/google/ExoPlayer/issues/239

1 个答案:

答案 0 :(得分:1)

我更改了主机名,因此不包含下划线,这解决了我的问题。似乎旧版Android上的DNS不支持带下划线的URL

<强>来源:

Similiar issue

http://code.google.com/p/android/issues/detail?id=37577