【问题标题】:com.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found with App Engine using Androidcom.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found with App Engine using Android
【发布时间】:2017-06-11 04:33:02
【问题描述】:

我们的应用基于 Google App Engine。

由于某些奇怪的原因,在 Android 上调用很少的方法并不能在 Web 和 iOS 上运行。这让我们相信后端(部署、版本等)没有问题。

通过 api explorer 调用相同的方法可以正常工作。我们在 StackDriver 中也看不到任何日志。

这个方法所做的只是返回用户拥有的角色。我们不怀疑参数(例如排序、注释等),因为此方法不需要任何参数。

我们是最新的 SDK 并使用 Android Studio 3.2.2。

Android 模拟器跟踪:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:321)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1065)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
at com.app.android.LoginActivity$userRoleAsyncTask.doInBackground(LoginActivity.java:413)
at com.app.android.LoginActivity$userRoleAsyncTask.doInBackground(LoginActivity.java:385)
at android.os.AsyncTask$2.call(AsyncTask.java:304)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)

Android 代码:

@Override
protected UserRole doInBackground(String... params) {
    UserRole response = null;
    try {
        UserEndpoint.Builder builder = new 
        UserEndpoint.Builder(AndroidHttp.newCompatibleTransport(), new GsonFactory(), null);
        builder.setHttpRequestInitializer(new HttpRequestInitializer(){
            @Override
            public void initialize(HttpRequest request) throws IOException {
                HttpHeaders httpHeaders = new HttpHeaders();
                httpHeaders.set("JSESSIONID", prefs.getCookie());
                request.setHeaders(httpHeaders);
            }
        });

        UserEndpoint service = builder.build();
        response = service.getRoles().execute();
        LogUtil.debug("getRole Response: " + response.toString());

        } catch (Exception e) {
            Log.d("Could not get UserRole", e.getMessage(), e);
        }
        return response;
    }
}

App 引擎代码:

@ApiMethod(name = "getRoles", path = "getRoles", httpMethod = HttpMethod.GET)
public UserRole getRoles(HttpServletRequest request) throws DatabaseException, IOException {

    //retrieve session and do not create if it does not exist
    HttpSession session = request.getSession(false);
    UserRole userRole = null;

    if (session != null){

        //retrieve user from session
        User user = (User) session.getAttribute("user");
        userRole = new UserRole(true, user.getIsActive(), user.getHasChild());
    }

    return userRole;
}

App 引擎浏览器

有什么想法吗?谢谢!

【问题讨论】:

  • 不确定为什么这个问题被否决?查看所有帖子,找不到与此问题相关的任何内容。正如我所说,后端正在其他平台上工作。只有极少数方法不适用于 Android,这一事实很有趣。

标签: java android google-app-engine


【解决方案1】:

将根 url 设置为此方法解决了问题。

builder.setHttpRequestInitializer(new HttpRequestInitializer(){
    @Override
    public void initialize(HttpRequest request) throws IOException {
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.set("JSESSIONID", prefs.getCookie());
        request.setHeaders(httpHeaders);
  }
});

builder.setRootUrl("https://android-app-backend.appspot.com/_ah/api/");
UserEndpoint service = builder.build();
response = service.getRoles().execute();

其中 android-app-backend 对应于您自己的项目 ID。 https://cloud.google.com/endpoints/docs/frameworks/legacy/v1/java/helloendpoints-android-studio

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-09
    • 2019-05-12
    • 2021-04-16
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多