clientprotocolexception DefaultHttpClient.execute()

时间:2013-06-23 17:18:48

标签: android httpclient

我使用以下代码从网络服务器请求响应。服务器发送格式错误的响应,不带标头,导致ClientProtocolException。我曾尝试使用检查器,但在触发异常之前不会调用它们。我无法更改服务器(它位于嵌入式设备,ALFA路由器R36内)。 任何处理这个问题的建议(顺便说一句:如果服务器响应格式正确,代码就可以完美运行)

提前致谢,Ton

class httpRequestTask extends AsyncTask <Integer, Integer, Integer> {

    StringBuffer respTxt = new StringBuffer("");        
    int reqCode = 0;


    protected Integer doInBackground(Integer... requestCode) {
        Integer reqStatus = 0;
        String url = "http://192.168.2.1/";
        String authString = ("admin:admin");

        switch( reqCode = requestCode[0].intValue()){
            case Constants.HTTP_GET_STATUS_INFO:    url += "/adm/status_info.asp";              break;
            case Constants.HTTP_SCAN:               url += "/goform/getUsbStaBSSIDListForm";    break;
        }

        try {
            DefaultHttpClient client = new DefaultHttpClient();
            HttpGet request = new HttpGet();
            HttpResponse response;

            request.setURI( new URI( url));           
            request.addHeader("Authorization", "Basic " + Base64.encodeToString(authString.getBytes(),Base64.NO_WRAP));

            response = client.execute(request);
            reqStatus = response.getStatusLine().getStatusCode();

            String line;
            BufferedReader in = new BufferedReader( new InputStreamReader(response.getEntity().getContent()));
            while((line = in.readLine()) != null) respTxt.append(line);
        } catch ( ClientProtocolException e){
            Log.e("ALFA", "HTTPReq:ClientProtocolException " + e.toString());
        } catch ( IOException e){
            Log.e("ALFA", "HTTPReq:IOException " + e.toString());
        } catch ( Exception e){
            Log.e("ALFA", "HTTPReq:Exception " + e.toString());
        }

        return reqStatus;
    }

    protected void onPostExecute(Integer reqStatus) {
        Intent intent = new Intent(Constants.HTTP_RESPONSE);

        intent.putExtra( "reqCode", reqCode);
        intent.putExtra( "reqStatus", reqStatus);
        intent.putExtra( "rspTxt", respTxt.toString());

        getBaseContext().sendBroadcast(intent);
}
}

class httpRequestTask extends AsyncTask <Integer, Integer, Integer> { StringBuffer respTxt = new StringBuffer(""); int reqCode = 0; protected Integer doInBackground(Integer... requestCode) { Integer reqStatus = 0; String url = "http://192.168.2.1/"; String authString = ("admin:admin"); switch( reqCode = requestCode[0].intValue()){ case Constants.HTTP_GET_STATUS_INFO: url += "/adm/status_info.asp"; break; case Constants.HTTP_SCAN: url += "/goform/getUsbStaBSSIDListForm"; break; } try { DefaultHttpClient client = new DefaultHttpClient(); HttpGet request = new HttpGet(); HttpResponse response; request.setURI( new URI( url)); request.addHeader("Authorization", "Basic " + Base64.encodeToString(authString.getBytes(),Base64.NO_WRAP)); response = client.execute(request); reqStatus = response.getStatusLine().getStatusCode(); String line; BufferedReader in = new BufferedReader( new InputStreamReader(response.getEntity().getContent())); while((line = in.readLine()) != null) respTxt.append(line); } catch ( ClientProtocolException e){ Log.e("ALFA", "HTTPReq:ClientProtocolException " + e.toString()); } catch ( IOException e){ Log.e("ALFA", "HTTPReq:IOException " + e.toString()); } catch ( Exception e){ Log.e("ALFA", "HTTPReq:Exception " + e.toString()); } return reqStatus; } protected void onPostExecute(Integer reqStatus) { Intent intent = new Intent(Constants.HTTP_RESPONSE); intent.putExtra( "reqCode", reqCode); intent.putExtra( "reqStatus", reqStatus); intent.putExtra( "rspTxt", respTxt.toString()); getBaseContext().sendBroadcast(intent); } }

1 个答案:

答案 0 :(得分:0)

进一步寻找问题的解决方案我发现了一个使用套接字来请求服务器的建议。我将Fiddler与我的PC上的浏览器结合使用,检查发送到错误服务器的数据,并阅读维基百科上的文章,解释HTTP协议。通过使用该信息并使用Socket,我编写了一个非常基本的httpRequestHandler,而不是处理来自错误Web服务器的错过形成的响应。

class httpSocketRequest extends AsyncTask<Integer, Integer, Integer> {
    StringBuffer respTxt = new StringBuffer("");        
    int reqCode = 0;
    int reqStatus = 0;

    protected Integer doInBackground(Integer... requestCode) {
        String ip = "192.168.2.1";
        String path = "";
        String authString = ("admin:admin");
        Socket socket = null;

        switch( reqCode = requestCode[0].intValue()){
            case Constants.HTTP_GET_STATUS_INFO:    path = "adm/status_info.asp";               break;
            case Constants.HTTP_SCAN:               path = "goform/getUsbStaBSSIDListForm";     break;
        }

        try {
            socket = new Socket( ip, 80);

            PrintWriter out = new PrintWriter( socket.getOutputStream());
            out.println( "GET http://" + ip + "/" + path + " HTTP/1.0");
            out.println( "Authorization: Basic " + Base64.encodeToString(authString.getBytes(),Base64.NO_WRAP));
            out.println( "");
            out.flush();

            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            String line;
            int lineCnt = 0;

            while((line = in.readLine()) != null){
                if( lineCnt >= 0){
                    lineCnt++;
                    if(lineCnt == 1){           // first line should start with "HTTP/1.x " followed by a 3 digit status
                        if( line.length() > 12 && line.substring(0, 6).equals("HTTP/1")){
                            int p = line.indexOf(" ");
                            reqStatus = Integer.parseInt(line.substring(p+1, p+4));
                            continue;
                        } else {                // not a well formed response
                            lineCnt = -1;       // just put everything into respTxt
                            reqStatus = 200;    // and assume everything went OK
                        }
                    } else if( lineCnt > 1){    // process rest of headers
                        if( line.length() == 0){
                            lineCnt = -1;       // done with headers
                        } else {
                            // TODO insert code to process other headers
                        }
                        continue;
                    }
                }

                respTxt.append(line + "\n");
            }

        } catch (Exception e) {
            Log.e("ALFA", "HTTPReq:Exception " + e.toString());
        } finally {
            try {
                if( socket != null) socket.close();
            } catch (IOException e) {
                Log.e("ALFA", "HTTPReq:Exception closing socket" + e.toString());
            }
        }

        return reqStatus;
    }

    protected void onPostExecute(Integer reqStatus) {
        Intent intent = new Intent(Constants.HTTP_RESPONSE);

        intent.putExtra( "reqCode", reqCode);
        intent.putExtra( "reqStatus", reqStatus);
        intent.putExtra( "rspTxt", respTxt.toString());

        getBaseContext().sendBroadcast(intent);
    }
}