Google app engine 谷歌应用程序引擎上的HTTP Post只有一半的时间有效

Google app engine 谷歌应用程序引擎上的HTTP Post只有一半的时间有效,google-app-engine,gwt,urlfetch,Google App Engine,Gwt,Urlfetch,我使用URLFetch类在Google应用程序引擎中对我的php文件(在一些不同的网站上)进行HTTP Post 这就是我所拥有的 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 requ

我使用URLFetch类在Google应用程序引擎中对我的php文件(在一些不同的网站上)进行HTTP Post

这就是我所拥有的

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);
}
现在,当我在本地部署时,它似乎工作得非常好。 然而,当我在谷歌应用程序引擎上发布时,这种方式只有一半的时间有效。 (即,即使使用完全相同的数据,我也会多次按post,这可能是错误的,也可能是成功的)

由于我没有改变任何数据,这似乎是完全随机的。 有谁能告诉我为什么会这样

编辑:这是一个工作代码 有时,我的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;
}

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

以我的经验,这是一条路要走。我以前设置过测试用例,在那里我循环遍历一个集合,向远程服务器发出大量POST请求,然后将计数和输出写入浏览器,这样我就可以看到有多少成功和有多少失败

结果很有趣。我在我的日志中看到异常,我想,“哦,太好了,更多的时间浪费在试图弄清楚网络为什么糟糕!”。嗯,我查看了我的十万个测试用例的结果,所有的测试都是成功的

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

这正是我想要的,因为它避免了我为服务器问题或次要网络问题编写自己的错误处理程序的需要,所以库为我解决了这个问题

向服务器发送数据时已证明非常可靠:

以下示例使用一些表单数据向URL发出HTTP POST请求:

请记住,您不是向php文件发出请求,而是向服务器发出请求。文件类型没有区别,因为它都是隐藏的HTTP。希望这有帮助


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

Define“not working”。定义“错误”。我可以给你六个答案,但现在我只能做一个狡猾的猜测。我甚至不知道你指的是HTTP错误代码还是异常。我在其他帖子的某个地方读过你的答案,但它对我一点帮助都没有,我正在尝试对php文件发出HTTP请求,而不是尝试读取xml文件。java.net不仅仅用于读取xml,它还用于从远程服务器获取内容。它可以是HTML、CSS、JavaSript、XML、CSV文件,也可以只是发送查询参数。它是一个从a到B获取数据的通用高级工具。这只是一个示例,您可以根据自己独特的数据集定制它。这里您缺少的一点是,它有一些内置的故障切换功能,如果遇到很多故障,听起来您需要这些功能。你能详细解释一下你所说的“没有帮助”是什么意思吗?您实际遇到了什么样的错误?哦,对不起,我不知道它可以用于发送查询参数。我对如何更改代码以使其发送查询参数几乎一无所知。我正在试图找出问题的原因,但我不确定如何查看日志,因为它已经部署到应用程序引擎。似乎在我使用旧代码时,我的php给出的响应不是200。这让我发疯了!!!我的PHP URL在所有情况下都能正常工作。(从我的电脑)但它似乎是阻止一些请求时,应用程序引擎请求它。是的,它工作得非常好,我在catch块中使用了递归,只在另一个catch块上返回false(可能是堆栈溢出)。
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) {
            // ...
        }