在像这样调用 openConnection() 之前设置了一个 Authenticator,
Authenticator.setDefault(new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password.toCharArray());
}
});
由于只有一个全局默认身份验证器,因此当您有多个用户在多个线程中执行 URLFetch 时,这并不能很好地工作。如果是这样,我会使用 Apache HttpClient。
编辑:我错了。App Engine 不允许身份验证器。即使允许,我们也会遇到全局验证器实例的多线程问题。即使您无法创建线程,您的请求仍可能在不同的线程中得到处理。所以我们只是使用这个函数手动添加标题,
import com.google.appengine.repackaged.com.google.common.util.Base64;
/**
* Preemptively set the Authorization header to use Basic Auth.
* @param connection The HTTP connection
* @param username Username
* @param password Password
*/
public static void setBasicAuth(HttpURLConnection connection,
String username, String password) {
StringBuilder buf = new StringBuilder(username);
buf.append(':');
buf.append(password);
byte[] bytes = null;
try {
bytes = buf.toString().getBytes("ISO-8859-1");
} catch (java.io.UnsupportedEncodingException uee) {
assert false;
}
String header = "Basic " + Base64.encode(bytes);
connection.setRequestProperty("Authorization", header);
}