I check this Post. But I don't still understand what the logical error could be. I am still getting this error. I tried to dump the emulator traffic. But I still don't get my head around what the problem could be.

From the traffic dump, this is what Android is sending as request to the server. You can see the response too:

 GET /Authenticate/ HTTP/1.1
 Authorization: Basic asdfasdfasdfas

 Accept-Charset: UTF-8
 Host: www.domain.com
 User-Agent: Dalvik/1.4.0 (Linux; U; Android 2.3.3; sdk Build/GRI34)
 Connection: Keep-Alive
 Accept-Encoding: gzip

 neQPˆ? 6   6   RT 4VRT 5 E (
 »  @ÍCl¦'
 PÙ[    ˜ároP"8"  neQPI "  "  RT 4VRT 5 E
 ¼  @ËVl¦'
 PÙ[    ˜ároP"8«‹  HTTP/1.1 400 Bad Request
 Date: Thu, 13 Sep 2012 04:47:42 GMT
 Server: Apache/2.2.15 (CentOS)
 Content-Length: 310
 Connection: close
 Content-Type: text/html; charset=iso-8859-1

 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
 <html><head>
 <title>400 Bad Request</title>
 </head><body>
 <h1>Bad Request</h1>
 <p>Your browser sent a request that this server could not understand.<br />
 </p>
 <hr>
 <address>Apache/2.2.15 (CentOS) Server at www.domain.com Port 80</address>
 </body></html>
 neQPé¬ 6   6   RT 4VRT 5 E (
 ½  @ÍAl¦'
 PÙ[    ™îároP"8 ,  neQPéË @   @   RT 5RT 4V E  (çØ@ @³-
 l¦'Ù[ Páro ™îP )E            neQPéË @   @   RT 5RT 4V E  (çÙ@ @³,
 l¦'Ù[ Páro ™ïP )D            neQPö“
  ©   ©   RT 5RT 4V E  ›k‹@ @¶Á

  ³ër,9Jr ‘Pÿÿ6B  WRTE   w  [   *  ¨­«º[ 09-13 04:47:41.822   446:0x1c7 D/400      ]
  text/html; charset=iso-8859-1Bad Request

I don't know what those extra characters mean. But I was trying to identify the problem from it.

This is the basic code:

String credentials = username + ":" + password;
byte[] toencode = null;
try {
    toencode = credentials.getBytes("UTF-8");
} catch (UnsupportedEncodingException e1) {
    e1.printStackTrace();
}
HttpURLConnection conn = null;
try {
    //Utilities.isNetworkAvailable(context);
    URL url = new URL(params[0]);   
    Log.d(params[0],"UR");  
    conn = (HttpURLConnection) url.openConnection();
    conn.setRequestProperty("Authorization", "Basic " + Base64.encodeToString(toencode, Base64.DEFAULT));
    conn.setRequestProperty("Accept-Charset", "UTF-8");
    conn.setRequestProperty("Host", "www.domain.com");
    conn.setRequestMethod("GET");
    conn.setDoOutput(true);

    String data = conn.getInputStream().toString();
    return data;
}

Any ideas?

Update

I checked Webserver Logs to see if the requests are hitting the server and if there was any problem with the request. This is what I see from error logs:

 [Thu Sep 13 10:05:24 2012] [error] [client 91.222.195.132] client sent HTTP/1.1 request without  hostname (see RFC2616 section 14.23): /Authenticate/
 [Thu Sep 13 23:11:57 2012] [error] [client 91.222.195.132] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /Authenticate/
 [Thu Sep 13 23:12:03 2012] [error] [client 91.222.195.132] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /Authenticate/

However I am setting the header property for the request.

Any ideas?

有帮助吗?

解决方案

I figured out this myself. Its an issue with the order of setting headers.

Edit: Order I used.

URL url = new URL(strUrl);  
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Host", "myhost.com");
conn.setRequestProperty("Authorization", "Basic " + Base64.encodeToString(toencode, Base64.DEFAULT));
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; U; PPC; en-US; rv:1.3.1)");
conn.setRequestProperty("Accept-Charset", "UTF-8");

conn.setConnectTimeout (5000) ; 
conn.setDoOutput(true); 
conn.setDoInput(true); 

其他提示

I was also facing this issue, but i fixed it by changing my codes, now i am using following lines of codes

 BufferedReader reader;
            StringBuffer buffer;
            String res = null;

            try {
                URL url = new URL(request_url);
                HttpURLConnection con = (HttpURLConnection) url.openConnection();
                con.setReadTimeout(40000);
                con.setConnectTimeout(40000);
                con.setRequestMethod("GET");
                con.setRequestProperty("Accept","application/json");
                con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                con.setDoInput(true);
                con.setDoOutput(true);


                int status = con.getResponseCode();
                InputStream inputStream;
                if (status == HttpURLConnection.HTTP_OK) {
                    inputStream = con.getInputStream();
                } else {
                    inputStream = con.getErrorStream();
                }
                reader = new BufferedReader(new InputStreamReader(inputStream));
                buffer = new StringBuffer();
                String line = "";
                while ((line = reader.readLine()) != null) {
                    buffer.append(line);
                }
                res = buffer.toString();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (ProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return res;

Try this

static final String _url = "http://www.google.com";
static final String charset = "UTF-8";

// to build the query string that will send the message
private static String buildRequestString(String param1,
        String param2, String param3, String param4, String param5)
        throws UnsupportedEncodingException {
    String[] params = new String[5]; //customize this as per your need 
    params[0] = param1;
    params[1] = param2;
    params[2] = param3;
    params[3] = param4;
    params[4] = param5;

    String query = String.format(
            "uid=%s&pwd=%s&msg=%s&phone=%s&provider=%s",
            URLEncoder.encode(params[0], charset),
            URLEncoder.encode(params[1], charset),
            URLEncoder.encode(params[2], charset),
            URLEncoder.encode(params[3], charset),
            URLEncoder.encode(params[4], charset));
    return query;

}

public static void doSomething(String param1, String param2,
        String param3, String param4, String param5) throws Exception {
    // To establish the connection and perform the post request
    URLConnection connection = new URL(_url
            + "?"
            + buildRequestString(param1, param2, param3, param4,
                    param5)).openConnection();
    connection.setRequestProperty("Accept-Charset", charset);
    // This automatically fires the request and we can use it to determine
    // the response status
    InputStream response = connection.getInputStream();
    BufferedReader br = new BufferedReader(new InputStreamReader(response));
    // This stores the response code.
    // Any call to br.readLine() after this is null.
    responsecode = br.readLine();
    // And this logs the already stored response code
    Log.d("ServerResponse", responsecode);
    responseInt = Integer.valueOf(responsecode).intValue();
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top