1

我已经使用 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;
}
4

1 回答 1

3

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

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

结果很有趣。我在日志中看到了异常,我心想,“哦,太好了,试图找出网络糟糕的原因又浪费了更多时间!”。好吧,我查看了 11000 个测试用例的结果,都成功了。

在深入研究异常之后,很明显代码实际上会尝试第二次发出请求,例如,如果它从服务器获得 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 的示例,以便它使用您的远程端点和查询字符串数据。

于 2012-11-06T06:35:08.583 回答