无法通过HtmlUnit阅读谷歌静态地图

时间:2011-07-21 09:38:07

标签: java google-maps htmlunit

我正试图在following URL上阅读Google地图中的静态地图。

这在我的网络浏览器中运行良好,但是当我从HtmlUnit尝试此操作时,我得到UnexpectedPage结果。有谁知道这意味着什么?

1 个答案:

答案 0 :(得分:2)

根据javadoc of UnexpectedPage,您收到UnexpectedPage,因为服务器返回了意外的内容类型。如果您在HtmlUnit中查看返回的标题,则可以看到它包含:Content-Type=image/png

这是一个从URL检索图像的小应用程序:

import java.awt.Image;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

import com.gargoylesoftware.htmlunit.UnexpectedPage;
import com.gargoylesoftware.htmlunit.WebClient;

/** Small test application used to fetch a map. */
public class FetchMapSwingApp extends JFrame {
   /** Serial Id. */
   private static final long serialVersionUID = 1920071939468904323L;

   /**
    * Default constructor.
    */
   public FetchMapSwingApp() {
      // Make sure the application closes correctly
      setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

      // The map where trying to read
      String url = "http://maps.googleapis.com/maps/api/staticmap?center=55.690815,12.560678&zoom=15&size=400x500&sensor=false";
      // Fetch the image
      Image image = fetchMap(url);

      // Add the image to the JFrame and resize the frame.
      add(new JLabel(new ImageIcon(image)));
      pack();
   }

   /**
    * Fetch the image on the given URL.
    * 
    * @param url
    *            the image location
    * @return the fetched image
    */
   private Image fetchMap(String url) {
      Image image = null;
      WebClient webClient = new WebClient();
      webClient.setThrowExceptionOnScriptError(false);

      try {
         // The URL returns a png file!
         UnexpectedPage page = webClient.getPage(url);
         InputStream inputStream = page.getInputStream();
         // Read the stream to an image
         image = ImageIO.read(inputStream);
      } catch (IOException e) {
         e.printStackTrace();
      }

      return image;
   }

   /**
    * Start of the application.
    * 
    * @param args
    *            the arguments to the main method
    */
   public static void main(String args[]) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         @Override
         public void run() {
            new FetchMapSwingApp().setVisible(true);
         }
      });
   }
}