不良请求-400使用Azure添加数据磁盘REST API



我正在构建一个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个错误:

  1. 如果我不将内容类型设置为application/xml
  2. 如果我在我的请求正文中包括<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>

相关内容

  • 没有找到相关文章

最新更新