Данные URLSession.shared.dataTask всегда пусты при обращении к конечной точке экспресс-узла - PullRequest
0 голосов
/ 25 октября 2018

У меня есть простая конечная точка Node Express, которую я могу успешно использовать с помощью curl:

curl --header "Content-Type: application/json" \
  --request POST \
  --data '{"lat":33.485834000000001,"long":-100.106417}' \
  http://192.168.99.100:49160/login
{"status":200,"data":{"userId":"bff37d9c-25a9-421b-aa58-eba0fef0da03"},"message":null}

Однако, когда я пытаюсь достичь той же конечной точки, но используя Swift 4, со следующим:

let task = URLSession.shared.dataTask(with: urlRequest) { data, response, error in
            guard let serverData = data, error == nil else {
                handler(ResponseBuilder().set(error: ErrorType.network).build())

                return
            }

           // Process data.
        }
        task.resume()

В «данных», которые мне возвращает URLSession, ничего нет.Я ожидаю, что данные содержат то же значение, что и curl, возвращенный выше.

'Ответ' заполняется так, как я ожидал:

Optional<NSURLResponse>
  - some : <NSHTTPURLResponse: 0x600000a1a5a0> { URL: http://192.168.99.100:49160/login } { Status Code: 200, Headers {
    Connection =     (
        "keep-alive"
    );
    "Content-Length" =     (
        86
    );
    "Content-Type" =     (
        "application/json; charset=utf-8"
    );
    Date =     (
        "Thu, 25 Oct 2018 05:51:39 GMT"
    );
    Etag =     (
        "W/\"56-8ZCdAcNDopMfakzfNDEniZ0fgoc\""
    );
    "X-Powered-By" =     (
        Express
    );
} }

'error' - это ноль, и я вижувойдя на сервер, чтобы указать, что его ударили, но данные все еще пусты.

Я запускаю свое приложение для iOS с использованием симулятора.

Я что-то упускаю здесь очевидное?

ОБНОВЛЕНИЕ 1

Чтобы ответить на некоторые из вопросов ниже.«urlRequest» создается следующим образом:

var urlRequest = URLRequest(url: request.url)
urlRequest.addValue("application/json", forHTTPHeaderField: "Content-Type")
urlRequest.addValue("application/json", forHTTPHeaderField: "Accept")
urlRequest.httpMethod = "POST"
urlRequest.httpBody = try? JSONSerialization.data(withJSONObject: request.data, options: .prettyPrinted)

, где «запрос» - это просто объект-оболочка, который я использую, и его содержимое:

Request
  ▿ url : http://192.168.99.100:49160/login
    - _url : http://192.168.99.100:49160/login
  ▿ data : 2 elements
    ▿ 0 : 2 elements
      - key : "lat"
      - value : 33.485834000000001
    ▿ 1 : 2 elements
      - key : "long"
      - value : -100.106417

ОБНОВЛЕНИЕ 3

Как кто-то предложил, я установил Charles Proxy.Вот результаты:

Запрос:

{
  "lat" : 33.485834000000001,
  "long" : -100.106417
}

Ответ:

{"status":200,"data":{"userId":"3d559555-c0ad-4e3a-a10b-3e267ee7f662"},"message":null}

1 Ответ

0 голосов
/ 10 июня 2019

Неудачный ответ, вероятно, заключается в том, что отладчик xcode ненадежен в этой ситуации (обработчик завершения в контексте URLSession) - он всегда показывает данные как имеющие 0 байтов.

Распечатайте данные, используя:

let received = String(data: data!, encoding: String.Encoding.utf8)
print("\(received)")

или

let resultObject = try JSONSerialization.jsonObject(with: data!, options: [.allowFragments,])
print("\(resultObject)")

, старайтесь не напрягать шею от слишком сильного покачивания головой ...

...