我使用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
?
感谢
答案 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);
}
}