Статус запроса песочницы Uber API обновляется неправильно

Я создаю приложение для iOS с помощью Swift, которое использует конечную точку запроса на поездку Uber API. При использовании Sandbox у меня возникают проблемы с правильным изменением статуса запроса на поездку. Я попытался обновить его с помощью команды curl, которую Uber имеет в своих документах, и, похоже, 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";
  };
}

Теперь, когда запрос на поездку успешно отправлен, я вызываю функцию 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. Обратите внимание, что идентификатор запроса на поездку одинаков в обоих запросах. Я вызываю эту функцию с помощью NSTimer каждые 5 секунд, и ответ, который я продолжаю получать, такой же, как показано ниже, при каждом вызове. Кэширует ли 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 моей поездки. Однако я по-прежнему показываю processing в своей функции rideStatus. Единственный способ узнать, что это completed, — это перезапустить симулятор и сделать новый запрос на поездку POST, и я получу другой идентификатор запроса от Uber. Это мой завиток для обновления статуса:

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 года с использованием Ruby, и песочница работала очень хорошо. Я думаю, что это может быть что-то в моей реализации Swift.


person tylerSF    schedule 07.02.2016    source источник
comment
Я потратил некоторое время на чтение NSURLRequests, и политика по умолчанию заключается в их кэшировании. Я думаю, мне нужно обновить политику в моем appDelegate до NSURLRequestReloadIgnoringLocalCacheData. Если он кэширует запрос, это объясняет многие странности, которые я наблюдаю в песочнице Uber. Я собираюсь попробовать и отчитаюсь.   -  person tylerSF    schedule 08.02.2016


Ответы (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()

}
person tylerSF    schedule 11.02.2016