2014-01-22 20 views
0

我正在构建一个Java应用程序以自动化我的应用程序中的一些典型的基础结构任务。我成功地调用了Azure API,但是我收到了一个(400)错误请求返回码/消息。我在eclipse中调试它,但在连接对象中找不到更有意义的数据。错误的请求 - 400使用Azure时添加数据磁盘REST API

我想要做的最初的简单任务是向我的IaaS虚拟机'gildev01'添加一个新的数据磁盘。我下面这个文档中的指南:http://msdn.microsoft.com/en-us/library/jj157199.aspx

的HTTPS URL是否正确,从management.core.windows.net其次是我的订阅ID,然后执行以下操作:

/服务/ hostedservices/gildev01 /部署/ 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> 

所以 - 两个问题:

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()); 
+0

你创建一个空的数据盘或尝试使用现有的VHD创建新的数据磁盘?另外我猜你正在用Java编写代码。你能分享代码吗? –

+0

创建一个空的数据磁盘 - 实际上,假设你是同一个Guarav Cynapta的创始人 - 这是来自你的博客,并为简单的启动/停止虚拟机工作...尝试添加代码 –

回答

0

是的,基于文档的同一个人:)

选择1 - 通过指定附加空数据磁盘的作用 磁盘标签和磁盘映像的位置。

  • 不包括在请求体的DiskName和SourceMediaLink元件。

  • 包含MediaLink元素并引用与角色处于相同地理区域的Blob。

  • 您也可以省略MediaLink元素。在此用法中,Windows Azure将在配置为默认角色 的存储帐户中创建数据磁盘。

你可以尝试从您的请求主体上取下<DiskName>元素,看看是否起作用?

而且不知道你会怎么做这在Java中,但是当你得到一个400例外,如果您解析响应主体,应该可以看到详细的错误信息。例如,在。网我们做这样的事情:

 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-版本: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> 
+0

哇 - 爱你的博客! ...所以我试图删除DiskName然后MediaLink标签,仍然有不好的请求。据我所知,这是con.getOutputStream方法会抛出一个异常 - 只会抛出一个IOException,并且在我放入try/catch时不会发生。 –

+0

只需删除DiskName并保留MediaLink标记。 –

+0

对不起 - 可能没有说清楚:我试着先删除DiskName,然后让MediaLink不起作用。然后我试着去掉两个 - 仍然没有工作。 –

相关问题