有没有人尝试过在Android上连接Azure的DocumentDB?我已经尝试使用新的Java SDK,但由于核心Android SDK中一些旧的必需的Apache依赖项冲突问题,它似乎不支持Android。我正在尝试使用Rest API方法,但进展缓慢。
非常感谢任何帮助!
有没有人尝试过在Android上连接Azure的DocumentDB?我已经尝试使用新的Java SDK,但由于核心Android SDK中一些旧的必需的Apache依赖项冲突问题,它似乎不支持Android。我正在尝试使用Rest API方法,但进展缓慢。
非常感谢任何帮助!
好的,这个问题解决起来真是一场噩梦。九个小时后……-_-。长话短说,这里有一些代码可以成功运行。这段代码并不完美,并且依赖于Retrofit。
首先,这是一个在Retrofit中的示例“Service”接口:
import retrofit.Callback;
import retrofit.http.Body;
import retrofit.http.Header;
import retrofit.http.POST;
public interface MyPojoService {
@POST("/dbs/[db_id]/colls/[collection_id]/docs")
void addDocument(@Header("authorization") String authorization, @Header("x-ms-date") String date, @Body MyPojo myPojo, Callback<MyPojo> cb);
}
// Replace with your DocumentDB master key.
private static final String MASTER_KEY = "[Insert Key Here]";
//Gson instance.
private Gson gson = new Gson();
public void callDocumentDB() {
SimpleDateFormat formatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.US);
formatter.setTimeZone(TimeZone.getTimeZone("GMT"));
String headerDate = formatter.format(new Date()).toLowerCase(); //According to the spec the format matters here. Make sure to use this format on the header dates.
MyPojo myPojo = new MyPojo();
myPojo.id = UUID.randomUUID().toString(); //This is the only required field, and does not have to be a UUID.
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("https://[INSERT DB NAME HERE].documents.azure.com")
.build();
MyPojoService service = restAdapter.create(MyPojoService.class);
service.addDocument(generateAuthHeader("post", "docs", "[INSERT COLLECTION ID HERE]", headerDate, MASTER_KEY), headerDate, myPojo, new Callback<MyPojo>() {
@Override
public void success(MyPojo myPojo, Response response) {
//[INSERT API SUCCESSFUL CALL LOGIC HERE]
}
@Override
public void failure(RetrofitError error) {
throw error;
}
});
}
private String generateAuthHeader(String verb, String resourceType, String resourceId, String date, String masterKeyBase64) throws Exception
{
//Decode the master key, and setup the MAC object for signing.
byte[] masterKeyBytes = Base64.decode(masterKeyBase64, Base64.NO_WRAP);
Mac mac = Mac.getInstance("HMACSHA256");
mac.init(new SecretKeySpec(masterKeyBytes, "HMACSHA256"));
//Build the unsigned auth string.
String stringToSign = verb + "\n"
+ resourceType + "\n"
+ resourceId + "\n"
+ date + "\n"
+ "\n";
//Sign and encode the auth string.
String signature = Base64.encodeToString(mac.doFinal(stringToSign.toLowerCase().getBytes("UTF8")), Base64.NO_WRAP);
//Generate the auth header.
String authHeader = URLEncoder.encode("type=master&ver=1.0&sig=" + signature, "UTF8");
return authHeader;
}