Хорошо, поэтому я написал реализацию REST API с помощью mod_rewrite и PHP. Я принимаю строку запроса через тело запросов HTTP DELETE (… коллективный стон?). Аргументы относительно мудрости обоих предыдущих утверждений в стороне, я обнаружил, что PHP не автоматически анализирует тело запроса запросов DELETE (т.е. $ _POST пуст, несмотря на строку запроса в форме запроса, которая появляется в теле запроса). Меня это не удивило. То, что я действительно удивительно, было то, что мне не удалось найти встроенную функцию PHP для синтаксического анализа строки запроса? Я что-то пропустил? Я могу сделать что-то вроде:
public function parseQS($queryString, &$postArray){ $queryArray = explode('&', $queryString); for($i = 0; $i < count($queryArray); $i++) { $thisElement = split('=', $queryArray[$i]); $postArray[$thisElement[0]] = htmlspecialchars(urldecode($thisElement[1])); } }
… просто странно, что для этого не было бы встроенного PHP-модуля. Кроме того, я подозреваю, что я не должен использовать htmlspecialcharacters & urldecode для очистки форм-кодированных значений … это другой вид кодирования, но у меня также есть проблемы с тем, какую функцию PHP я должен использовать для декодирования данных в форме ,
Любые предложения будут оценены.
Там parse_str . Плохое имя, но делает то, что вы хотите. И обратите внимание, что он ничего не возвращает, второй аргумент передается по ссылке.
Есть функция, которая делает это – http://php.net/parse_str . Поскольку PHP должен делать это сам по себе, нет причин не открывать его для использования в API.
Разбирает строку в переменные void parse_str (строка $ str [, array & $ arr])
Parses str, как будто строка запроса передается через URL-адрес и устанавливает переменные в текущей области.
<?php $str = "first=value&arr[]=foo+bar&arr[]=baz"; parse_str($str, $output); echo $output['first']; // value echo $output['arr'][0]; // foo bar echo $output['arr'][1]; // baz
parse_str
отстой . parse_str
отлично подходит для простых вещей, но это не то же самое, что встроенный способ создания магической переменной $_GET
. Зачем?!? Понятия не имею. Я разработал свою собственную версию, которая, как мне кажется, соответствует точному анализу PHP (дайте мне знать, можете ли вы найти примеры, которые показывают иначе).
function betterParseStr( $string ) { return array_reduce( explode( "&", $string ), function( $array, $string_piece ) { if( $string_piece === "" ) return $array; $equal_offset = strpos( $string_piece, "=" ); if( $equal_offset === FALSE ) { $key = urldecode( $string_piece ); $value = ""; } else { $key = urldecode( substr( $string_piece, 0, $equal_offset ) ); $value = urldecode( substr( $string_piece, $equal_offset + 1 ) ); } if( preg_match( "/^([^\[]*)\[([^\]]*)](.*)$/", $key, $matches ) ) { $key_path = array( $matches[1], $matches[2] ); $rest = $matches[3]; while( preg_match( "/^\[([^\]]*)](.*)$/", $rest, $matches ) ) { $key_path[] = $matches[1]; $rest = $matches[2]; } } else { //replace first [ for _ //why?!? idk ask PHP it does //Example: ?key[[=value -> array( "key_[" => "value" ) $key_path = array( preg_replace('/\[/', '_', $key, 1 ) ); } if( strlen( $key_path[0] ) > 0 && substr( $key_path[0], 0, 1 ) !== "[" ) { $current_node = &$array; $last_key = array_pop( $key_path ); $resolve_key = function( $key, array $array ) { if( $key === "" || $key === " " ) { $int_array = array_filter( array_keys( $array ), function( $key ) { return is_int( $key ); } ); $key = $int_array ? max( $int_array ) + 1 : 0; } return $key; }; foreach( $key_path as $key_path_piece ) { $key_path_piece = $resolve_key( $key_path_piece, $current_node ); if( ! array_key_exists( $key_path_piece, $current_node ) || ! is_array( $current_node[$key_path_piece] ) ) { $current_node[$key_path_piece] = array(); } $current_node = &$current_node[$key_path_piece]; } $current_node[$resolve_key( $last_key, $current_node )] = $value; } return $array; }, array() ); }
http://us2.php.net/manual/en/function.parse-url.php
parse_url поможет вам захватить часть DOCUMENT_URI, содержащую фактический запрос.
Затем вы можете передать этот раздел в parse_str для извлечения отдельных элементов из запроса.
Вы можете использовать функцию parse_str
:
parse_str($queryString, $args);
Я построил простую библиотеку для синтаксического анализа строки запроса для фильтрации, сортировки и выбора полей для моего отдыха api. наивный вариант одаты. строка запроса преобразуется в объект и / или массивы объектов. например:
фильтры:
www.example.com/resource?@filters=filedName operator 'the value'
доступные операторы eq, ne, gt, lt, like, ilike, le, ge
$filtersResult = $parser->filters(); $filtersResult[0]->field // name $filtersResult[0]->operator // eq $filtersResult[0]->getOperator() // "=" $filtersResult[0]->value // 'what ever'
Сортировать :
//name is asc , surname desc @orderby=name,-surname $sorts = $parser->orderBy() // you can set defaults if u want $sorts[0]->filed //name $sorts[0]->direction //asc $sorts[1]->filed //surname $sorts[1]->direction //desc
для вставки:
@embed=resourceOne(@fields=name,code)(@filters=nameembed eq 'what ever'),mobiles(@orderby=sortFieldOne) $embedResult = $parser->embed(); //return array of embed each //object contains filters , sort , fields | empty array $embedResult[0]->resource // resourceOne $embedResult[0]->fields // array of fields [name,code] $embedResult[0]->filters // array of filters or empty array $embedResult[1]->resource // mobiles $embedResult[1]->orderBy // array of order by objects
easyparser
public function parseQS($queryString, &$postArray){ parse_str($queryString, $postArray); }
😉