从Android上接收数据在Android上运行时会收到400响应代码,但不会在Java中运行

时间:2014-12-29 21:59:45

标签: java android input output server

我有这种方法在Java中完美运行:

public static void generateData(double lat, double lon) throws IOException {
    double southLat = lat - 0.02;
    double northLat = lat + 0.03;
    double westLon = lon - 0.1;
    double eastLon = lon + 0.1;
    String urlParameters = "<osm-script output=\"xml\" timeout=\"25\">"
            + " <!-- gather results -->"
            + "<union>"
            + " <query type=\"node\">"
            + " <has-kv k=\"highway\" regv=\"(trunk|primary|secondary|tertiary|trunk|residential)\"/>"
            +

            "  <bbox-query s=\""
            + southLat
            + "\" w=\""
            + westLon
            + "\" n=\"52.45517254183315\" e=\""
            + eastLon
            + "\"/>"
            + "</query>"
            + " <query type=\"way\">"
            + "<has-kv k=\"highway\" regv=\"(trunk|primary|secondary|tertiary|trunk|residential)\"/>"
            +

            "  <bbox-query s=\""
            + southLat
            + "\" w=\""
            + westLon
            + "\" n=\"52.45517254183315\" e=\""
            + eastLon
            + "\"/>"
            + "  </query>"
            + "  </union>"
            + "  <union>"
            + "   <item/>"
            + "  <recurse type=\"down\"/>"
            + "  </union>"
            + " <print mode=\"meta\" order=\"quadtile\"/>" +

            "</osm-script>";
    URL url = new URL("http://overpass-api.de/api/interpreter");
    URLConnection conn = url.openConnection();

    conn.setDoOutput(true);

    OutputStreamWriter writer = new OutputStreamWriter(
            conn.getOutputStream());

    writer.write(urlParameters);
    writer.flush();

    String line;
    BufferedReader reader = new BufferedReader(new InputStreamReader(
            conn.getInputStream()));
    File file = new File("route.xml");
    BufferedWriter output = new BufferedWriter(new FileWriter(file));
    while ((line = reader.readLine()) != null) {
        output.write(line);
        output.newLine();
        System.out.println(line);
    }
    writer.close();
    reader.close();
    output.close();
}

当我运行它时,会创建一个名为route.xml的xml文件并保存到我的文件系统中。我可以打开它,它按照我的预期形成。

我试图在Android应用程序中使用它。上述方法不起作用,因为它返回服务器代码400(格式错误)。我浏览了一下stackoverflow并将代码调整到下面的android:

public void generateData(double lat, double lon) throws IOException {
    double southLat = lat - 0.02;
    double northLat = lat + 0.03;
    double westLon = lon - 0.1;
    double eastLon = lon + 0.1;
    String urlParameters = "<osm-script output=\"xml\" timeout=\"25\">"
            + " <!-- gather results -->"
            + "<union>"
            + " <query type=\"node\">"
            + " <has-kv k=\"highway\" regv=\"(trunk|primary|secondary|tertiary|trunk|residential)\"/>"
            +

            "  <bbox-query s=\""
            + southLat
            + "\" w=\""
            + westLon
            + "\" n=\"52.45517254183315\" e=\""
            + eastLon
            + "\"/>"
            + "</query>"
            + " <query type=\"way\">"
            + "<has-kv k=\"highway\" regv=\"(trunk|primary|secondary|tertiary|trunk|residential)\"/>"
            +

            "  <bbox-query s=\""
            + southLat
            + "\" w=\""
            + westLon
            + "\" n=\"52.45517254183315\" e=\""
            + eastLon
            + "\"/>"
            + "  </query>"
            + "  </union>"
            + "  <union>"
            + "   <item/>"
            + "  <recurse type=\"down\"/>"
            + "  </union>"
            + " <print mode=\"meta\" order=\"quadtile\"/>" +

            "</osm-script>";
    URL url = new URL("http://overpass-api.de/api/interpreter");
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setDoOutput(true);
    conn.setDoInput(false);
    conn.connect();
    int status = conn.getResponseCode();
    Log.e("ERROR CODE", ""+status);
    OutputStreamWriter writer = new OutputStreamWriter(
            conn.getOutputStream());
    // http://www.helloandroid.com/tutorials/how-download-fileimage-url-your-device
    writer.write(urlParameters);
    Log.e("Download", "started writing");

    writer.flush();

    String line;
    BufferedReader reader = new BufferedReader(new InputStreamReader(
            conn.getInputStream()));
    Log.e("Download", "got the stream ");

    File file = new File(getApplication().getApplicationContext()
            .getFilesDir(), "route.xml");
    Log.e("Download", "Created a file to save");

    BufferedWriter output = new BufferedWriter(new FileWriter(file));
    while ((line = reader.readLine()) != null) {
        output.write(line);
        output.newLine();
        System.out.println(line);
    }
    writer.close();
    reader.close();
    output.close();
    System.out.println("reckon i wrote to file.");
}

这将从服务器返回400响应代码。我不明白这一点,因为我不明白如果它在android之外工作会如何变形。

我真的很感激任何帮助。

编辑:在android上运行时的堆栈跟踪是:

> `12-29 22:36:41.779: W/System.err(18702): java.net.ProtocolException: This protocol does not support input
12-29 22:36:41.781: W/System.err(18702):    at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:187)
12-29 22:36:41.781: W/System.err(18702):    at com.running.mattboyle.runnertoolbox.RunningMap.generateData(RunningMap.java:215)
12-29 22:36:41.782: W/System.err(18702):    at com.running.mattboyle.runnertoolbox.RunningMap$1.run(RunningMap.java:121)
12-29 22:36:41.782: W/System.err(18702):    at java.lang.Thread.run(Thread.java:818)
`

0 个答案:

没有答案