NSURLRequest: Как обрабатывать перенаправленные сообщения?

У меня есть испытанное и проверенное использование реализации NSURLRequest (и сопровождения), которая отлично работает для GET и POST для заданного URL-адреса.

Однако теперь я хочу переместить цель URL-адреса без изменения URL-адреса, используемого приложением, поэтому я намерен использовать перенаправление веб-магазина через моего провайдера DNS.

Это прекрасно работает для запросов GET, но запросы POST просто зависают... ответ соединения не получен.

Соответствующий метод iOS для обработки перенаправления:

-(NSURLRequest *)connection:(NSURLConnection *)connection
    willSendRequest:(NSURLRequest *)request
    redirectResponse:(NSURLResponse *)redirectResponse

Согласно документации Apple для ( обработка перенаправлений),

Если делегат не реализует connection:willSendRequest:redirectResponse:, все разрешены канонические изменения и перенаправления серверов.

Ну, это не мой опыт, потому что отказ от этого метода не работает для меня.Запрос просто висит без ответа.

Apple также предлагает реализацию willSendRequest (см. выше связанную документацию Apple), опять же, это не работает для меня. Я вижу вызовы, но результирующие запросы просто зависают.

Моя текущая реализация willSendRequest выглядит следующим образом (см. ниже). Это следует за перенаправлением, но обрабатывает запрос, как если бы это был GET, а не POST.

Я полагаю, что проблема в том, что перенаправление упускает из виду тот факт, что HTTP-запрос является POST-запросом (могут быть и другие проблемы, например перенос тела запроса?).

Я не знаю, что мне здесь делать. Поэтому любые советы о том, как правильно обрабатывать POST, который получает перенаправление, будут оценены. Спасибо.

-(NSURLRequest *)connection:(NSURLConnection *)connection
   willSendRequest:(NSURLRequest *)request
  redirectResponse:(NSURLResponse *)redirectResponse
{

    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) redirectResponse;

    int statusCode = [httpResponse statusCode];


    NSLog (@"HTTP status %d", statusCode);

    // http statuscodes between 300 & 400 is a redirect ...
    if (httpResponse && statusCode >= 300 && statusCode < 400)
    {
        NSLog(@"willSendRequest (from %@ to %@)", redirectResponse.URL, request.URL);
    }

    if (redirectResponse)
    {
        NSMutableURLRequest *newRequest = [request mutableCopy]; // original request

       [newRequest setURL: [request URL]];

       NSLog (@"redirected");

       return newRequest;
    }
    else
    {
        NSLog (@"original");

       return request;
    }
}

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ 1

HTTP-код, полученный командой willSendRequest: 301 — «Перемещено навсегда.

Используя allHTTPHeaderFields для извлечения полей заголовка, я вижу, что запрос, который я первоначально отправил, имеет заголовок

HTTP header {
  "Content-Length" = 244;
  "Content-Type" = "application/json";
}

... и скопированный/перенаправленный запрос имеет заголовок,

Redirect HTTP header {
  Accept = "*/*";
  "Accept-Encoding" = "gzip, deflate";
  "Accept-Language" = "en-us";
  "Content-Type" = "application/json";
}

... что не похоже на копия исходного запроса или даже надмножество.

10
задан Cœur 25 March 2019 в 15:26
поделиться