URL 인코딩이없는 http_build_query ()
http_build_query()
일부 RFC 표준에 따라 URL 인코딩없이 사용할 수있는 방법이 있습니까?
내가 모든 것을 URL로 인코딩하고 싶지 않은 이유 : 나는 Ebay API를 쿼리하고있다. 쉼표가있는 한 URL 인코딩되지 않는 변수 이름을 주장한다. 예를 들어 DomainName (0)은 매개 변수이며 해당 괄호가 인코딩 쿼리가 실패합니다.
urldecode()
결과에서 함수를 사용할 수 있습니다.http_build_query()
아니요, 항상 인코딩하려는 시청 (이는 URL에 대한 매개 변수 목록을 사용할 때 URL 인코딩을 의미 함).
직접 만들 수 있습니다 ...
$params = array('a' => 'A', 'b' => 'B');
$paramsJoined = array();
foreach($params as $param => $value) {
$paramsJoined[] = "$param=$value";
}
$query = implode('&', $paramsJoined);
CodePad .
PHP 5.3.1 (버그 동작) http_build_query는 합니까 매개 변수를 결합하는 '&'앰퍼샌드 문자를 탈출. 예 : user_id=1&setting_id=2
.
PHP 5.4+ http_build_query 는 URL 변수를 연결하는 '&'앰퍼샌드 문자를 이스케이프하지 않습니다 . 예 :user_id=1&setting_id=2
예 :
$params = array(
'user_id' => '1',
'setting_id' => '2'
);
echo http_build_query($params);
// Output for PHP 5.3.1:
user_id=1&setting_id=2 // NOTICE THAT: '&' character is escaped
// Output for PHP 5.4.0+:
user_id=1&setting_id=2 // NOTICE THAT: '&' character is NOT escaped
여러 버전을 대상으로 할 때 솔루션
옵션 # 1 : 래퍼 함수 작성 :
/**
* This will work consistently and will never escape the '&' character
*/
function buildQuery($params) {
return http_build_query($params, '', '&');
}
옵션 # 2 : http_build_query 함수를 버리고 직접 작성하십시오.
대신 JSON API를 볼 수 있습니다. 작동하는 샘플을 획득했지만 앱 이름이 없어 결과를 확인할 수 없습니다. 코드는 다음과 가변적입니다.
<?php
$appName = "Your App Name Here";
$post_data = array(
'jsonns.xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
'jsonns.xs' => 'http://www.w3.org/2001/XMLSchema',
'jsonns.tns' => 'http://www.ebay.com/marketplace/search/v1/services',
'tns.findItemsByKeywordsRequest' => array(
'keywords' => 'harry potter pheonix'
)
);
$headers = array(
"X-EBAY-SOA-REQUEST-DATA-FORMAT: JSON",
"X-EBAY-SOA-RESPONSE-DATA-FORMAT: JSON",
"X-EBAY-SOA-OPERATION-NAME: findItemsByKeywords",
"X-EBAY-SOA-SECURITY-APPNAME: $appName"
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://svcs.ebay.com/services/search/FindingService/v1');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
if($result) {
$response = json_decode($result);
}
curl_close($ch);
?>
$appName
앱 이름이 무엇 이든 채워야 합니다. 또한 X-EBAY-SOA-OPERATION-NAME
실제 호출로 설정해야하며 호출이 다른 경우 JSON을 수정해야합니다.
http_build_query ()는 urlencoding없이 유효하지 않습니다. 실수로 이중 인코딩을 하시겠습니까? 예를 들어 다음 배열에 대한 http 쿼리를 작성해입니다.
$params = array('a' => 'a&b=b');
인코딩하지 말라
a=a&b=b
제대로 인코딩되면
a=a%26b%3Db
맞습니다. 인코딩을 건너 뛰는 경우 URL 삽입 공격을 피해야합니다.
urldecode () 사용할 수 있습니다 . 또는 $ arg_seperator를 인수 와 함께 http_build_query를 사용하십시오 .
$query_data= $data = array('bar', 'baz'=>'boom');
$numeric_prefix= 'test_';
$arg_separator = '&';
$http_query = http_build_query ( $query_data, $numeric_prefix, $arg_separator );
var_dump( $http_query );
위의 출력은
string 'test_0=bar&baz=boom' (length=19)
numeric_prefix : 배열 보안가 숫자 인 경우이 고급이 각 수준에 접두사로 추가됩니다. 이 경우 ' test_0 = bar' 입니다.
의 arg_seperator : 인수를 구분하는 데 사용됩니다. 비는 사용 PHP 주어지면 arg_separator.output difined에서의 php.ini 파일
알렉스의 대답에 대한 내 생각이지만 더 빠 사용.
$params = array('a' => 'A', 'b' => 'B');
$query = '';
foreach ($params as $param => $value) {
$query .= $param.'='.$value .'&';
}
echo substr($query, 0, -1);
이 또한 작동 할 수 있습니다.
$fields = array(
'a' => 'A',
'b' => 'B'
);
$separator = '';
foreach($fields as $key=>$value) {
$fields_string .= $separator . $key . '=' . $value;
$separator = '&';
}
나는 최근에 시도했다 https://gist.github.com/marcocesarato/4293986fe93139f04d8269aa3fbd47e9 차이점은이 함수가 배열 재귀 및 PHP4와 모든 것입니다. 여기서 urlencode를 관리 할 수 있습니다.
<?php
/**
* Build URL query params
* as http_build_query build a query url the difference is
* that this function is array recursive and compatible with PHP4
*
* @author Marco Cesarato <cesarato.developer@gmail.com>
* @param $query
* @param string $parent
* @return string
*
* @example
* $p = array('abbreviations' => array('google' => 'ggle', 'facebook' => array('abb_key' => 'fbook', 'fcbk')), 'key' => 'value');
* echo url_build_query($p);
*/
function url_build_query($query, $parent = null){
$query_array = array();
foreach($query as $key => $value){
$_key = empty($parent) ? urlencode($key) : $parent . '[' . urlencode($key) . ']';
if(is_array($value)) {
$query_array[] = url_build_query($value, $_key);
} else {
$query_array[] = $_key . '=' . urlencode($value);
}
}
return implode('&', $query_array);
}
나는 다음과 같은 URL 끝에 첨부하기 위해 GET을 만들려고했습니다.
$get_params = array(
'include' => array(
'enrollments',
'current_grading_period_scores'
),
'enrollment_type' => array(
'student',
),
);
$get_params = http_build_query($get_params);
$get_params = urldecode($get_params);
$url = $domain.$slug;
$url = $url.'?'.$get_params;
echo $url;
출력되는
include[0]=enrollments&include[1]=current_grading_period_scores&enrollment_type[0]=student
하지만 내 API는 대괄호 안의 숫자가 마음에 들지 갑자기 기 때문에 숫자를 제거하는 정규식을 찾았습니다.
preg_replace('/[[0-9]+]/', '[]', $get_params);
최종 코드와 결과-
$get_params = array(
'include' => array(
'enrollments',
'current_grading_period_scores'
),
'enrollment_type' => array(
'student',
),
);
$get_params = http_build_query($get_params);
$get_params = urldecode($get_params);
$get_params = preg_replace('/[[0-9]+]/', '[]', $get_params);
$url = $domain.$slug;
$url = $url.'?'.$get_params;
echo $url;
인쇄-
include[]=enrollments&include[]=current_grading_period_scores&enrollment_type[]=student
누군가가 더 나은 정규식을 알고 있으면 좋다. 나는 항상 멍청한 사람입니다.
참고 URL : https://stackoverflow.com/questions/6132721/http-build-query-without-url-encoding
'ProgramingTip' 카테고리의 다른 글
PHP에서 슈퍼를 호출하는 방법? (0) | 2020.12.10 |
---|---|
웹 페이지를 인쇄 할 때 페이지 제목 및 날짜 제거 (CSS 사용?) (0) | 2020.12.10 |
자바에서 무작위 선택 (0) | 2020.12.10 |
C ++의 base64 사용량 스 니펫 (0) | 2020.12.09 |
a = (a + b)-(b = a) 두 정수를 바꾸는 데 왜 나쁜 선택입니까? (0) | 2020.12.09 |