Потеря POST в форме PHP с запросом Objective-C (возможно, .htaccess)

1

Я пытаюсь отправить POST в Objective-C в PHP-скрипт, но $ _POST заканчивается пустым. Вот код Obj-C:

// Create the JSON object that describes the request
NSError *error;
NSDictionary *requestContents = @{
                                  @"action": @"X",
                                  @"distributor": @"Y"
                                  };

NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents
                                                      options:0
                                                        error:&error];

// Create a POST request with the receipt data.
NSURL *registryURL=[NSURL URLWithString:@"https://example.com/registry/"];
NSMutableURLRequest *registryRequest=[NSMutableURLRequest requestWithURL:registryURL];
[registryRequest setHTTPMethod:@"POST"];
[registryRequest setHTTPBody:requestData];

// Make a connection on a background queue.
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:registryRequest queue:queue
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
                           if (connectionError) {
                               /* ... Handle error ... */
                           } else {
                               NSError *error;
                               NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
                               if (!jsonResponse) { /* ... Handle error ...*/ }
                               /* ... Send a response back to the device ... */
                               NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]);
                           }
                       }];

Здесь находится.htaccess на сервере. Особо следует отметить, что я заставляю HTTP-запросы к HTTPS и, следовательно, потеряю POST при перенаправлении, но вышеприведенный код уже запрашивает HTTPS.

<ifModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

#Redirect HTTP to HTTPS
RewriteCond %{HTTP_HOST} !^example.com$ [NC]
RewriteRule ^(.*)$ https://example.com/$1 [L,R=301] 
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://example.com/$1 [R,L]

#
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !index

RewriteRule ^([^/\.]+)/?$ /index.php?urlseg1=$1 [L,QSA]
RewriteRule ^([^/\.]+)/([^/\.]+)/?$ /index.php?urlseg1=$1&urlseg2=$2 [L,QSA]
RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ /index.php?urlseg1=$1&urlseg2=$2&urlseg3=$3 [L,QSA]
RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ /index.php?urlseg1=$1&urlseg2=$2&urlseg3=$3&urlseg4=$4 [L,QSA]
RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ /index.php?urlseg1=$1&urlseg2=$2&urlseg3=$3&urlseg4=$4&urlseg5=$5 [L,QSA]

#RewriteRule (.*) index.php [L]
</ifModule>

Теперь в скрипте PHP $ _POST пуст. И независимо от того, какой метод я использую для печати заголовков запросов, POST - это просто MIA.

Я думаю, что либо код Obj-C неправильно выполняет запрос, либо.htaccess убивает его. Я не эксперт в mod_rewrite, поэтому, возможно, кто-то знает.

Цените любую помощь!

  • 0
    @Cristik Я не знаком с curl - какой будет команда (я предполагаю, что буду использовать Terminal.app)?
  • 0
    Когда вы запустили этот код, что было возвращено NSURLResponse , NSData и NSError ? Вы не должны пытаться угадать, что не так, но посмотрите на результат выполнения запроса и посмотрите, есть ли что-то, что освещает его. Кроме того, такие инструменты, как Чарльз , действительно полезны для просмотра запросов и ответов.
Теги:
.htaccess
post

1 ответ

1
Лучший ответ

Вы говорите, что подозреваете .htaccess, но здесь есть и другая проблема. Ваш код строит запрос POST, но тело запроса - JSON. Когда вы это сделаете, $_POST не будет заселен для вас. Если вы хотите использовать $_POST, подумайте о создании application/x-www-form-urlrequest. В этом случае вы установите HTTPBody следующим образом:

key1=value1&key2=value2

Например:

action=X&distributor=Y

Вы также можете настроить Content-Type заголовка HTTP как application/x-www-form-urlrequest. (Это технически не требуется, но хорошая практика - указать заголовок Content-Type соответствующий характеру тела запроса.)

Кроме того, если значения X и Y могут содержать символы, отличные от буквенно-цифровых символов (например, если они содержат пробел, знаки препинания или любые символы, отличные от ASCII), вам нужно будет уклоняться от этих значений. См. qaru.site/questions/615680/... например, о том, как вы можете это сделать в Objective-C.

В качестве альтернативы, если вы действительно хотите сделать запрос JSON (это нормально), вы просто не можете использовать $_POST на сервере, а скорее вручную получите тело запроса, а затем вызовите json_decode. Например, см. qaru.site/questions/9542564/....

Если вы не хотите заблудиться в сорняках надлежащей подготовки таких запросов, подумайте об использовании библиотеки AFNetworking, которая позаботится об этих деталях для вас.

  • 0
    Собираюсь попробовать это. Очень странно, так как код основан на примере Apple: developer.apple.com/library/mac/releasenotes/General/…
  • 0
    @ Edward - Да, нет ничего плохого в написании кода, который выдает запрос JSON, но это имеет смысл, только если вы делаете это в сочетании с веб-сервисом, который ожидал запрос JSON. Но если вы написали сервер, ожидающий разбора $_POST , это другой зверь. Кстати, этот код в этой статье очень старый (например, мы обычно больше не используем NSURLConnection , потому что теперь он устарел).
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню