Я пытаюсь реализовать SmartyStreets API для проверки адреса: улица, город и штат через форму. Я реализовал без реализации AJAX, но когда я переключаюсь на реализацию AJAX. Это не работает? Я прочитал о необходимости использовать JSONP, но я не использую AJAX для POST напрямую в API SmartyStreets. Вместо этого я пишу в PHP-скрипт, который будет проверять. Я планирую сделать другие вещи, такие как кешировать запрос адреса и проверенный адрес в серверной части с ответом. Я создал ключ домена для доступа к API SmartyStreets, но я думаю, что он все еще не работает из-за политики CORS.
Это форма подтверждения моего адреса:
<div class="container">
<h2>Validate US address</h2>
<form role="form" id="myForm" action="post_without_curl2-INPUT.php" method="POST">
<div class="form-group">
<label for="street">street:</label>
<input type="text" class="form-control" id="street" name="street" placeholder="Enter street">
</div>
<div class="form-group">
<label for="city">city:</label>
<input type="text" class="form-control" id="city" name="city" placeholder="Enter city">
</div>
<div class="form-group">
<label for="state">state:</label>
<input type="text" class="form-control" id="state" name="state" placeholder="Enter state">
</div>
<!--<div class="checkbox">-->
<!--<label><input type="checkbox"> Remember me</label>-->
<!--</div>-->
<button type="submit" class="btn btn-default">Submit</button>
</form>
</div>
<!-- the result of the search will be rendered inside this div -->
<div id="result"></div>
<script>
// Attach a submit handler to the form
$( "#myForm" ).submit(function( event ) {
console.log("Submit form");
// Stop form from submitting normally
event.preventDefault();
// Send the data using post
var posting = $.post( "post_without_curl2-INPUT.php", $( "#myForm" ).serialize() );
// Put the results in a div
posting.done(function( data ) {
var content = $( data ).find( "#content" );
$( "#result" ).empty().append( content );
});
});
</script>
Это мой PHP-скрипт для AJAX POST, мой адрес:
<?php
// Your authentication ID/token (obtained in your SmartyStreets account)
$authId = urlencode("authID");
$authToken = urlencode("authToken");
// Your input to the API...
$addresses = array(
array(
"street" => $_POST['street'],
"city" => $_POST['city'],
"state" => $_POST['state'],
"candidates" => 1
);
// LiveAddress API expects JSON input by default, but you could send XML
// if you set the Content-Type header to "text/xml".
$post = json_encode($addresses);
// Create the stream context (like metadata)
$context = stream_context_create(
array(
"http" => array(
"method" => "POST",
"header" => "Content-Type: application/x-www-form-urlencoded\r\n"."Content-Length: ".strlen($post)."\r\n",
"content" => $post
)
)
);
// Do the request, and we'll time it just for kicks
$start = microtime(true);
$page = file_get_contents("https://api.smartystreets.com/street-address/?auth-id={$authId}&auth-token={$authToken}", false, $context);
$end = microtime(true);
//// Show results
echo "<pre>";
echo "<b>Round-trip time (including external latency):</b> ";
echo (($end - $start) * 1000)." ms<br><br><br>"; // Show result in milliseconds, not microseconds
print_r(json_decode($page));
echo "</pre>";
?>
Ваша проблема в этой строке JavaScript в вашем клиентском коде:
var content = $( data ).find( "#content" );
Похоже, что вы пытаетесь выполнить поиск потомков DOM по данным, которые возвращает API SmartyStreets. Это не будет работать. Из API возвращаются необработанные данные JSON. Это будет выглядеть так:
[{"input_index":0,"candidate_index":0,"delivery_line_1":"1 Infinite Loop","last_line":"Cupertino CA 95014-2083","delivery_point_barcode":"950142083017","components":{"primary_number":"1","street_name":"Infinite","street_suffix":"Loop","city_name":"Cupertino","state_abbreviation":"CA","zipcode":"95014","plus4_code":"2083","delivery_point":"01","delivery_point_check_digit":"7"},"metadata":{"record_type":"S","zip_type":"Standard","county_fips":"06085","county_name":"Santa Clara","carrier_route":"C067","congressional_district":"18","rdi":"Commercial","elot_sequence":"0031","elot_sort":"A","latitude":37.33053,"longitude":-122.02887,"precision":"Zip9","time_zone":"Pacific","utc_offset":-8,"dst":true},"analysis":{"dpv_match_code":"Y","dpv_footnotes":"AABB","dpv_cmra":"N","dpv_vacant":"N","active":"Y"}}]
Или отформатирован с вашим print_r(json_decode($page));
Команда это будет выглядеть так:
Array
(
[0] => stdClass Object
(
[input_index] => 0
[candidate_index] => 0
[delivery_line_1] => 1 Infinite Loop
[last_line] => Cupertino CA 95014-2083
[delivery_point_barcode] => 950142083017
[components] => stdClass Object
(
[primary_number] => 1
[street_name] => Infinite
[street_suffix] => Loop
[city_name] => Cupertino
[state_abbreviation] => CA
[zipcode] => 95014
[plus4_code] => 2083
[delivery_point] => 01
[delivery_point_check_digit] => 7
)
[metadata] => stdClass Object
(
[record_type] => S
[zip_type] => Standard
[county_fips] => 06085
[county_name] => Santa Clara
[carrier_route] => C067
[congressional_district] => 18
[rdi] => Commercial
[elot_sequence] => 0031
[elot_sort] => A
[latitude] => 37.33053
[longitude] => -122.02887
[precision] => Zip9
[time_zone] => Pacific
[utc_offset] => -8
[dst] => 1
)
[analysis] => stdClass Object
(
[dpv_match_code] => Y
[dpv_footnotes] => AABB
[dpv_cmra] => N
[dpv_vacant] => N
[active] => Y
)
)
)
Как вы можете видеть, это не то, что вы можете использовать jQuery .find()
функция включена.
Ваш код уже работает правильно для того, что вы просите. Ваша форма отправляет в PHP-скрипт и возвращает ответ от SmartyStreets API.
Поздравляю. Теперь вам просто нужно обработать данные, которые возвращаются.
Могу ли я предложить вам начать с изменения этого:
var content = $( data ).find( "#content" );
$( "#result" ).empty().append( content );
К этому:
//var content = $( data ).find( "#content" );
$( "#result" ).empty().append( data );
Других решений пока нет …