Я пытаюсь отправить 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, поэтому, возможно, кто-то знает.
Цените любую помощь!
Вы говорите, что подозреваете .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, которая позаботится об этих деталях для вас.
$_POST
, это другой зверь. Кстати, этот код в этой статье очень старый (например, мы обычно больше не используем NSURLConnection
, потому что теперь он устарел).
NSURLResponse
,NSData
иNSError
? Вы не должны пытаться угадать, что не так, но посмотрите на результат выполнения запроса и посмотрите, есть ли что-то, что освещает его. Кроме того, такие инструменты, как Чарльз , действительно полезны для просмотра запросов и ответов.