Sheehan Alam
Sheehan Alam

Reputation: 60859

Problem sending HTTP headers in Java

Am I correctly sending an HTTPPost? I am checking my encodedAuthString against my webserver and can verify the string is correct. Not sure why I am unable to authenticate.

public JSONObject connect(String url) {
            HttpClient httpclient = new DefaultHttpClient();

            // Prepare a request object
            HttpPost httppost = new HttpPost(url);

            String authString = usernameEditText.getText().toString() + ":" + passwordEditText.getText().toString();
            String encodedAuthString = Base64.encodeToString(authString.getBytes(),Base64.DEFAULT);
            String finalAuthString = "Basic " + encodedAuthString;

            // Execute the request
            HttpResponse response;
            try {  
                httppost.addHeader("Authorization", finalAuthString);

                response = httpclient.execute(httppost);
                // Examine the response status
                Log.i("Praeda", response.getStatusLine().toString());

                // Get hold of the response entity
                HttpEntity entity = response.getEntity();

                if (entity != null) {

                    // A Simple JSON Response Read
                    InputStream instream = entity.getContent();
                    String result = convertStreamToString(instream);

                    // A Simple JSONObject Creation
                    JSONObject json = new JSONObject(result);

                    // Closing the input stream will trigger connection release
                    instream.close();

                    return json;
                }

            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected JSONObject doInBackground(String... urls) {
            return connect(urls[0]);
        }

        @Override
        protected void onPostExecute(JSONObject json) {
            String authorized = "200";
            String unauthorized = "401";
            String notfound = "404";
            String status = new String();

            try {
                // Get the messages array
                JSONObject response = json.getJSONObject("response");
                status = response.getString("status");

                if(status.equals(authorized))
                    Toast.makeText(getApplicationContext(), "Authorized",Toast.LENGTH_SHORT).show();
                else if (status.equals(unauthorized))
                    Toast.makeText(getApplicationContext(), "Unauthorized",Toast.LENGTH_SHORT).show();
                else if(status.equals(notfound))
                    Toast.makeText(getApplicationContext(), "Not found",Toast.LENGTH_SHORT).show();

            } catch (JSONException e) {
                System.out.println(e);
            } catch (NullPointerException e) {
                System.out.println(e);
            }
        }
    }

UPDATE:

When I hard-code the encoded string, everything is fine.

When I use the Base64 encoder I get the same results as the encoded string, but the server returns a 401.

Upvotes: 2

Views: 6690

Answers (2)

user3018926
user3018926

Reputation: 1

I saw extra \n in the string, so instead of using default option, I used no_wrap option like this:

Base64.encodeToString(authordata.getBytes(), Base64.NO_WRAP);

and it worked for me.

Upvotes: 0

CommonsWare
CommonsWare

Reputation: 1006604

You are not setting any headers in this code. Use setHeader() to set headers. This too is covered in the documentation for HttpClient, as was the information from your previous question.

Here is a sample project that sets the Authorization header. Note that it uses a separate Base64 encoder, since the built-in one only showed up with Android 2.2, IIRC.

Upvotes: 4

Related Questions