Exigence : Vérifiez si l'adresse de livraison est en dehors de la plage de livraison
Important :
L'idée de cette exigence est d'obtenir la longitude et la latitude du vendeur et du vendeur grâce à leurs informations d'adresse spécifiques. À ce stade, vous pouvez utiliser celles de Baidu. "Service de géocodage" ", vous pouvez obtenir la longitude et la latitude correspondantes. La deuxième étape consiste à envoyer la longitude et la latitude des deux selon les exigences de l'interface Baidu, et vous pouvez obtenir la chaîne JSON contenant la distance entre les deux . À ce stade, vous pouvez obtenir la distance en analysant le JSON. Enfin, après avoir jugé la distance, comparez-la avec la distance de votre propre livraison, vous pouvez juger si la distance est dépassée
Lors de la création d'une application :Pour cela exigence, deux interfaces Baidu sont utilisées. Les adresses d'interface sont les suivantes : Service de géocodage : https://lbsyun.baidu.com/index php?title=webapi/guide/webservice-geocodinghttps://lbsyun. .baidu.com/index.php?title=webapi/directionlite-v1Écriture de code :1. Configurer les propriétés de baseType : Sélectionnez le serveur
Liste blanche IP : 0.0.0.0/0
sky: baidumap: shop-address: 北京市西城区广安门内大街167号翔达大厦1层 ak: XXXXXXXXXXXXXXXXXXXXXXXXXX default-distance: 5000 // 这里在本文中没有使用,Utiliser la description de la classe d'outils pour l'envoi de requêtes
Parce que maintenant nous devons envoyer des requêtes depuis le serveur, nous devons utiliser le petit framework HttpClient pour implémenter cette fonction. La classe d'outils suivante est une encapsulation de ce frameworkDéfinissez une classe Location pour stocker les informations de longitude et de latitude de l'adressepackage com.sky.utils; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.apache.http.NameValuePair; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.utils.URIBuilder; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import org.springframework.stereotype.Service; import java.io.IOException; import java.net.URI; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * Http工具类 */ @Slf4j public class HttpClientUtil { static final int TIMEOUT_MSEC = 5 * 1000; /** * 发送GET方式请求 * * @param url * @param paramMap * @return */ public static String doGet(String url, Map<String, String> paramMap) { // 创建Httpclient对象 CloseableHttpClient httpClient = HttpClients.createDefault(); String result = ""; CloseableHttpResponse response = null; try { URIBuilder builder = new URIBuilder(url); if (paramMap != null) { for (String key : paramMap.keySet()) { builder.addParameter(key, paramMap.get(key)); } } URI uri = builder.build(); log.info("发送的请求====>{}", uri); //创建GET请求 HttpGet httpGet = new HttpGet(uri); //发送请求 response = httpClient.execute(httpGet); //判断响应状态 if (response.getStatusLine().getStatusCode() == 200) { result = EntityUtils.toString(response.getEntity(), "UTF-8"); } } catch (Exception e) { e.printStackTrace(); } finally { try { response.close(); httpClient.close(); } catch (IOException e) { e.printStackTrace(); } } return result; } /** * 发送POST方式请求 * * @param url * @param paramMap * @return * @throws IOException */ public static String doPost(String url, Map<String, String> paramMap) throws IOException { // 创建Httpclient对象 CloseableHttpClient httpClient = HttpClients.createDefault(); CloseableHttpResponse response = null; String resultString = ""; try { // 创建Http Post请求 HttpPost httpPost = new HttpPost(url); // 创建参数列表 if (paramMap != null) { List<NameValuePair> paramList = new ArrayList(); for (Map.Entry<String, String> param : paramMap.entrySet()) { paramList.add(new BasicNameValuePair(param.getKey(), param.getValue())); } // 模拟表单 UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList); httpPost.setEntity(entity); } httpPost.setConfig(builderRequestConfig()); // 执行http请求 response = httpClient.execute(httpPost); resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); } catch (Exception e) { throw e; } finally { try { response.close(); } catch (IOException e) { e.printStackTrace(); } } return resultString; } /** * 发送POST方式请求 * * @param url * @param paramMap * @return * @throws IOException */ public static String doPost4Json(String url, Map<String, String> paramMap) throws IOException { // 创建Httpclient对象 CloseableHttpClient httpClient = HttpClients.createDefault(); CloseableHttpResponse response = null; String resultString = ""; try { // 创建Http Post请求 HttpPost httpPost = new HttpPost(url); if (paramMap != null) { //构造json格式数据 JSONObject jsonObject = new JSONObject(); for (Map.Entry<String, String> param : paramMap.entrySet()) { jsonObject.put(param.getKey(), param.getValue()); } StringEntity entity = new StringEntity(jsonObject.toString(), "utf-8"); //设置请求编码 entity.setContentEncoding("utf-8"); //设置数据类型 entity.setContentType("application/json"); httpPost.setEntity(entity); } httpPost.setConfig(builderRequestConfig()); // 执行http请求 response = httpClient.execute(httpPost); resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); } catch (Exception e) { throw e; } finally { try { response.close(); } catch (IOException e) { e.printStackTrace(); } } return resultString; } private static RequestConfig builderRequestConfig() { return RequestConfig.custom() .setConnectTimeout(TIMEOUT_MSEC) .setConnectionRequestTimeout(TIMEOUT_MSEC) .setSocketTimeout(TIMEOUT_MSEC).build(); } }
package com.sky.entity; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; /** * @author : Cookie * date : 2023/4/20 9:20 * explain : */ @Data @Builder @NoArgsConstructor @AllArgsConstructor public class Location { /** * 纬度值 */ private double lat; /** * 经度值 */ private double lng; }Personnalisez un classe d'outils pour encapsuler la requête dans l'interface Baidu, afin qu'elle puisse être appelée directement dans la couche Service à l'avenir.
Remarque : parce que la barre d'outils est Il peut y avoir de nombreux endroits inappropriés dans ce que j'ai écrit si vous en trouvez. , veuillez les signalerDe plus, certaines classes d'exception sont également personnalisées. Sinon, remplacez-la simplement par RuntimeExceptionÀ ce stade, vous pouvez la transmettre en appelant la classe d'outilspackage com.sky.utils; import com.sky.entity.Location; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.json.JSONException; import org.json.JSONObject; import org.springframework.beans.factory.annotation.Value; import java.util.HashMap; /** * @author : Cookie * date : 2023/4/19 23:10 * explain : */ @AllArgsConstructor @NoArgsConstructor @Data @Slf4j public class BaiduMapUtil { // 获取配置类中的值 @Value("${sky.baidumap.shop-address}") private String myShopAddress; @Value("${sky.baidumap.ak}") private String ak; /** * 获取经纬度 * * @param userAddress * @return */ public Location getLocation(String userAddress) { String URL = "https://api.map.baidu.com/geocoding/v3"; HashMap<String, String> map = new HashMap<>(); map.put("address", userAddress); map.put("output", "json"); map.put("ak", ak); String body = HttpClientUtil.doGet(URL, map); Location location = new Location(); try { JSONObject jsonObject = new JSONObject(body); // 获取Status String status = jsonObject.getString("status"); if ("0".equals(status)) { // 解析JSON JSONObject res = jsonObject.getJSONObject("result").getJSONObject("location"); // 获取经度 String lng = res.getString("lng"); Double transferLnf = Double.parseDouble(lng); location.setLng(transferLnf); // 获取纬度 String lat = res.getString("lat"); Double transferLat = Double.parseDouble(lat); location.setLat(transferLat); } else { // 如果没有返回排除异常交给全局异常处理 throw new RuntimeException("无权限"); } } catch (Exception e) { log.info("解析JSON异常,异常信息{}", e.getMessage()); } return location; } /** * 通过两个经纬度信息判断,返回距离信息 * * @return 二者的距离 */ public String getDistance(Location userLocation) { Location myShopLocation = getLocation(myShopAddress); // 起始位置, 即我的位置 String origin = myShopLocation.getLat() + "," + myShopLocation.getLng(); // 最终位置, 即终点 String destination = userLocation.getLat() + "," + userLocation.getLng(); String url = "https://api.map.baidu.com/directionlite/v1/riding"; // 发送Get请求 HashMap<String, String> map = new HashMap<>(); map.put("origin", origin); map.put("destination", destination); map.put("ak", ak); map.put("steps_info", "0"); String result = HttpClientUtil.doGet(url, map); String distance = null; try { JSONObject jsonObject = new JSONObject(result); distance = jsonObject.getJSONObject("result").getJSONArray("routes").getJSONObject(0).getString("distance"); } catch (JSONException e) { log.info("路径异常"); } log.info("二者距离{}", distance); return distance; } }
Méthode pour obtenir la méthode. distance entre les deux.userAddress
用户的地址, 因为商家的地址已经配置,此时就可以通过调用getDistance
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!