【问题标题】:Uber API sandbox request status is not updating correctlyUber API 沙盒请求状态未正确更新
【发布时间】:2016-05-17 10:33:07
【问题描述】:

我正在使用 Swift 构建一个使用 Uber API 乘车请求端点的 iOS 应用程序。使用沙盒我无法正确更改乘车请求状态。我已经尝试使用 Uber 在他们的文档中的 curl 命令更新它,它似乎被 Uber 正确接收(我没有收到错误回复)。但是,在我的应用程序中,当我进行另一个状态调用时,它不会从 processing 更改。

目前,当我将请求发布到https://sandbox-api.uber.com/v1/requests 时,我会收到下面的响应,请注意状态为accepted

Prepare to make request -> <p2_OAuth2.OAuth2Request: 0x7fb89a854e50> { URL: https://sandbox-api.uber.com/v1/requests }
Result -> {
  destination =     {
    latitude = "37.393913269";
    longitude = "-122.0800018311";
  };
  driver =     {
    name = John;
    "phone_number" = "(555)555-5555";
    "picture_url" = "https://d1a3f4spazzrp4.cloudfront.net/uberex-sandbox/images/driver.jpg";
    rating = "4.9";
  };
  eta = 1;
  location =     {
    bearing = "-150";
    latitude = "37.33233141";
    longitude = "-122.0312186";
  };
  pickup =     {
    eta = 1;
    latitude = "37.33233141";
    longitude = "-122.0312186";
  };
  "request_id" = "39d76708-3a26-4fb7-bb0f-31f37c931a0b";
  status = accepted;
  "surge_multiplier" = 1;
  vehicle =     {
    "license_plate" = "UBER-PLATE";
    make = Toyota;
    model = Prius;
    "picture_url" = "https://d1a3f4spazzrp4.cloudfront.net/uberex-sandbox/images/prius.jpg";
  };
}

现在乘车请求已成功提交,我使用上述响应中的 requestID 调用我的rideStatus 函数。这是我提出的要求。

class func rideStatus(uberRequestId:String, completion: (status: String) -> Void) {

    var status:String = ""

    let urlPath = "https://sandbox-api.uber.com/v1/requests/\(uberRequestId)"
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

    guard let endpoint = NSURL(string: urlPath) else { print("Error creating endpoint");return }
    let request = appDelegate.oauth.request(forURL: NSURL(string:urlPath)!)
    request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
    request.HTTPMethod = "GET"


    NSURLSession.sharedSession().dataTaskWithRequest(request) { (data, response, error) -> Void in
        do {
            guard let dat = data else { throw JSONError.NoData }

            let result = try NSJSONSerialization.JSONObjectWithData(dat, options: NSJSONReadingOptions.MutableContainers)

            print(result)

            //set status
            status = result["status"] as! String

            print("found status...returning it back -> \(status)")
            completion(status: "\(status)")

        } catch let error as JSONError {
            print(error.rawValue)
            print("ERROR NEEDS TO BE HANDLED. NO RETURN FROM UBER API")
        } catch {
            print(error)
            print("ERROR NEEDS TO BE HANDLED. NO RETURN FROM UBER API")
        }
    }.resume()

}

所以这是奇怪的部分。我现在得到的回复是processing。请注意,两个请求中的乘车请求 ID 相同。我每 5 秒使用 NSTimer 调用此函数,每次调用时我不断得到的响应与下面的相同。 NSURLNSURLSession 是否正在缓存某些东西,所以我得到了下面的旧响应。

requestID is -> 39d76708-3a26-4fb7-bb0f-31f37c931a0b
{
  driver = "<null>";
  eta = "<null>";
  location = "<null>";
  "request_id" = "39d76708-3a26-4fb7-bb0f-31f37c931a0b";
  status = processing;
  "surge_multiplier" = 1;
  vehicle = "<null>";
}

另外,如果我使用下面的 curl 请求,我似乎无法让它持续更改状态。我尝试将其更改为接受,但似乎不起作用。如果我将其更改为complete,它将偶尔工作,complete 我的旅程。但是,我仍然在rideStatus 函数中显示processing。我知道它是completed 的唯一方法是,如果我重新启动我的模拟器并发出一个新的 POST 乘车请求,我将从 Uber 取回一个不同的 requestId。这是我更新状态的 curl:

curl -X "PUT" "https://sandbox-api.uber.com/v1/sandbox/requests/39d76708-3a26-4fb7-bb0f-31f37c931a0b" \
  -H "Authorization: Bearer RYV7mXXXXXXXXXXXXXXXXXXXXXyzLw" \
  -H "Content-Type: application/json"\
  -d '{"status":"accepted"}'

还有其他人遇到过 Uber 的沙盒不可靠的问题吗?我在 2015 年 4 月使用 Ruby 开发了一个应用程序,沙盒运行良好。我认为这可能是我的 Swift 实现中的一些东西。

【问题讨论】:

  • 我花了一些时间阅读 NSURLRequests,默认策略是缓存它们。我想我需要将我的 appDelegate 中的策略更新为NSURLRequestReloadIgnoringLocalCacheData。如果它正在缓存请求,那将解释我在 Uber 的沙盒环境中看到的很多奇怪之处。我会试一试,会回来报告的。

标签: ios swift uber-api


【解决方案1】:

这是我的请求的缓存策略导致我看到我上面描述的不一致的响应。为了解决这个问题,我在请求中添加了ReloadIgnoringCacheData 的缓存策略。我现在可以将 Curl PUT 发送到 Uber 的沙箱,以更新乘车请求的状态,并且我的重复功能更新为正确的状态。

下面的完整请求:

class func rideStatus(uberRequestId:String, completion: (status: String) -> Void) {

  var status:String = ""

  let urlPath = "https://sandbox-api.uber.com/v1/requests/\(uberRequestId)"
  let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

  guard let endpoint = NSURL(string: urlPath) else { print("Error creating endpoint");return }
  let request = appDelegate.oauth.request(forURL: NSURL(string:urlPath)!)
  request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
  request.HTTPMethod = "GET"

  // Added this line to set request policy
  request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData

  NSURLSession.sharedSession().dataTaskWithRequest(request) { (data, response, error) -> Void in
    do {
        guard let dat = data else { throw JSONError.NoData }

        let result = try NSJSONSerialization.JSONObjectWithData(dat, options: NSJSONReadingOptions.MutableContainers)

        print(result)

        //set status
        status = result["status"] as! String

        print("found status...returning it back -> \(status)")
        completion(status: "\(status)")

    } catch let error as JSONError {
        print(error.rawValue)
        print("ERROR NEEDS TO BE HANDLED. NO RETURN FROM UBER API")
    } catch {
        print(error)
        print("ERROR NEEDS TO BE HANDLED. NO RETURN FROM UBER API")
    }
  }.resume()

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-21
    • 2016-10-12
    • 1970-01-01
    • 2017-01-02
    • 2015-08-03
    • 2015-01-03
    • 1970-01-01
    • 2016-09-22
    相关资源
    最近更新 更多