【问题标题】:Android POST Request returning 403 from AWS API GatewayAndroid POST 请求从 AWS API Gateway 返回 403
【发布时间】:2017-09-27 21:53:13
【问题描述】:

我正在使用带有 API 网关触发器的 AWS Lambda,但遇到了问题。

我正在使用 RetroFit 发出 POST 请求,但我收到了 403 的回复。我正在传递一个带有 URL 的 JSON,亚马逊服务将对其进行处理。有什么我需要放在标题中的吗?我从请求中删除了授权。

这是原始消息,它没有给我详细的消息。

“响应{protocol=h2, code=403, message=, url=https://eun533ayha.execute-api.us-west-1.amazonaws.com/lio}”

接口/改造服务

public interface AmazonService {
    @Headers("Content-Type: application/json; charset=utf8")
    @POST("/lio")
    Observable<ResponseBody> getAmazonResponse(@Body JSONObject input);
}

amazonRetrofit = new Retrofit.Builder()
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .addConverterFactory(GsonConverterFactory.create())
            .callbackExecutor(executor)
            .client(okHttpClient)
            .baseUrl("https://eun533ayha.execute-api.us-west-1.amazonaws.com/Prod/")
            .build();


AmazonService as = amazonRetrofit.create(AmazonService.class);
    JSONObject jsonObject = new JSONObject();
    try {
        jsonObject.put("url", "www.google.com");
    } catch (JSONException e) {
        e.printStackTrace();
    }
    Observable<ResponseBody> obs = as.getAmazonResponse(jsonObject);

    obs.subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Subscriber<ResponseBody>() {
                @Override
                public void onCompleted() {
                    Log.d(TAG, "response onCompleted()");
                }

                @Override
                public void onError(Throwable throwable) {
                    Log.d(TAG, "response onError()");
                }

                @Override
                public void onNext(ResponseBody response) {
                    Log.d(TAG, "response onNext()");
                }
            });

【问题讨论】:

  • 您能否发布一下您如何使用 RetroFit 发出请求以及您的 API 配置?
  • 更新问题
  • 您是否在您的方法上启用了任何身份验证,例如 AWS 身份验证、Cognito 用户池、自定义身份验证?
  • Auth: NONE 在我的 POST 请求中

标签: android amazon-web-services post aws-lambda aws-api-gateway


【解决方案1】:

我认为您使用的是 Retrofit 2,而 Retrofit 2 使用的规则与 .

如果您的路径上有一个前导“/”,它将被视为绝对路径。

public interface AmazonService {
    @Headers("Content-Type: application/json; charset=utf8")
    @POST("/lio")
    Observable<ResponseBody> getAmazonResponse();
}

amazonRetrofit = new Retrofit.Builder()
        .client(okHttpClient)
        .baseUrl("https://eun533ayha.execute-api.us-west-1.amazonaws.com/Prod/")
        .build();

结果:https://eun533ayha.execute-api.us-west-1.amazonaws.com/lio

如果您删除路径上的前导“/”,它将被视为相关路径。

public interface AmazonService {
    @Headers("Content-Type: application/json; charset=utf8")
    @POST("lio")
    Observable<ResponseBody> getAmazonResponse();
}

amazonRetrofit = new Retrofit.Builder()
        .client(okHttpClient)
        .baseUrl("https://eun533ayha.execute-api.us-west-1.amazonaws.com/Prod/")
        .build();

结果:https://eun533ayha.execute-api.us-west-1.amazonaws.com/Prod/lio

在您的情况下,您似乎有一个“Prod”阶段,并且您的集成在资源“/lio”上。我认为如果您删除前导的“/”,它将起作用。

【讨论】:

  • 成功了!现在,Lambda 函数无法识别我传递给 Body 的 JSON。我修改了上面的代码以传递 JSON。
  • 对 json 有什么建议吗?
  • 您可以创建自己的模型来匹配您的身体模式。 public interface AmazonService { @Headers("Content-Type: application/json; charset=utf8") @POST("lio") Observable&lt;ResponseBody&gt; getAmazonResponse(@Body ApiRequest body); }
  • 我没有传递 JSON,而是传递了 HashMap 并且它起作用了。
猜你喜欢
  • 2017-12-13
  • 2020-08-06
  • 2021-05-18
  • 2021-02-10
  • 2016-02-10
  • 1970-01-01
  • 2016-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多