【问题标题】:uber requestRide() method Response Error 401: Unauthorizeduber requestRide() 方法响应错误 401:未经授权
【发布时间】:2018-03-25 16:02:07
【问题描述】:

当我尝试在 Uber api 上调用 requestRide() 方法时出现错误。响应正文为空,响应消息为“未授权”,错误代码为 401;而 onResponse() 回调方法正在执行但 onFailure() 回调方法没有执行。

这是我调用 requestRide() 并实现回调接口的代码...

private void requestForNewRide(RidesService service, int position){
        RideRequestParameters rideRequestParameters = new RideRequestParameters.Builder().setPickupCoordinates(PICKUP_LATITUDE, PICKUP_LONGITUDE)
                .setProductId(productIds.get(position))
                .setFareId(fareIds.get(position))
                .setDropoffCoordinates(DROPOFF_LATITUDE, DROPOFF_LONGITUDE)
                .build();
        service.requestRide(rideRequestParameters).enqueue(new Callback<Ride>() {
            @Override
            public void onResponse(Call<Ride> call, Response<Ride> response) {

                if (response.isSuccessful()) {
                    Toast.makeText(CustomActivity.this, "Request ride success", Toast.LENGTH_SHORT).show();

                    try {
                        //ride details
                        String rideId = response.body().getRideId();
                        String rideStatus = response.body().getStatus();
                        Integer rideEta = response.body().getEta();                           //estimated time of arrival in min
                        Float rideSurgeMultiplier = response.body().getSurgeMultiplier();     //rise in price
                        Driver rideDriver = response.body().getDriver();
                        Location rideLocation = response.body().getLocation();
                        Vehicle rideVehicle = response.body().getVehicle();

                        //ride driver details
                        String driverName = rideDriver.getName();
                        String driverPhoneNumber = rideDriver.getPhoneNumber();
                        String driverPictureUri = rideDriver.getPictureUrl();
                        Float driverRating = rideDriver.getRating();

                        //ride Location details
                        Float rideLocationLatitude = rideLocation.getLatitude();
                        Float rideLocationLongitude = rideLocation.getLongitude();
                        Integer rideLocationBearing = rideLocation.getBearing();

                        //ride Vehicle details
                        String rideVehicleLicencePlate = rideVehicle.getLicensePlate();
                        String rideVehicleMake = rideVehicle.getMake();
                        String rideVehicleModel = rideVehicle.getModel();
                        String rideVehiclePictureUrl = rideVehicle.getPictureUrl();

                        //Log
                        Log.d("uberridedetails", "rideId: " + rideId);
                        Log.d("uberridedetails", "rideStatus: " + rideStatus);
                        Log.d("uberridedetails", "rideEta: " + rideEta);
                        Log.d("uberridedetails", "rideSurgeMultiplier: " + rideSurgeMultiplier);
                        Log.d("uberridedetails", "driverName: " + driverName);
                        Log.d("uberridedetails", "driverPhoneNumber: " + driverPhoneNumber);
                        Log.d("uberridedetails", "driverPictureUri: " + driverPictureUri);
                        Log.d("uberridedetails", "driverRating: " + driverRating);
                        Log.d("uberridedetails", "rideLocationLatitude: " + rideLocationLatitude);
                        Log.d("uberridedetails", "rideLocationLongitude: " + rideLocationLongitude);
                        Log.d("uberridedetails", "rideLocationBearing: " + rideLocationBearing);
                        Log.d("uberridedetails", "rideVehicleLicencePlate: " + rideVehicleLicencePlate);
                        Log.d("uberridedetails", "rideVehicleMake: " + rideVehicleMake);
                        Log.d("uberridedetails", "rideVehicleModel: " + rideVehicleModel);
                        Log.d("uberridedetails", "rideVehiclePictureUrl: " + rideVehiclePictureUrl);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }else {
                    Toast.makeText(CustomActivity.this, "Error: "+response.message(), Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onFailure(Call<Ride> call, Throwable t) {
                Toast.makeText(CustomActivity.this, "Failed to request ride", Toast.LENGTH_SHORT).show();
            }
        });
    }

我已经检查了参数 productId 和 FareId 是否有效,这是我从 api 本身获取的(通过调用estimateRide() 我得到 Price 对象,我得到了 fareId。并通过在 RideService 对象上调用 getProducts()我有 productId。

这是设置的代码...

 SessionConfiguration config = new SessionConfiguration.Builder()
                .setClientId(getResources().getString(R.string.client_id))
                .setRedirectUri(getResources().getString(R.string.redirect_url))
                .setEnvironment(SessionConfiguration.Environment.SANDBOX)
                .setScopes(Arrays.asList(Scope.PROFILE, Scope.RIDE_WIDGETS, Scope.REQUEST, Scope.REQUEST_RECEIPT))
                .build();
        UberSdk.initialize(config);

还有……

LoginCallback loginCallback = new LoginCallback() {
            @Override
            public void onLoginCancel() {
                // User canceled login
                Toast.makeText(CustomActivity.this, "User canceled login", Toast.LENGTH_SHORT).show();
            }
            @Override
            public void onLoginError(@NonNull AuthenticationError error) {
                // Error occurred during login
                Toast.makeText(CustomActivity.this, "Error occurred during login", Toast.LENGTH_SHORT).show();
            }
            @Override
            public void onLoginSuccess(@NonNull AccessToken accessToken) {
                // Successful login!  The AccessToken will have already been saved.
                Toast.makeText(CustomActivity.this, "Successful login!  The AccessToken will have already been saved.", Toast.LENGTH_SHORT).show();
                createSession();
            }
            @Override
            public void onAuthorizationCodeReceived(@NonNull String authorizationCode) {
                Toast.makeText(CustomActivity.this, "Authorization code received", Toast.LENGTH_SHORT).show();
                createSession();
            }
        };
        AccessTokenManager accessTokenManager = new AccessTokenManager(getApplicationContext());
        LoginManager loginManager = new LoginManager(accessTokenManager, loginCallback);
        loginManager.setRedirectForAuthorizationCode(true);
        loginManager.login(this);
        mAccessTokenManager = accessTokenManager;
        mLoginManager = loginManager;

注意1:这些是我正在使用的范围......

Scope.PROFILE, Scope.RIDE_WIDGETS, Scope.REQUEST, Scope.REQUEST_RECEIPT

注意2:我正在使用我的开发者帐户登录。

如果我应该提及任何其他细节,请告诉我。

【问题讨论】:

  • 您还有身份验证问题吗?我可以从我们的日志中看到,您已经设法获得了有效的访问令牌:uber.com/en-IN#access_token=KA.eyJ2ZXJzaW9uIjoyLCJpZCI6Ik1XOX*****。还有一个成功的乘车请求:“@timestamp”:“2017-10-16T13:41:19.318Z”。您能否更新您的问题的解决方案 - 问题是什么。

标签: android uber-api


【解决方案1】:

绝对是我自己找到了解决方案。

我注意到 onLoginSuccess() 回调方法仅在我使用 GENERAL SCOPE 时才被调用。

每当我使用 RESTRICTED SCOPE 时,都不会调用该方法,而是调用另一个名为 onAuthorizationCodeReceived() 的回调方法。

然后我发现,每当调用onAuthorizationCodeReceived() 方法时,AccessTokenManager 对象中都没有保存访问令牌。因此,如果没有访问令牌,当我尝试请求乘车时,错误会返回“未授权”。

所以,我试图弄清楚如何使用授权码生成访问令牌。我在 Android 部分没有找到有关此过程的文档。然后我在 REST Web 服务 api 中找到了解决方案。

这是我的答案LINK...

注意: Uber Doc 中没有提到回调方法 onAuthorizationCodeReceived()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 2022-08-07
    相关资源
    最近更新 更多