我正在构建一个Java应用程序,以在我的应用程序中自动化一些典型的基础架构任务。我成功地调用了Azure API,但是我收到了(400)不良请求返回代码/消息。我在Eclipse中调试此内容,但在连接对象中找不到任何有意义的数据。
我要做的最初的简单任务是在我的IaAs VM" Gildev01"中添加一个新的数据磁盘。我正在遵循此文档的指导:http://msdn.microsoft.com/en-us/library/jj157199.aspx
HTTPS URL是正确的,从Management.Core.Windows.NET开始,然后是我的订阅ID,然后是以下内容:
/services/hostedservices/gildev01/deployments/gildev01/角色/gildev01/datadisks
有效载荷如下:
<DataVirtualHardDisk xmlns="http://schemas.microsoft.com/windowsazure" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<HostCaching>ReadWrite</HostCaching>
<DiskLabel>java-disklabel-1</DiskLabel>
<DiskName>javadisk1</DiskName>
<LogicalDiskSizeInGB>1000</LogicalDiskSizeInGB>
<MediaLink>http://<myacct>.blob.core.windows.net/vhds/javadisk1.vhd</MediaLink>
</DataVirtualHardDisk>
so-两个问题:
1)关于我对URL或有效载荷做错什么的想法?
2)关于如何从响应对象中获取更多信息的任何建议?
添加Java代码:
private String addDataDisk (URL url, String keyStore, String keyStorePassword) throws UnrecoverableKeyException, KeyManagementException, KeyStoreException, NoSuchAlgorithmException, IOException {
SSLSocketFactory sslFactory = getSSLSocketFactory(keyStore, keyStorePassword);
String requestBody = "<DataVirtualHardDisk xmlns="http://schemas.microsoft.com/windowsazure" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><HostCaching>ReadWrite</HostCaching><DiskLabel>java-disklabel-1</DiskLabel><DiskName>javadisk1</DiskName><LogicalDiskSizeInGB>1000</LogicalDiskSizeInGB><MediaLink>http://myacct.blob.core.windows.net/vhds/javadisk1.vhd</MediaLink></DataVirtualHardDisk>");
HttpsURLConnection con = null;
con = (HttpsURLConnection) url.openConnection();
con.setSSLSocketFactory(sslFactory);
con.setDoOutput(true);
con.setRequestMethod("POST");
con.addRequestProperty("x-ms-version", "2013-08-01");
con.setRequestProperty("Content-Length", String.valueOf(requestBody.length()));
con.setRequestProperty("Content-Type", "application/xml");
DataOutputStream requestStream = new DataOutputStream (con.getOutputStream());
requestStream.write(requestBody.getBytes());
requestStream.flush();
requestStream.close();
String responseMessage = con.getResponseMessage()+" - "+Integer.toString(con.getResponseCode());
是的,同一个人:)
基于文档:
选项1 - 通过指定的 磁盘标签和磁盘图像的位置。
不包括请求正文中的diskname和sourcemedialink 元素。
包括中介元素和引用与角色相同地理区域的斑点。
您也可以省略MediaLink元素。在此用法中,Windows Azure将在配置为的存储帐户中创建数据磁盘 该角色的默认值。
您可以通过从请求正文中删除<DiskName>
元素来尝试一下吗?
也不确定如何在Java中执行此操作,但是当您获得400例异常时,如果您解析响应主体,则应看到详细的错误消息。例如,在.net中,我们做这样的事情:
catch (WebException webEx)
{
using (var resp = (HttpWebResponse)webEx.Response)
{
using (var respStreamReader = new StreamReader(resp.GetResponseStream()))
{
var errorMessage = respStreamReader.ReadToEnd();//errorMessage will be XML containing detailed error message.
}
}
}
update
所以我只是尝试使用API创建一个空数据磁盘,在两种情况下我会遇到400个错误:
- 如果我不将内容类型设置为
application/xml
。 - 如果我在我的请求正文中包括
<DiskName>
元素。删除此元素后,我就可以成功创建一个数据磁盘。因此您的要求主体不应包含此元素。
更新2
端点: https://management.core.windows.net/<subscriptionid>/services/hostedservices/<cloudservicename>/deployments/<deploymentname>/roles/<rolename>/DataDisks
x-ms-version: 2013-08-01
XML请求:
<DataVirtualHardDisk xmlns=""http://schemas.microsoft.com/windowsazure"" xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"">
<HostCaching>ReadWrite</HostCaching>
<DiskLabel>java-disklabel-1</DiskLabel>
<LogicalDiskSizeInGB>1000</LogicalDiskSizeInGB>
<MediaLink>http://account.blob.core.windows.net/vhds/javadisk1.vhd</MediaLink>
</DataVirtualHardDisk>