Pregunta

Bueno, por lo que he escrito una implementación de la API REST utilizando mod_rewrite y PHP. Estoy aceptando una cadena de consulta a través del cuerpo de peticiones HTTP DELETE (... gemido colectivo?). Los argumentos acerca de la sabiduría de ambas declaraciones anteriores a un lado, lo que he encontrado es que PHP no analiza automáticamente el cuerpo de la petición de solicitudes eliminar (es decir, $ _POST está vacía a pesar de cadena de consulta forma codificada que aparece en el cuerpo de la solicitud). Este en particular no me sorprende. Lo que me pareció sorprendente fue que no he podido encontrar una función PHP incorporado para analizar una cadena de consulta ?? ¿He simplemente pasado por alto algo? Puedo hacer algo como:

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]));
  }
}

... sólo parece extraño que no habría un PHP integrado para manejar esto. Además, sospecho que no debería usar htmlspecialcharacters y urldecode a formar valores codificados de matorral ... es un tipo diferente de codificación, pero también estoy teniendo problemas para discernir qué función PHP que debería usar para decodificar los datos de forma codificados .

será apreciado cualquier sugerencia.

¿Fue útil?

Solución

Hay parse_str . Mal nombre, pero hace lo que quiere. Y el aviso de que no devuelve nada, el segundo argumento se pasa por referencia.

Otros consejos

Hay una función que lo hace - http://php.net/parse_str . A partir de PHP tiene que hacer esto por sí mismo, no hay razón para no abrirlo también para su uso en la API.

  

analiza la cadena en variables vacíos   parse_str (cadena $ cadena [, array & $ matriz])

     

str analiza sintácticamente como si se tratara de la consulta   cadena que se pasa a través de una URL y conjuntos   variables en el ámbito actual.

<?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 chupa .

parse_str está muy bien para cosas simples, pero no es lo mismo que forma integrada de PHP de crear la variable mágica $_GET. ¿¡¿Por qué?!? No tengo idea. He desarrollado mi propia versión que creo que coincide con el análisis de PHP exactamente (que me haga saber si se puede encontrar ejemplos que muestran lo contrario).

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() );
}

Puede utilizar el parse_str función :

parse_str($queryString, $args);

http://us2.php.net/manual/en /function.parse-url.php

parse_url le ayudará a agarrar la parte de la DOCUMENT_URI que contiene la consulta real.

A continuación, puede pasar a esa sección fuera a parse_str para extraer elementos individuales de la consulta.

http://us2.php.net/manual/en /function.parse-str.php

He construido una biblioteca fácil de analizar la cadena de consulta para filtrar, ordenar y seleccionar campos para mi API REST. una versión ingenua de odata. la cadena de consulta transformado en objeto y, o matrices de objetos. por ejemplo:

filtros:

www.example.com/resource?@filters=filedName operator 'the value'

disponibles operadores eq, ne, gt, lt, como, ilike, le, ge

$filtersResult = $parser->filters();

$filtersResult[0]->field // name
$filtersResult[0]->operator // eq
$filtersResult[0]->getOperator() // "="
$filtersResult[0]->value // 'what ever'

para ordenar:

//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

para incrustar:

@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);
}

; -)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top