如何在HttpClient中做请求?

时间:2011-05-12 09:40:56

标签: android web-services rest curl httpclient

我使用jersey framework和java编写REST wed服务。 如果用户想要在curl中请求HttpGet,他需要写如:

curl -u username:password -H "Content-Type:application/...." http://localhost:8080/project/user

现在,我实现了将调用Web服务的android。 有谁知道如何在Android中使用HttpClient来调用Web服务? 如何在HttpClient中设置用户名和密码以匹配curl命令-u username:password

感谢

2 个答案:

答案 0 :(得分:2)

package com.android.demo;


import org.apache.http.HttpEntity;

import org.apache.http.HttpHost;

import org.apache.http.HttpResponse;

import org.apache.http.auth.AuthScope;

import org.apache.http.auth.UsernamePasswordCredentials;

import org.apache.http.client.HttpClient;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.impl.auth.BasicScheme;

import org.apache.http.impl.client.AbstractHttpClient;

import org.apache.http.impl.client.DefaultHttpClient;

import org.apache.http.protocol.BasicHttpContext;

import org.apache.http.util.EntityUtils;

import android.app.Activity;
import android.os.Bundle;

public class MyActivity extends Activity{

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
     /* START Test/Play with beanstalk API */
    String username = "user1";
    String host = "my.host.com";
    String password = "password";

    String urlBasePath = "http://" + username + ".host.com/api/";
    String urlApiCall_FindAllRepositories = urlBasePath
            + "repositories.xml";

    try {
        HttpClient client = new DefaultHttpClient();

        AuthScope as = new AuthScope(host, 443);
        UsernamePasswordCredentials upc = new UsernamePasswordCredentials(
                username, password);

        ((AbstractHttpClient) client).getCredentialsProvider()
                .setCredentials(as, upc);

        BasicHttpContext localContext = new BasicHttpContext();

        BasicScheme basicAuth = new BasicScheme();
        localContext.setAttribute("preemptive-auth", basicAuth);

        HttpHost targetHost = new HttpHost(host, 443, "https");

        HttpGet httpget = new HttpGet(urlApiCall_FindAllRepositories);
        httpget.setHeader("Content-Type", "application/xml");

        HttpResponse response = client.execute(targetHost, httpget,
                localContext);

        HttpEntity entity = response.getEntity();
        Object content = EntityUtils.toString(entity);



    } catch (Exception e) {
        e.printStackTrace();

    }


}
}

希望此代码能够提供帮助

答案 1 :(得分:1)

@sudo尝试这个简单的代码

HttpURLConnection conn = null;

    try {
        // The formated URL will be "http://www.androidcoder.org:80".
        URL url = new URL(String.format("http://%s:%d/%s", mIpAddress, mPort, mSubPage));
        conn = (HttpURLConnection) url.openConnection();

        conn.setRequestMethod("GET");
        conn.setRequestProperty("Content-length", "0");
        conn.setUseCaches(false);
        conn.setAllowUserInteraction(false);
        conn.setConnectTimeout(TIMEOUT);
        conn.setReadTimeout(TIMEOUT);

        // NOTE: Below is used to perform the http authentication. It is working in JAVA but not
        // always working in Android platform.

        // Set to use the default HTTP authentication. Working in JAVA, but not working in
        // Android.
        Authenticator.setDefault(new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("user1", "pass1".toCharArray());
            }
        });
        conn.connect();

        System.out.println(conn.getResponseCode()); // <-- The request will stop here if running
                                                    // in Android.
        System.out.println(conn.getResponseMessage());

        printOutput(conn);

    } catch (MalformedURLException e) {
        // TODO: Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // Operation timed out.
        System.out.println(e.getMessage());
        e.printStackTrace();
    } finally {
        if (conn != null) {
            conn.disconnect();
            conn = null;
        }
    }
}

/**
 * @brief print the output of the HTTP connection.
 * @param conn [in] Http connection.
 */
private static void printOutput(HttpURLConnection conn) throws IOException {
    int length = 256;
    byte bytes[] = new byte[length];
    InputStream is = conn.getInputStream();

    while (is.available() > 0) {

        if (is.available() < length) {
            length = is.available();
        }
        conn.getInputStream().read(bytes, 0, length);
        System.out.println(bytes);
    }
}