Question

Ok, donc j'ai écrit une implémentation de l'API REST en utilisant mod_rewrite et PHP. Je suis d'accepter une chaîne de requête via le corps HTTP SUPPRIMER demandes (... de grognement collectif?). Les arguments sur la sagesse des deux déclarations précédentes mises à part, ce que j'ai trouvé que PHP ne parse pas automatiquement le corps de la requête des demandes SUPPRIMER (à savoir $ _POST est vide malgré chaîne de requête sous forme codée apparaissant dans le corps de la demande). Cela ne me surprend pas particulièrement. Ce que je ne trouve surprenant est que je suis incapable de trouver une fonction PHP intégré pour l'analyse d'une chaîne de requête ?? Ai-je tout simplement oublié quelque chose? Je peux faire quelque chose comme:

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

... il semble juste bizarre qu'il n'y aurait pas de PHP intégré pour gérer cela. De plus, je pense que je ne devrais pas être en utilisant htmlspecialcharacters et urldecode pour frotter les valeurs de forme codée ... il est un autre type de codage, mais je suis aussi avoir averti de la difficulté à laquelle la fonction PHP que je devrais utiliser pour décoder les données codées forme .

Toutes les suggestions seront appréciées.

Était-ce utile?

La solution

Il y a parse_str . mauvais nom, mais fait ce que vous voulez. Et remarquez qu'il ne retourne rien, le second argument est passé par référence.

Autres conseils

Il y a une fonction qui le fait - http://php.net/parse_str . Depuis PHP doit le faire pour lui-même, il n'y a aucune raison de ne pas ouvrir aussi pour une utilisation dans l'API.

  

analyse la chaîne en variables vides   parse_str (string $ str [, arr array & $])

     

str parse comme si elle était la requête   chaîne passée via une URL et jeux   variables dans la portée actuelle.

<?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 href="http://codepad.org/s4w6DSh9" rel="nofollow"> succions.

parse_str est très bien pour des choses simples, mais ce n'est pas la même chose que la manière de construire PHP de créer la variable magique $_GET. Pourquoi?!? Je n'ai aucune idée. J'ai développé ma propre version que je crois correspond à l'analyse syntaxique de PHP exactement (laissez-moi savoir si vous pouvez trouver des exemples qui montrent par ailleurs).

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

Vous pouvez utiliser la fonction parse_str :

parse_str($queryString, $args);

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

parse_url vous aidera à saisir la partie de la DOCUMENT_URI qui contient la requête réelle.

Vous pouvez ensuite passer cette section hors de parse_str pour extraire des éléments individuels de la requête.

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

Je l'ai construit une bibliothèque simple pour analyser la chaîne de requête pour filtrer, trier et sélectionner les champs pour mon repos api. une version naïve de OData. la chaîne de requête transformé à l'objet et ou des tableaux d'objets. par ex:

filtres

:

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

eq opérateurs disponibles, ne, gt, lt, comme, iLike, le, ge

$filtersResult = $parser->filters();

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

pour trier:

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

pour lecteur exportable:

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

; -)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top