`

Java模拟实现PHP中的http_build_query()方法

阅读更多
    最近调用一个第三方接口,生成签名的时候要使用到PHP中的http_build_query()方法,它的原话是这样写的 http_build_query数组形成GET形式的字符串

    这个签名是在http_build_query()这个方法执行完成后,附加了另外一个提供的字符串,之后进行MD5加密取得32位的值,在网上查找各种方法之后生成出来的签名都是错的。

    于是开始仔细研究http_build_query()这个方法,具体的过程大概是这样的:
    1、构造需要通过http_build_query()处理的带有特殊字符的字符串
    2、在PHP中调用http_build_query()方法处理该字符串
    3、将得到的字符串与原来的字符串进行比较,然后自己构造同样的字符传

    自己构造的过程就不赘述的,下面是实现方法:
	/**
	 * Java实现PHP中的http_build_query()效果
	 * @param array
	 *        key=value形式的二位数组
	 * @return
	 */
	public String http_build_query(Map<String ,String> array){
		String reString = null;
		//遍历数组形成akey=avalue&bkey=bvalue&ckey=cvalue形式的的字符串
		Iterator it = array.entrySet().iterator();  
		while (it.hasNext()){
			Map.Entry<String,String> entry =(Map.Entry) it.next();  
			String key = entry.getKey();  
			String value = entry.getValue();  
			reString += key+"="+value+"&";
		}
		reString = reString.substring(0, reString.length()-1);
		//将得到的字符串进行处理得到目标格式的字符串
		reString = java.net.URLEncoder.encode(reString);
		reString = reString.replace("%3D", "=").replace("%26", "&");
		return reString;
	}

    但是,马上问题来了,如果参数数组中有汉字的话java.net.URLEncoder.encode(String string)之后的串在两个不同的类中处理出
来的字符串竟然神奇的不一样,不一样,同样的字符串,在不同类的相同方法中处理过后竟然不一样,又开始一阵纠结,最后因为java.net.URLEncoder.encode(String string)已经被划线了,就想是不是这个问题,替换成现在推荐的方法java.net.URLEncoder.encode(String string ,String enc),ok,问题解决。附上最后的处理方法
	/**
	 * Java实现PHP中的http_build_query()效果
	 * @param array
	 *        key=value形式的二位数组
	 * @return
	 */
	public String http_build_query(Map<String ,String> array){
		String reString = null;
		//遍历数组形成akey=avalue&bkey=bvalue&ckey=cvalue形式的的字符串
		Iterator it = array.entrySet().iterator();  
		while (it.hasNext()){
			Map.Entry<String,String> entry =(Map.Entry) it.next();  
			String key = entry.getKey();  
			String value = entry.getValue();  
			reString += key+"="+value+"&";
		}
		reString = reString.substring(0, reString.length()-1);
		//将得到的字符串进行处理得到目标格式的字符串
		try {
			reString = java.net.URLEncoder.encode(reString,"utf-8");
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		reString = reString.replace("%3D", "=").replace("%26", "&");
		return reString;
	}


ok,总结完毕...暴露了我的小学作文水平
分享到:
评论

相关推荐

    http-build-query:js中php的http_build_query()

    从对象(JavaScript中php的http_build_query())生成URL编码的查询字符串。 安装: $ npm install http-build-query 用法: var httpBuildQuery = require ( 'http-build-query' ) ; // Simple using var obj = ...

    php中http_build_query 的一个问题

    在PHP编程中,`http_build_query` 是一个非常实用的函数,它用于将关联数组或者对象转换成HTTP查询字符串格式。这个函数对于处理POST请求的数据,尤其是与CURL库配合时,尤为关键。在给定的标题和描述中,提到了在...

    PHP使用http_build_query()构造URL字符串的方法

    本文实例讲述了PHP使用http_build_query()构造URL字符串的方法。分享给大家供大家参考,具体如下: 简单来说,http_build_query()就是将一个数组转换成url 问号?后面的参数字符串,并且会自动进行urlencode处理。 ...

    PHP函数http_build_query使用详解

    `http_build_query`是PHP内置的一个函数,用于将数组或者对象转换成URL编码的字符串,常用于构建HTTP请求的查询字符串。这个函数的核心作用在于它能够处理不同类型的数组,包括一维、多维以及对象,并将它们转换为...

    PHP用法http_build_query()构造URL字符串的方法_.docx

    `http_build_query()`是PHP中一个非常实用的函数,它用于将数组转换为URL编码的字符串,这在构建HTTP请求,特别是GET请求时非常有用。这个函数能够处理各种类型的数组结构,包括一维、多维以及混合索引和关联数组。 ...

    http_build_url, 为 http_build_url() 提供无需pecl_http的项目功能.zip

    http_build_url, 为 http_build_url() 提供无需pecl_http的项目功能 用于PHP的 http_build_url() 这个简单的库为 http_build_url() 插件提供了在没有的环境下的功能。 它的目的是模仿in函数的功能,并带有一套针对...

    http_build_url:PHP后备函数http_build_url()

    PHP后备函数http_build_url() 对于没有安装 pecl_http 包的服务器。 见 基于 pecl_http-1.7.6 的原始 C 代码 使用了 Sébastien Corne 的一些片段。 版本:1.7.6 作者:Ivan Tcholakov ,2014 许可证:MIT...

    Mobile_Token_3.0_KJava_Beta1_Build0044

    Mobile_Token_3.0_KJava_Beta1_Build0044.jar

    edem_coupling_build_fluentEDEM_EDEMFluent耦合UDF_EDEM_

    总的来说,"edem_coupling_build_fluentEDEM_EDEMFluent耦合UDF_EDEM_"是一个关于如何利用UDF将EDEM的颗粒模拟功能与FLUENT的流体模拟相结合的资源包,为研究和解决涉及颗粒与流体相互作用的复杂问题提供了强大的...

    gbase-connector-java-8.3.81.51_build50.0-bin.jar

    南大通用Gbase数据库jdbc连接驱动gbase-connector-java-8.3.81.51_build50.0-bin.jar

    CiscoPacketTracer800_Build212_64bit_setup-signed.rar

    Packet Tracer作为其教育工具,能帮助用户在不实际操作硬件的情况下,模拟各种网络场景,理解网络设备如何协同工作,以及如何配置这些设备以实现特定的网络功能。 压缩包内的唯一文件 "CiscoPacketTracer800_Build...

    DDPM_edem_coupling_build_EDEM2021_Fluent2021.zip

    标题“DDPM_edem_coupling_build_EDEM2021_Fluent2021.zip”和描述“DDPM_edem_coupling_build_EDEM2021_Fluent2021”涉及的关键技术是DDPM(Dusty Dusty Particle Method,尘埃颗粒方法)、EDEM(Eulerian-Dual ...

    vs_buildtools

    visual studio 2017 build tools,可代替vc++ 2015 buildtools,即替代visualcppbuildtools_full

    Java_Build0154_Unsign

    QQ2010_Java_Build0154_Unsign

    构建_定制_ FPGA _实现_私有化_ RapidWright_Build_Customized_

    构建_定制_ FPGA _实现_私有化_ RapidWright_Build_Customized_FPGA_Implementations_for_Vivado_RapidWright

    java代码模拟http上传文件_代码_类包

    在Java中,我们可以使用多种库来实现HTTP文件上传,例如Apache HttpClient或Java内置的HttpURLConnection。Apache HttpClient是一个强大的HTTP客户端库,提供了丰富的功能和更好的性能。而HttpURLConnection是Java...

    edem_coupling_build_EDEM2.7-2018+Fluent17.0-19.1.rar

    "edem_coupling_build_EDEM2.7-2018+Fluent17.0-19.1.rar"这个压缩包提供了EDEM 2.6至2018版本与Fluent 17.0至19.1版本之间的耦合接口,以及相关的使用教程,旨在帮助用户进行高效的数据交互和模拟分析。 首先,...

Global site tag (gtag.js) - Google Analytics