Google App Engine上的HTTP Post仅在一半的时间内运行

时间:2012-11-06 06:27:15

标签: google-app-engine gwt urlfetch

我已经使用URLFetch类在Google App引擎中将HTTP Post发送到我的php文件(在不同的网站上)。

这就是我所拥有的

try{
byte[] data = ("EMAIL=bo0@gmail.com&TITLE=evolution&COMMENT=comments&PRICE=5000").getBytes("UTF-8");
URL url = new URL("http://www.box.com/nost.php");
HTTPRequest request = new HTTPRequest(url, HTTPMethod.POST);
request.setPayload(data);
HTTPResponse response = URLFetchServiceFactory.getURLFetchService().fetch(request);
}

现在,当我在本地部署时,这似乎完全正常。 但是,当我在谷歌应用引擎上发布时,这只有一半的时间。 (即使是完全相同的数据,我也不止一次地发帖,可能是错误或成功)

由于我没有更改任何数据,这似乎是完全随机的。 任何人都可以告诉我为什么会这样吗?

编辑:这是一个有效的代码 好像我的php阻止了gae正在制作的http请求,有些时候。我通过在catch块中使用递归来修复,直到成功为止。

try {
    URL url = new URL("http://www.mywebsite.com/myfile.php");
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setDoOutput(true);
    connection.setRequestMethod("POST");

    OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
writer.write("EMAIL="+URLEncoder.encode("sam@gmail.com", "UTF-8")+
"&TITLE="+URLEncoder.encode("myTitle", "UTF-8")+
"&PRICE="+URLEncoder.encode(String.valueOf(10000), "UTF-8"));
writer.close();

if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
// OK
return true;
} else {
// Server returned HTTP error code.
//keep retrying until you succeed!! fighting!!
return newPost(postComponent);
}
} catch (MalformedURLException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
catch (Exception e){
e.printStackTrace();
//ah dam probably server is down so you went stack overflow I give up
return false;
}

1 个答案:

答案 0 :(得分:3)

我强烈建议您使用java.net而不是使用URLFetch服务。

根据我的经验,这是要走的路。我已经设置了测试用例,然后我循环访问集合并向远程服务器发出大量POST请求,然后将计数和输出写入浏览器,这样我就可以看到有多少成功,有多少成功。

结果很有趣。我在日志中看到了例外情况,我心想,“哦,太好了,浪费时间去弄清楚为什么网络很糟糕!”。好吧,我看了一万个测试用例的结果,但都取得了成功。

在深入了解异常之后,很明显代码实际上会尝试将请求作为第二次,例如,如果它从服务器获得500响应!这就是为什么我的所有案例都成功了,尽管有500个错误!

这正是我所寻找的,因为它避免了我为服务器问题或小网络问题编写自己的错误处理程序的需要,库为我处理了这个问题。

事实证明,

java.net - HTTPURLConnection在向服务器发送数据时非常可靠:

  

以下示例向包含某些表单数据的URL发出HTTP POST请求:

import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.OutputStreamWriter;

// ...
        String message = URLEncoder.encode("my message", "UTF-8");

        try {

            // this is your url that you're posting to
            URL url = new URL("http://www.box.com/nost.php");

            // create and open the connection using POST 
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoOutput(true);
            connection.setRequestMethod("POST");

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

            // this is your data that you're sending to the server! 
            writer.write("EMAIL=bo0@gmail.com&TITLE=evolution&COMMENT=comments&PRICE=5000");

            writer.close();

            // this is where you can check for success/fail. 
             // Even if this doesn't properly try again, you could make another 
              // request in the ELSE for extra error handling! :)        
            if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                // OK
            } else {
                // Server returned HTTP error code.
            }
        } catch (MalformedURLException e) {
            // ...
        } catch (IOException e) {
            // ...
        }

请记住,您没有向php文件发出请求,而是向服务器发出请求。文件类型没有区别,因为它是引擎盖下的所有HTTP。希望这有帮助!

我编辑了Google的示例,以便它使用您的远程端点和查询字符串数据。