可以从Glass发送HTTP请求吗?

时间:2015-01-22 18:32:22

标签: java android http servlets google-glass

我正在为Google Glass开发,并且在将文件从Glass上传到我用来管理API调用的servlet应用程序时遇到了问题。我设置了一个客户端ID和密码,使用Developer's控制台验证来自servlet应用程序的api调用。我已经看到这些链接提到玻璃的http请求:
HTTP Requests in Glass GDK 1
Google Glass upload files using http-client
......但他们并没有非常有帮助。 我确实在清单文件中设置了Internet权限。这是我的代码:

public class MyAsyncTask extends AsyncTask<Void, Void, Void> {
  private static final String TAG = "MyAsyncTask";
  private static String FILE_PATH;
  private String fileType;
  private static final String HOST_URL="http://10.0.2.2:8080/main";
  private static java.io.File fileToUpload;

public MyAsyncTask(String filePath){
    FILE_PATH=filePath;
    fileToUpload=new java.io.File(FILE_PATH);
    Log.d(TAG,FILE_PATH);
    fileType=FILE_PATH.substring(FILE_PATH.indexOf("."));
}
@Override
protected Void doInBackground(Void... params) {
    post();
    return null;
}

private int post() {

    int resultCode = 0;

    String url = HOST_URL;

    HttpClient client = new DefaultHttpClient();
    HttpPost post = new HttpPost(url);


    List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
    urlParameters.add(new BasicNameValuePair("source", "glass"));

    try {
        post.setEntity(new UrlEncodedFormEntity(urlParameters));

        HttpResponse response = client.execute(post);
        System.out.println("\nSending 'POST' request to URL : " + url);
        System.out.println("Post parameters : " + post.getEntity());
        System.out.println("Response Code : " +
                response.getStatusLine().getStatusCode());

        resultCode = response.getStatusLine().getStatusCode();

        BufferedReader rd = new BufferedReader(
                new InputStreamReader(response.getEntity().getContent()));

        StringBuffer result = new StringBuffer();
        String line = "";
        while ((line = rd.readLine()) != null) {
            result.append(line);
        }

        System.out.println(result.toString());
    } catch (Exception e) {
        Log.e("POST", e.getMessage());
    }

    return resultCode;
}

调用MyAsyncTask(filePath).execute();是连接被拒绝。我将URL设置为它是什么因为我读到localhost可能指的是像运行Android模拟器时那样的Glass设备,但是servlet正在http://localhost:8080运行。

作为参考,我使用Jetty 6.1.x作为我的servlet。

我的问题是什么? Glass不支持触发HTTP请求吗?我应该尝试验证我没有的地方吗?如果需要,我很乐意提供任何其他参考信息。我非常感谢任何指导和专业知识。谢谢。

2 个答案:

答案 0 :(得分:0)

Glass支持HTTP调用 - 我不认为这是你的问题。

问题似乎更可能在于您的servlet或网络配置(或它们的某种组合)。

要检查的一些事项:

  • 确保您的Glass已连接到本地网络,以及与服务器连接的同一本地网络。服务器的10.x.x.x地址表明它位于专用网络上,您需要确保Glass位于同一专用网络上。
    • 您可以通过转到Glass上的设置屏幕来检查并确认它所连接的WiFi网络。确保它说&#34; Wi-Fi&#34;。点击屏幕,它应该告诉你你所连接的wifi网络。
    • 要验证,您可能需要获取设备的IP地址。有关可能有助于您这样做的一些代码,请参阅this answer
  • 确保您可以使用您提供的地址到达服务器。如果可以,请在另一台计算机(在同一网络上)上使用浏览器。确保您使用Glass应用将使用的确切网址 - http://10.0.2.2:8080/main
    • 使用IP地址,而不是&#34; localhost&#34;很重要。
    • 从同一台计算机上测试它与同一网络上的另一台计算机可能会指向计算机上的防火墙阻止该端口。
  • 确认您的servlet正在侦听哪个端口。
    • 您不会谈论您正在使用的servlet引擎,因此很难指出您应该在哪个文件中检查配置。如果您告诉我们,如果您不知道,我们可能会指出您正确的方向。
    • Glass上的URL正在寻找8080,因此请确保您的servlet也设置为使用该端口。 (8080是一个非常典型的,但不能保证。)你的servlet不应该自己打开一个端口 - 让servlet容器处理它。
  • 检查您的servlet日志,尤其是访问日志,以查看Glass设备和上面的手动测试是否实际连接到它。或者,如果有任何东西可以连接到它。

答案 1 :(得分:0)

我想出了我的问题,我意识到我可以提供更多信息。我很抱歉。无论如何,Jetty服务器只在localhost(127.0.0.1)上运行。为了解决这个问题,我编辑了我的maven项目的pom.xml文件,如下所示:

- 在配置标记下添加了appengine插件标记,地址标记为地址0.0.0.0,端口标记为端口8080.这允许它在localhost上运行。
- 当我尝试访问原始本地IP时,appengine发出400错误,所以我在我的机器上编辑了hosts文件,位于/ private / etc / hosts之类,并添加了这一行:

my-wlan-ip fakedomain.com

但我还必须将fakedomain.com:8080/oauth2callback添加到我在基于凭据的Google Developer's Console中注册的重定向uris。

让我从其他设备访问我的devserver。