• 关于

    json_decode_null

    的搜索结果

问题

php中url接收的json数据,json_decode为空

php后台json数据decode为结果空# 我使用手机传输数据到php后台,json_decode的结果为空。手机传输的方式为POST/GET,编码格式为UTF-8。json数据为(包括代码中的单引号,我用字符串传输,json数据中必须为...
杨冬芳 2019-12-01 20:18:43 1369 浏览量 回答数 1

回答

例子,你参考一下一、json_encode() <?php $arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5); echo json_encode($arr); ?> 输出 {"a":1,"b":2,"c":3,"d":4,"e":5} 再看一个对象转换的例子: $obj->body = 'another post'; $obj->id = 21; $obj->approved = true; $obj->favorite_count = 1; $obj->status = NULL; echo json_encode($obj); 输出 {    "body":"another post",    "id":21,    "approved":true,    "favorite_count":1,    "status":null  } 由于json只接受utf-8编码的字符,所以json_encode()的参数必须是utf-8编码,否则会得到空字符或者null。当中文使用GB2312编码,或者外文使用ISO-8859-1编码的时候,这一点要特别注意。 二、索引数组和关联数组 PHP支持两种数组,一种是只保存"值"(value)的索引数组(indexed array),另一种是保存"名值对"(name/value)的关联数组(associative array)。 由于javascript不支持关联数组,所以json_encode()只将索引数组(indexed array)转为数组格式,而将关联数组(associative array)转为对象格式。 比如,现在有一个索引数组 $arr = Array('one', 'two', 'three'); echo json_encode($arr); 输出 ["one","two","three"] $arr = Array('1'=>'one', '2'=>'two', '3'=>'three'); echo json_encode($arr); 输出变为 {"1":"one","2":"two","3":"three"} 注意,数据格式从"[]"(数组)变成了"{}"(对象)。 如果你需要将"索引数组"强制转化成"对象",可以这样写 json_encode( (object)$arr ); 或者 json_encode ( $arr, JSON_FORCE_OBJECT ); 三、类(class)的转换 下面是一个PHP的类: class Foo {   const ERROR_CODE = '404';   public $public_ex = 'this is public';   private $private_ex = 'this is private!';   protected $protected_ex = 'this should be protected';   public function getErrorCode() {     return self::ERROR_CODE;   } } 现在,对这个类的实例进行json转换: $foo = new Foo; $foo_json = json_encode($foo); echo $foo_json; 输出结果是 {"public_ex":"this is public"} 可以看到,除了公开变量(public),其他东西(常量、私有变量、方法等等)都遗失了。 四、json_decode() 该函数用于将json文本转换为相应的PHP数据结构。下面是一个例子: $json = '{"foo": 12345}'; $obj = json_decode($json); print $obj->{'foo'}; // 12345 通常情况下,json_decode()总是返回一个PHP对象,而不是数组。比如: $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}'; var_dump(json_decode($json)); 结果就是生成一个PHP对象: object(stdClass)#1 (5) {   ["a"] => int(1)   ["b"] => int(2)   ["c"] => int(3)   ["d"] => int(4)   ["e"] => int(5) } 如果想要强制生成PHP关联数组,json_decode()需要加一个参数true: $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';   var_dump(json_decode($json,true)); 结果就生成了一个关联数组: array(5) {   ["a"] => int(1)   ["b"] => int(2)   ["c"] => int(3)   ["d"] => int(4)   ["e"] => int(5) } 五、json_decode()的常见错误 下面三种json写法都是错的,你能看出错在哪里吗? $bad_json = "{ 'bar': 'baz' }"; $bad_json = '{ bar: "baz" }'; $bad_json = '{ "bar": "baz", }'; 对这三个字符串执行json_decode()都将返回null,并且报错。 第一个的错误是,json的分隔符(delimiter)只允许使用双引号,不能使用单引号。第二个的错误是,json名值对的"名"(冒号左边的部分),任何情况下都必须使用双引号。第三个的错误是,最后一个值之后不能添加逗号(trailing comma)。 另外,json只能用来表示对象(object)和数组(array),如果对一个字符串或数值使用json_decode(),将会返回null。ar_dump(json_decode("Hello World")); //null
小旋风柴进 2019-12-02 02:01:02 0 浏览量 回答数 0

问题

extjs 报错You're trying to decode and invalid JSON

IE报错:You're trying to decode and invalid JSON String: {"ganttTask":{"baseline_end_date":null,"baseline_start_date":null,...
杨冬芳 2019-12-01 20:17:31 2467 浏览量 回答数 1

万券齐发助力企业上云,爆款产品低至2.2折起!

限量神券最高减1000,抢完即止!云服务器ECS新用户首购低至0.95折!

回答

您好,group by 后面要把分组字段都要跟上,您表达coalesce(sum(regexp_count(get_json_object(extended_x, '$.table.tableParties'), '{')), decode(get_json_object(extended_x, '$.table'), NULL, 0, 1)) as tableparty , decode(sum(headcount),null,0,sum(headcount) ) as headcount返回值实际上也是字段,需要把整个表达式写在group by 后面
123ya 2019-12-01 23:57:22 0 浏览量 回答数 0

问题

使用coalesce函数只要超过一个expression,就会报错

使用coalesce函数只要超过一个expression,就会报错:FAILED: ODPS-0130071:Semantic analysis exception - Expression not in GROUP BY key : li...
123ya 2019-12-01 20:11:47 3892 浏览量 回答数 1

回答

你的json文件有bom头, $json = file_get_contents('Qcode.json'); $arr = json_decode(trim($json, chr(239) . chr(187) . chr(191)), true); $temp = array_column($arr, 'dkey', 'dvalue'); echo $temp['A05']; if (! function_exists('array_column')) { function array_column(array $input, $columnKey, $indexKey = null) { $array = array(); foreach ($input as $value) { if (! isset($value[$columnKey])) { trigger_error("Key \"$columnKey\" does not exist in array"); return false; } if (is_null($indexKey)) { $array[] = $value[$columnKey]; } else { if (! isset($value[$indexKey])) { trigger_error("Key \"$indexKey\" does not exist in array"); return false; } if (! is_scalar($value[$indexKey])) { trigger_error("Key \"$indexKey\" does not contain scalar value"); return false; } $array[$value[$indexKey]] = $value[$columnKey]; } }
a123456678 2019-12-02 02:05:01 0 浏览量 回答数 0

问题

PHP 云解析 返回 JSON 操作问题

我通过阿里云解析API向服务器发达DescribeDomainRecords请求,返回JSON格式的数据。 现在我想操作其中的“RR”对应的数据,但总是出错。代码如下:$DNSlist = $this->DescribeDomain...
b1gmax 2019-12-01 20:21:53 1110 浏览量 回答数 1

问题

PHP的stdClass数组

我在将对象stdClass转换为数组时遇到问题。我已经尝试过这种方式: return (array) $booking; 要么 return (array) json_decode($booking,true); 要么 ...
保持可爱mmm 2020-01-16 17:12:05 1 浏览量 回答数 1

问题

PHP 云解析 返回 JSON 操作问题

我通过阿里云解析API向服务器发达DescribeDomainRecords请求,返回JSON格式的数据。 现在我想操作其中的“RR”对应的数据,但总是出错。 代码如下: $DNSlist &#...
b1gmax 2019-12-01 20:56:22 1450 浏览量 回答数 2

回答

请求错误码 错误定义 16进制错误值 10进制错误值 错误含义 ERROR_SERVER_NO_RESPONSE 20010001 536936449 服务器返回数据为空 ERROR_SERVER_WRONG_JSON 20010002 536936450 服务器返回数据不为json格式 ERROR_NO_MATCH_QUALITY 20010003 536936451 没有找到匹配的清晰度 ERROR_PLAYAUTH_WRONG 20010004 536936452 PlayAuth解析错误 ERROR_REQUEST_FAIL 20010005 536936453 请求失败 POP错误码 错误定义 16进制错误值 10进制错误值 错误含义 ERROR_SERVER_POP_UNKNOWN 20010100 536936704 POP未知错误。POP错误消息具体参见:错误码表 ERROR_SERVER_POP_MISSING_PARAMETER 20010101 536936705 缺少参数。 ERROR_SERVER_POP_INVALID_PARAMETER 20010102 536936706 参数无效。 ERROR_SERVER_POP_OPERATION_DENIED 20010103 536936707 账号未开通视频点播服务。 ERROR_SERVER_POP_OPERATION_SUSPENED 20010104 536936708 账号已欠费,请充值。 ERROR_SERVER_POP_FORBIDDEN 20010105 536936709 无权限执行该操作。 ERROR_SERVER_POP_INTERNAL_ERROR 20010106 536936710 后台发生未知错误。 ERROR_SERVER_POP_SERVICE_UNAVALIABLE 20010107 536936711 服务不可用。 ERROR_SERVER_POP_SIGNATUREANONCE_USED 20010108 536936712 签名已经被使用。 ERROR_SERVER_POP_SECURITYTOKEN_MAILFORMED 20010109 536936713 安全token不对。 ERROR_SERVER_POP_SECURITYTOKEN_MISMATCH_ACCESSKEY 2001010A 536936714 安全token与Accesskey不匹配。 ERROR_SERVER_POP_SIGNATURE_NOT_MATCH 2001010B 536936715 签名校验不对。 ERROR_SERVER_POP_ACCESSKEYID_NOT_FOUND 2001010C 536936716 没有找到AccessKeyId。 ERROR_SERVER_POP_TOKEN_EXPIRED 2001010D 536936717 Token过期。 点播错误码 错误定义 16进制错误值 10进制错误值 错误含义 ERROR_SERVER_VOD_UNKNOWN 20010200 536936960 VOD未知错误。点播服务错误。参见:获取视频播放地址 ERROR_SERVER_VOD_FORBIDDEN_ILLEGALSTATUS 20010201 536936961 视频状态无效 ERROR_SERVER_VOD_INVALIDVIDEO_NOTFOUND 20010202 536936962 视频不存在。 ERROR_SERVER_VOD_INVALIDVIDEO_NOSTREAM 20010203 536936963 根据您的筛选条件找不到可以播放的转码输出流 ERROR_SERVER_VOD_FORBIDDEN_ALIYUNVODENCRYPTION 20010204 536936964 当前仅存在阿里云视频加密的转码输出流,必须使用阿里云播放器进行播放或者设置请求参数ResultType值为Multiple。 ERROR_SERVER_VOD_INVALIDAUTH_MEDIAID 20010205 536936965 AuthInfo与vid不一致 ERROR_SERVER_VOD_INVALIDAUTHINFO_EXPIRETIME 20010206 536936966 AuthInfo过期 MPS 错误码 错误定义 16进制错误值 10进制错误值 错误含义 ERROR_SERVER_MPS_UNKNOWN 20010300 536937216 MPS未知错误 ERROR_SERVER_MPS_INVALID_MEDIAID 20010301 536937217 MediaId无效 ERROR_SERVER_MPS_INVALID_AUTHTIMEOUT 20010302 536937218 AuthTimeout无效 ERROR_SERVER_MPS_INVALID_FORMATS 20010303 536937219 Formats无效 ERROR_SERVER_MPS_INVALID_AUTHINFO 20010304 536937220 AuthInfo无效 ERROR_SERVER_MPS_SIGNATURE_CHECK_FAILED 20010305 536937221 签名校验失败 ERROR_SERVER_MPS_MEDIAID_NOT_EXIST 20010306 536937222 MediaId不存在 ERROR_SERVER_MPS_MEDIA_RESOURCE_NOT_EXIST 20010307 536937223 媒体资源不存在 ERROR_SERVER_MPS_MEDIA_NOT_PUBLISHED 20010308 536937224 媒体没有发布 ERROR_SERVER_MPS_MEDIA_NOT_ENCRYPTED 20010309 536937225 媒体没有加密 ERROR_SERVER_MPS_INVALID_CIPHERTEXTBLOB 2001030A 536937226 ciphertextblob无效 ERROR_SERVER_MPS_CIPHERBLOB_NOT_EXIST 2001030B 536937227 CipherTextBlob不存在 ERROR_SERVER_MPS_INTERNAL_ERROR 2001030C 536937228 服务器内部错误 ERROR_SERVER_MPS_INVALID_IDENTITY_NOT_ORDER_VIDEO_SERVICE 2001030D 536937229 请求标识不允许操作。 ERROR_SERVER_MPS_UPDATE_CDN_DOMAIN_CONFIGS_FAIL 2001030E 536937230 更新主机配置失败 ERROR_SERVER_MPS_AUTH_KEY_EXIST 2001030F 536937231 auth密钥已经存在。 ERROR_SERVER_MPS_AUTH_KEY_NOT_EXIST 20010310 536937232 auth密钥不存在。 ERROR_SERVER_MPS_INVALID_PARAMETER_OUT_OF_BOUND 20010311 536937233 参数超出范围 ERROR_SERVER_MPS_INVALID_PARAMETER 20010312 536937234 参数无效。 ERROR_SERVER_MPS_INVALID_PARAMETER_NULL_VALUE 20010313 536937235 参数不能为null ERROR_SERVER_MPS_INVALID_PARAMETER_EMPTY_VALUE 20010314 536937236 参数不能为空 ERROR_SERVER_MPS_MEDIA_RESOURCE_NOT_MATCH 20010315 536937237 媒体资源不匹配 ERROR_SERVER_MPS_MEDIA_NOT_FOUND_CIPHERTEXT 20010316 536937238 没有找到MediaId的密文资源。 ERROR_SERVER_MPS_INVALID_PARAMETER_RAND 20010317 536937239 指定的参数Rand无效。 ERROR_SERVER_MPS_REDIS_POOL_IS_EMPTY 20010318 536937240 缓存连接池为空 ERROR_SERVER_MPS_SIGNATURE_CHECK_MEDIA_FAILED 20010319 536937241 媒体id不匹配 ERROR_SERVER_MPS_SIGNATURE_CHECK_EXPIREDTIME_FAILED 2001031A 536937242 指定的到期时间值已过期。 ERROR_SERVER_MPS_INVALID_SESSION_TIME 2001031B 536937243 指定的参数SessionTime应该是>0 ERROR_SERVER_MPS_INVALID_END_USER_ID 2001031C 536937244 EndUserId长度不对 ERROR_SERVER_MPS_INVALID_URL 2001031D 536937245 指定的参数LicenseUrl格式不正确。 ERROR_SERVER_MPS_HTTP_REQUEST_FAILED 2001031E 536937246 请求失败 ERROR_SERVER_MPS_XML_FORMAT_ERROR 2001031F 536937247 xml格式出错 ERROR_SERVER_MPS_SESSION_NOT_EXIST 20010320 536937248 Session不存在 ERROR_SERVER_MPS_REGION_NOT_SUPPORTED_API 20010321 536937249 API不支持 ERROR_SERVER_MPS_DRM_NOT_ACTIVATED 20010322 536937250 此区域未激活DRM,请联系我们 ERROR_SERVER_MPS_DRM_AUTH_ERROR 20010323 536937251 DRM验证错误,请为此媒体添加授权 ERROR_SERVER_MPS_CDN_CONFIG_NOT_EXIST 20010324 536937252 oss域不存在cdn域配置 直播时移错误码 错误定义 16进制错误值 10进制错误值 错误含义 ERROR_SERVER_LIVESHIFT_UNKNOWN 20010400 536937472 时移未知错误 ERROR_SERVER_LIVESHIFT_REQUEST_ERROR 20010401 536937473 时移请求失败 ERROR_SERVER_LIVESHIFT_DATA_PARSER_ERROR 20010402 536937474 时移数据解析失败 私有加密错误码 错误定义 16进制错误值 10进制错误值 错误含义 ERROR_TBDRM_UNKNOWN 0x20012000 536944640 私有加密未知错误。 ERROR_TBDRM_DEMUXER_UNIMPLEMENTED 20012001 536944641 私有加密解封装未实现 ARTP错误码 错误定义 16进制错误值 10进制错误值 错误含义 ERROR_ARTP_UNKNOWN 0x20013000 536948736 Artp未知错误。 ERROR_ARTP_DEMUXER_UNIMPLEMENTED 0x20013001 536948737 Artp模块加载失败,请检查动态库。 ERROR_ARTP_LOAD_FAILED 0x20013002 536948738 Artp播放加载失败。 ERROR_ARTP_STREAM_ILLEGAL 0x20013003 536948739 Artp流地址非法。 ERROR_ARTP_STREAM_NOT_FOUND 0x20013004 536948740 Artp流不存在。 ERROR_ARTP_STREAM_STOPPED 0x20013005 536948741 Artp流已经断了。 ERROR_ARTP_PLAY_TIMEOUT 0x20013006 536948742 Artp起播超时。 ERROR_ARTP_SPSPPS_AACCONF_TIMEOUT 0x20013007 536948743 Artp SPS/PPS或AAC Conf接收超时。 ERROR_ARTP_ARTP_MEDIA_INFO_TIMEOUT 0x20013007 536948743 Artp SPS/PPS或AAC Conf接收超时。 ERROR_ARTP_PACKET_RECV_TIMEOUT 0x20013008 536948744 Artp接收音视频数据包超时。 ERROR_ARTP_MEDIA_PROBE_FAILED 0x20013009 536948745 Artp数据包连同性探测失败。 播放错误码 错误定义 16进制错误值 10进制错误值 错误含义 ERROR_UNKNOWN_ERROR 2001FFFF 537001983 未知错误 ERROR_DEMUXER_OPENURL 20030001 537067521 打开URL失败 ERROR_DEMUXER_NO_VALID_STREAM 20030002 537067522 无效的流 ERROR_DEMUXER_OPENSTREAM 20030003 537067523 打开流失败 ERROR_LOADING_TIMEOUT 20030004 537067524 加载超时 ERROR_DATASOURCE_EMPTYURL 20030005 537067525 数据源URL为空 ERROR_DECODE_VIDEO 20040001 537133057 视频解码失败 ERROR_DECODE_AUDIO 20040002 537133058 音频解码失败 ERROR_NETWORK_UNKNOWN 20050000 537198592 未知的网络错误 ERROR_NETWORK_UNSUPPORTED 20050001 537198593 协议不支持 ERROR_NETWORK_RESOLVE 20050002 537198594 不能解析域名 ERROR_NETWORK_CONNECT_TIMEOUT 20050003 537198595 网络连接超时 ERROR_NETWORK_COULD_NOT_CONNECT 20050004 537198596 无法连接到服务器 ERROR_NETWORK_HTTP_403 20050005 537198597 403错误 ERROR_NETWORK_HTTP_404 20050006 537198598 404错误 ERROR_NETWORK_HTTP_4XX 20050007 537198599 其他的4XX错误 ERROR_NETWORK_HTTP_5XX 20050008 537198600 5XX的服务器错误 ERROR_NETWORK_HTTP_RANGE 20050009 537198601 不支持range请求 ERROR_NETWORK_HTTP_400 2005000A 537198602 400错误 ERROR_CODEC_UNKNOWN 20060000 537264128 未知的解码错误 ERROR_CODEC_VIDEO_NOT_SUPPORT 20060001 537264129 视频编码格式不支持 ERROR_CODEC_AUDIO_NOT_SUPPORT 20060002 537264130 音频编码格式不支持 ERROR_GENERAL_UNKNOWN 20080000 537395200 标准错误 ERROR_GENERAL_EPERM 20080001 537395201 标准错误-1,操作不允许等。 ERROR_GENERAL_ENOENT 20080002 537395202 标准错误-2,文件不存在等。 ERROR_GENERAL_EIO 20080005 537395205 标准错误-5,IO错误等。 ERROR_UNKNOWN 0x2FFFFFFF 805306367 未知错误 下载错误码 错误定义 16进制错误值 10进制错误值 错误含义 DOWNLOAD_ERROR_NOT_SELECT_ITEM 30010000 805371904 没有选择下载项 DOWNLOAD_ERROR_NO_DOWNLOAD_ITEM 30010001 805371905 没有可用下载项 DOWNLOAD_ERROR_STS_SOURCE_NULL 30010002 805371906 没有设置Sts源 DOWNLOAD_ERROR_AUTH_SOURCE_NULL 30010003 805371907 没有设置Auth源 DOWNLOAD_ERROR_AUTH_SOURCE_WRONG 30010004 805371908 Auth格式不对 DOWNLOAD_ERROR_INVALID_ITEM 30010005 805371909 选中的下载项不对 DOWNLOAD_ERROR_URL_CANNOT_REACH 30010006 805371910 URL无法连接 DOWNLOAD_ERROR_NOT_SUPPORT_FORMAT 30010007 805371911 下载的格式不支持 DOWNLOAD_ERROR_ENCRYPT_FILE_NOT_MATCH 30010008 805371912 加密校验文件不匹配 DOWNLOAD_ERROR_DOWNLOAD_SWITCH_OFF 30010009 805371913 下载功能被关闭 DOWNLOAD_ERROR_NET_ERROR 3001000A 805371914 网络出错 DOWNLOAD_ERROR_NOT_SET_SAVE_DIR 3001000B 805371915 没有设置下载路径 DOWNLOAD_ERROR_CANNOT_CREATE_SAVE_DIR 3001000C 805371916 无法创建下载目录 DOWNLOAD_ERROR_NO_SPACE 3001000D 805371917 没有空间 DOWNLOAD_ERROR_WRITE_ERROR 3001000E 805371918 写入文件出错 DOWNLOAD_ERROR_ENCRYPT_ERROR 3001000F 805371919 解密失败 DOWNLOAD_ERROR_FILE_NOT_EXIST 30010010 805371920 文件不存在 DOWNLOAD_ERROR_CLEAN_INVALID_PARAM 30010011 805371921 删除文件参数无效 DOWNLOAD_ERROR_CLEAN_WRONG_STATUS 30010012 805371922 删除文件状态不对 DOWNLOAD_ERROR_GET_AES_KEY_FAIL 30010013 805371923 获取AES秘钥失败 DOWNLOAD_ERROR_ENCRYPTION_NOT_SUPPORT 30010014 805371924 加密方式不支持
保持可爱mmm 2020-03-30 14:27:14 0 浏览量 回答数 0

问题

摄像头流从Python服务器到Android客户端

我正在尝试发送相机流,这是连接到PC,到Android平板电脑通过插座。在pc服务器上是由python脚本处理的。 import socket import struct import json import ...
kun坤 2019-12-28 13:44:50 9 浏览量 回答数 1

回答

Re始终得不到tolken高手帮我看看代码如下 用下面的代码 function get($url) { $ch = curl_init();   if(stripos($url,"https://")!==FALSE){             curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);             curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);             curl_setopt($ch, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1         }         curl_setopt($ch, CURLOPT_URL, $url);         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );         curl_setopt($ch, CURLOPT_VERBOSE, 1);         curl_setopt($ch, CURLOPT_HEADER, false);         curl_setopt($ch, CURLINFO_HEADER_OUT, false); $rawdata = curl_exec($ch); if (curl_getinfo($ch, CURLINFO_HTTP_CODE) == '200') {             $students=json_decode($rawdata, true);              return $students ;         }         return null; }
mikebao 2019-12-01 23:52:58 0 浏览量 回答数 0

问题

上传媒体文件加了‘’直接为null,不加返会不和法参数

求问,这是为啥? $url='https://oapi.dingtalk.com/media/upload?access_token='.$token.'&typ...
yemxing 2019-12-01 21:30:38 1984 浏览量 回答数 1

回答

没有好的方法可以将数组存储到单个字段中。 您需要检查您的关系数据并对模式进行适当的更改。请参阅下面的示例以获取对此方法的参考。 如果必须将数组保存到单个字段中,则serialize()and unserialize()函数可以解决问题。但是您不能对实际内容执行查询。 作为序列化功能的替代方法,还有 json_encode()和json_decode()。 考虑以下数组 $a = array( 1 => array( 'a' => 1, 'b' => 2, 'c' => 3 ), 2 => array( 'a' => 1, 'b' => 2, 'c' => 3 ), ); 要将其保存在数据库中,您需要创建一个这样的表 $c = mysql_connect($server, $username, $password); mysql_select_db('test'); $r = mysql_query( 'DROP TABLE IF EXISTS test'); $r = mysql_query( 'CREATE TABLE test ( id INTEGER UNSIGNED NOT NULL, a INTEGER UNSIGNED NOT NULL, b INTEGER UNSIGNED NOT NULL, c INTEGER UNSIGNED NOT NULL, PRIMARY KEY (id) )'); 要使用记录,您可以执行诸如此类的查询(是的,请注意,请注意!) function getTest() { $ret = array(); $c = connect(); $query = 'SELECT * FROM test'; $r = mysql_query($query,$c); while ($o = mysql_fetch_array($r,MYSQL_ASSOC)) { $ret[array_shift($o)] = $o; } mysql_close($c); return $ret; } function putTest($t) { $c = connect(); foreach ($t as $k => $v) { $query = "INSERT INTO test (id,". implode(',',array_keys($v)). ") VALUES ($k,". implode(',',$v). ")"; $r = mysql_query($query,$c); } mysql_close($c); } putTest($a); $b = getTest(); 该connect()函数返回一个mysql连接资源 function connect() { $c = mysql_connect($server, $username, $password); mysql_select_db('test'); return $c; }
保持可爱mmm 2020-02-08 14:17:57 0 浏览量 回答数 0

回答

没有好的方法可以将数组存储到单个字段中。 您需要检查您的关系数据并对模式进行适当的更改。请参阅下面的示例以获取对此方法的参考。 如果必须将数组保存到单个字段中,则serialize()and unserialize()函数可以解决问题。但是您不能对实际内容执行查询。 作为序列化功能的替代方法,还有 json_encode()和json_decode()。 考虑以下数组 $a = array( 1 => array( 'a' => 1, 'b' => 2, 'c' => 3 ), 2 => array( 'a' => 1, 'b' => 2, 'c' => 3 ), ); 要将其保存在数据库中,您需要创建一个这样的表 $c = mysql_connect($server, $username, $password); mysql_select_db('test'); $r = mysql_query( 'DROP TABLE IF EXISTS test'); $r = mysql_query( 'CREATE TABLE test ( id INTEGER UNSIGNED NOT NULL, a INTEGER UNSIGNED NOT NULL, b INTEGER UNSIGNED NOT NULL, c INTEGER UNSIGNED NOT NULL, PRIMARY KEY (id) )'); 要使用记录,您可以执行诸如此类的查询(是的,请注意,请注意!) function getTest() { $ret = array(); $c = connect(); $query = 'SELECT * FROM test'; $r = mysql_query($query,$c); while ($o = mysql_fetch_array($r,MYSQL_ASSOC)) { $ret[array_shift($o)] = $o; } mysql_close($c); return $ret; } function putTest($t) { $c = connect(); foreach ($t as $k => $v) { $query = "INSERT INTO test (id,". implode(',',array_keys($v)). ") VALUES ($k,". implode(',',$v). ")"; $r = mysql_query($query,$c); } mysql_close($c); } putTest($a); $b = getTest(); 该connect()函数返回一个mysql连接资源 function connect() { $c = mysql_connect($server, $username, $password); mysql_select_db('test'); return $c; } 来源:stack overflow
保持可爱mmm 2020-05-13 14:17:03 0 浏览量 回答数 0

问题

再发OSChina源码之 ActionServlet,控制类? 400 报错

再发OSChina源码之 ActionServlet,控制类? 400 报错 ActionServlet 这个类在 OSChina 是负责处理表单请求的,所有以 /action 开头的请求,自己感...
爱吃鱼的程序员 2020-06-04 14:30:06 1 浏览量 回答数 1

问题

服务端返回数据的JSON字符串格式在PHP下解析有问题

获取成员详情的isLeaderInDepts是JSON字符串,但是key的部分没有使用引号,这会导致PHP下直接使用json_decode返回null值。 例如 isLeaderInDepts:"{...
浮云若海 2019-12-01 21:10:31 1245 浏览量 回答数 0

问题

还原json循环引用对象的一种办法? 400 报错

还原json循环引用对象的一种办法? 400 报错 后端数据实体都是由hibernate生成的,与浏览器客户端交互json时,采用了alibaba FastJson库。 首先要说fastJson的确为...
爱吃鱼的程序员 2020-05-30 22:21:39 0 浏览量 回答数 1

问题

discuz插件的七牛存储,上传文件后返回的网址是错误的,哪里错了?

求高手帮忙,每次上传后返回的网址是qn:,后面的目录和文件却是正确的,不知哪个配置文件要修改? 附目录文件代码: io.php <?phprequire_once...
秋日的私语 2019-12-01 22:05:07 7680 浏览量 回答数 4

问题

php调用新版百度翻译api的问题? 400 报错

php调用新版百度翻译api的问题? 400 报错 百度给的官方demo中, function callOnce($url, $args=null, $method="post", $w...
爱吃鱼的程序员 2020-06-04 14:30:10 1 浏览量 回答数 1

问题

cocos2dx游戏资源加密之XXTEA:报错

在手机游戏当中,游戏的资源加密保护是一件很重要的事情。 我花了两天的时间整理了自己在游戏当中的资源加密问题,实现了跨平台的资源流加密,这个都是巨人的肩膀之上的。在手机游戏资源加密这块ÿ...
kun坤 2020-06-06 16:05:05 0 浏览量 回答数 1

问题

一键登录,使用自己的认证方案,token解密有问题

public static HashMap<String, String> decryptToken(Context context, String token) { HashMap<String, Str...
1389347149401717 2020-07-10 11:14:58 0 浏览量 回答数 0

问题

php调用短信接口报错

传入参数调用 $result = \plugins\mobile_code_demo\SmsSend::sendSms($mobile, $config['sign_name'], $config['t...
金玉洋文化 2019-12-01 19:01:14 305 浏览量 回答数 1

问题

REST API鉴权

鉴权方法说明 通过RESTful API调用智能语音服务,首先您需要拥有AccessKey( 点击 这里创建和管理您的AccessKey),AccessKey相当于您访问阿里云产品...
nicenelly 2019-12-01 21:01:17 1948 浏览量 回答数 0

问题

PHP 收发消息如何实现?

运行环境准备 用 HTTP 协议发送或者接收消息,请完成以下准备工作。 Windows 从 IntelliJ 官网下载并安装 phpStorm 试用版:http://www.jetbrains.com/phpst...
猫饭先生 2019-12-01 21:15:06 1332 浏览量 回答数 0

回答

既然dojo有,何不把dojo的借鉴一下.######对dojo不是很熟悉,没时间仔细研究。。。######不错,我一直希望有人能够做这个事情,在客户端解析fastjson的应用。######回复<aclass="referer"target="_blank">@gohsy:谢谢的你支持。使用好了并参与其中,才是更好的使用开源方式。也就是所谓的社区能读能改。我打算开一个项目用javascript实现fastjson的引用解析,希望你能够参与其中。######很早就在项目中引入了温少侠的fastjsondruid,绝对达到商业软件的水准了,屡用不爽,越用越爽。###### fastjson循环引用的文档: <arel="nofollow">https://github.com/alibaba/fastjson/wiki/%E5%BE%AA%E7%8E%AF%E5%BC%95%E7%94%A8######很高端。只是想知道,大部分语言的JSONAPI应该都不支持循环引用吧,那么循环引用是什么样的需求产生的?可以避免不? ######文章里面已经描述了,由hibernate生成的实体,包含着大量的关联引用,在稍大的一点的项目中,实体对象之间的关联关系会比较复杂,要么就手动处理有选择性的输出关联关系,要么就用fastjson这样能够处理循环引用的库,在数据使用方的底层,在做引用还原。######可以对每个域模型继承一个接口,接口提供一个将模型转为map的方法,map里可以包含引用,但也是对方转成map的,同时自己在转map那个方法里防止递归引用。######Ext.define('overrides.JSON',{    override:'Ext.JSON',    decode:function(json,safe){       me=this;       if(typeofme.JSON.retrocycle!=='function'){          me.JSON.retrocycle=(function(){             'usestrict';             vart_obj=typeof{},t_arr=Object.prototype.toString                   .apply([]),t_str=typeof"";             varwalk=function(path,_xpath,array){                if(path.startsWith('$'))//基于xpath直接定位                   returnpath;                else{//相对回溯定位                   varx,j=path.split('..'),k=-j.length                         +(array?2:1),last=j.slice(-1)[0]                         .replace('/','.');                   x=k<0?_xpath.slice(0,k):_xpath.slice(0);                   if(last&&!last.startsWith('.')                         &&!last.startsWith('['))                      last='.'+last;                   path=x.join('.')+last;                }                returnpath;//最终得到绝对xpath地址             };             returnfunction($){                varxpath=['$'];                (functionrez(value){                   vari,item,name,path,_x;                   if(value&&typeofvalue===t_obj){                      if(Object.prototype.toString.apply(value)===t_arr){                         for(i=0;i<value.length;i+=1){                            item=value[i];                            if(item&&typeofitem===t_obj){                               xpath.push(xpath.pop()+'['+i+']');//下标引用要合并分级                               path=item.$ref;                               if(typeofpath===t_str)                                  value[i]=eval(walk(path,xpath,                                        true));                               else                                  rez(item);                               if(_x=xpath.pop())                                  xpath.push(_x.slice(0,_x                                              .indexOf('[')));//下标引用还原分级                            }                         }                      }else{                         for(nameinvalue){                            if(value.hasOwnProperty(name)                                  &&typeofvalue[name]===t_obj){                               xpath.push(name);                               item=value[name];                               if(item){                                  path=item.$ref;                                  if(typeofpath===t_str)                                     value[name]=eval(walk(path,                                           xpath));                                  else                                     rez(item);                               }                               xpath.pop();                            }                         }                      }                   }                })($);                return$;             }          })();       }       varisNative=function(){          varuseNative=null;          returnfunction(){             if(useNative===null){                useNative=Ext.USE_NATIVE_JSON&&window.JSON                      &&JSON.toString()=='[objectJSON]';             }             returnuseNative;          };       }();       vardecodingFunction;       doDecode=function(json){          returnjson?eval("("+json+")"):"";       };       if(!decodingFunction){          //setupdecodingfunctiononfirstaccess          decodingFunction=isNative()?JSON.parse:doDecode;       }       try{          returnthis.JSON.retrocycle(decodingFunction(json));       }catch(e){          if(safe===true){             returnnull;          }          Ext.Error.raise({                   sourceClass:"Ext.JSON",                   sourceMethod:"decode",                   msg:"我尝试解析aninvalidJSONString:"+json                });       }    } }); Ext.decode=Ext.JSON.decode; 在Extjs4.2 里的写法。放在与app目录平齐的overrides里面。 然后在APP.js里面加入下面的东西。 Ext.application({   name:'admin',   extend:'admin.Application',   requires:[//              'overrides.grid.RowEditor'   'overrides.JSON'          ],   autoCreateViewport:true}); ###### 这个解析的算法还有BUG。就是当A引用B一个集合,A在引用B单个的时候解析出来可能B指向的A就会错误。 举个例子:客户与客户联系人。客户有一个客户联系人的集合的属性,客户还有一个主联系人的属性。同时客户联系人也指向客户有一个属性,当这种对应关系的时候解析就会出错! 我尝试着想要去解决,但是智商有限搞不了。求作者在查看一下。 <imgsrc="http://static.oschina.net/uploads/space/2014/0603/125031_qDeH_90398.png"alt=""/> ######<divclass="ref"> 引用来自“刘思作”的评论 这个解析的算法还有BUG。就是当A引用B一个集合,A在引用B单个的时候解析出来可能B指向的A就会错误。 举个例子:客户与客户联系人。客户有一个客户联系人的集合的属性,客户还有一个主联系人的属性。同时客户联系人也指向客户有一个属性,当这种对应关系的时候解析就会出错! 我尝试着想要去解决,但是智商有限搞不了。求作者在查看一下。 <imgsrc="http://static.oschina.net/uploads/space/2014/0603/125031_qDeH_90398.png"alt=""/> 看来这个问题还是有人关注的哈。  你可以给点数据,我有空的时候的看看。
优选2 2020-06-09 15:59:55 0 浏览量 回答数 0

回答

既然dojo有,何不把dojo的借鉴一下.######对dojo不是很熟悉,没时间仔细研究。。。######不错,我一直希望有人能够做这个事情,在客户端解析fastjson的应用。######回复 @gohsy : 谢谢的你支持。使用好了并参与其中,才是更好的使用开源方式。也就是所谓的社区能读能改。我打算开一个项目用javascript实现fastjson的引用解析,希望你能够参与其中。######很早就在项目中引入了温少侠的fastjson druid,绝对达到商业软件的水准了,屡用不爽,越用越爽。###### fastjson循环引用的文档: https://github.com/alibaba/fastjson/wiki/%E5%BE%AA%E7%8E%AF%E5%BC%95%E7%94%A8 ######很高端。只是想知道,大部分语言的JSON API应该都不支持循环引用吧,那么循环引用是什么样的需求产生的?可以避免不? ######文章里面已经描述了,由hibernate生成的实体,包含着大量的关联引用,在稍大的一点的项目中,实体对象之间的关联关系会比较复杂,要么就手动处理有选择性的输出关联关系,要么就用fastjson这样能够处理循环引用的库,在数据使用方的底层,在做引用还原。######可以对每个域模型继承一个接口,接口提供一个将模型转为map的方法,map里可以包含引用,但也是对方转成map的,同时自己在转map那个方法里防止递归引用。######Ext.define('overrides.JSON', {     override : 'Ext.JSON',     decode : function(json, safe) {         me = this;         if (typeof me.JSON.retrocycle !== 'function') {             me.JSON.retrocycle = (function() {                 'use strict';                 var t_obj = typeof {}, t_arr = Object.prototype.toString                         .apply([]), t_str = typeof "";                 var walk = function(path, _xpath, array) {                     if (path.startsWith('$')) // 基于xpath直接定位                         return path;                     else { // 相对回溯定位                         var x, j = path.split('..'), k = -j.length                                 + (array ? 2 : 1), last = j.slice(-1)[0]                                 .replace('/', '.');                         x = k < 0 ? _xpath.slice(0, k) : _xpath.slice(0);                         if (last && !last.startsWith('.')                                 && !last.startsWith('['))                             last = '.' + last;                         path = x.join('.') + last;                     }                     return path; // 最终得到绝对xpath地址                 };                 return function($) {                     var xpath = ['$'];                     (function rez(value) {                         var i, item, name, path, _x;                         if (value && typeof value === t_obj) {                             if (Object.prototype.toString.apply(value) === t_arr) {                                 for (i = 0; i < value.length; i += 1) {                                     item = value[i];                                     if (item && typeof item === t_obj) {                                         xpath.push(xpath.pop() + '[' + i + ']'); // 下标引用要合并分级                                         path = item.$ref;                                         if (typeof path === t_str)                                             value[i] = eval(walk(path, xpath,                                                     true));                                         else                                             rez(item);                                         if (_x = xpath.pop())                                             xpath.push(_x.slice(0, _x                                                             .indexOf('['))); // 下标引用还原分级                                     }                                 }                             } else {                                 for (name in value) {                                     if (value.hasOwnProperty(name)                                             && typeof value[name] === t_obj) {                                         xpath.push(name);                                         item = value[name];                                         if (item) {                                             path = item.$ref;                                             if (typeof path === t_str)                                                 value[name] = eval(walk(path,                                                         xpath));                                             else                                                 rez(item);                                         }                                         xpath.pop();                                     }                                 }                             }                         }                     })($);                     return $;                 }             })();         }         var isNative = function() {             var useNative = null;             return function() {                 if (useNative === null) {                     useNative = Ext.USE_NATIVE_JSON && window.JSON                             && JSON.toString() == '[object JSON]';                 }                 return useNative;             };         }();         var decodingFunction;         doDecode = function(json) {             return json ? eval("(" + json + ")") : "";         };         if (!decodingFunction) {             // setup decoding function on first access             decodingFunction = isNative() ? JSON.parse : doDecode;         }         try {             return this.JSON.retrocycle(decodingFunction(json));         } catch (e) {             if (safe === true) {                 return null;             }             Ext.Error.raise({                         sourceClass : "Ext.JSON",                         sourceMethod : "decode",                         msg : "我尝试解析 an invalid JSON String: " + json                     });         }     } }); Ext.decode = Ext.JSON.decode; 在Extjs 4.2 里的写法。放在与app目录平齐的overrides里面。 然后在APP.js里面加入下面的东西。 Ext.application({     name: 'admin',     extend: 'admin.Application',     requires: [ //               'overrides.grid.RowEditor'     'overrides.JSON'            ],     autoCreateViewport: true }); ###### 这个解析的算法还有BUG。就是当A引用B一个集合,A在引用B单个的时候解析出来可能B指向的A就会错误。 举个例子:客户与客户联系人。客户有一个客户联系人的集合的属性,客户还有一个主联系人的属性。同时客户联系人也指向客户有一个属性,当这种对应关系的时候解析就会出错! 我尝试着想要去解决,但是智商有限搞不了。求作者在查看一下。 ###### 引用来自“刘思作”的评论 这个解析的算法还有BUG。就是当A引用B一个集合,A在引用B单个的时候解析出来可能B指向的A就会错误。 举个例子:客户与客户联系人。客户有一个客户联系人的集合的属性,客户还有一个主联系人的属性。同时客户联系人也指向客户有一个属性,当这种对应关系的时候解析就会出错! 我尝试着想要去解决,但是智商有限搞不了。求作者在查看一下。 看来这个问题还是有人关注的哈。  你可以给点数据,我有空的时候的看看。
爱吃鱼的程序员 2020-05-30 22:21:40 0 浏览量 回答数 0

问题

extjs表单提交后,数据打印后不是json格式

前台数据{ id:'user_update', text: '编辑', maxWidth:55, handler:function(){ var user_form = this.up('fo...
长安归故里. 2020-01-07 13:28:23 0 浏览量 回答数 1

回答

物联网络管理平台会对每个接口访问请求的发送者进行身份验证,所以无论使用 HTTP 还是 HTTPS 协议提交请求,都需要在请求中包含签名(Signature)信息。 签名时,您需在控制台 AccessKey 管理页面查看您的阿里云账号的 AccessKeyId 和 AccessKeySecret,然后进行对称加密。其中,AccessKeyId 用于标识访问者身份;AccessKeySecret 是用于加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密。 说明 物联网络管理平台提供了Java语言的云端SDK。使用平台SDK,可以免去签名过程。请参见 Java SDK 使用说明及SDK的使用说明。 请按照下面的方法对请求进行签名: 构造规范化的请求字符串(Canonicalized Query String)。 排序参数。 按参数名的字典顺序,对请求参数进行排序,包括公共请求参数(不包括 Signature 参数)和接口的自定义参数。 说明 当使用GET方法提交请求时,这些参数就是请求URL中的参数部分,即URL中问号(?)之后由并列符号(&)连接的部分。 对参数名称和参数值进行 URL 编码。 使用UTF-8字符集按照 RFC3986 规则编码请求参数名和参数值。编码规则如下。 字符大写字母(A~Z)、小写字母(a~z)、数字(0~9)以及半字线(-)、下划线(_)、点号(.)、波浪线(~)不编码。 其它字符编码成%XY的格式,其中XY是字符对应ASCII码的16进制表示。例如英文的双引号"对应的编码为%22。 扩展的 UTF-8 字符,编码成%XY%ZA...的格式。 英文空格要编码成%20,而不是加号+。 该编码方式与application/x-www-form-urlencodedMIME 格式编码算法相似,但又有所不同。 如果您使用的是 Java 标准库中的java.net.URLEncoder,可以先用encode编码,随后将编码后的字符中加号+替换为%20、星号*替换为%2A、%7E替换回波浪号~,即可得到上述规则描述的编码字符串。 private static final String ENCODING = "UTF-8"; private static String percentEncode(String value) throws UnsupportedEncodingException { return value != null ? URLEncoder.encode(value, ENCODING).replace("+", "%20").replace("*", "%2A").replace("%7E", "~") : null; } 使用等号=连接编码后的请求参数名和参数值。 使用与号&连接编码后的请求参数。参数排序与步骤“排序参数”的描述一致。 完成后,即获得规范化请求字符串(CanonicalizedQueryString)。 构造签名字符串。 可以使用percentEncode处理步骤 1 得到的规范化字符串,构造签名字符串。可参考如下规则。 String stringToSign = httpMethod + "&" + // httpMethod: 发送请求所采用的 HTTP 方法,例如 GET。 percentEncode("/") + "&" + // percentEncode("/"): 字符'/'UTF-8 编码得到的值,即 %2F。 percentEncode(canonicalizedQueryString) // 您的规范化请求字符串。 计算 HMAC 值。 按照RFC2104的定义,使用步骤 2 得到的字符串stringToSign计算签名 HMAC 值。下列伪代码演示了获得 HMAC 值的方法。 HMAC-Value = HMAC-SHA1 ( AccessSecret, UTF-8-Encoding-Of ( StringToSign ) ) 说明 计算HMAC 值时,使用的 Key 就是您的AccessKeySecret并加上一个与号&字符(ASCII:38)。使用的哈希算法是SHA1。 计算签名值。 按照 Base64 编码规则把步骤 3 中的HMAC值编码成字符串,即得到签名值(Signature)。 添加签名。 将得到的签名值作为Signature参数,按照RFC3986的规则进行URL编码后,再添加到请求参数中,即完成对请求签名的过程。 签名示例 以调用API方法GetGateway为例。假设AccessKeyId = testid,AccessKeySecret = testsecret。 签名前的请求URL: https://linkwan.cn-shanghai.aliyuncs.com/ ?Format=JSON &Version=2019-01-20 &SignatureMethod=HMAC-SHA1 &SignatureNonce=15215528852396 &SignatureVersion=1.0 &AccessKeyId=testid &Timestamp=2019-01-20T12:00:00Z &RegionId=cn-shanghai &Action=GetGateway &GwEui=0000000000000000 计算得到的待签名字符串StringToSign: GET&%2F&AccessKeyId%3Dtestid&Action%3DGetGateway&Format%3DJSON&GwEui%3D0000000000000000&RegionId%3Dcn-shanghai&SignatureMethod%3DHMAC-SHA1&SignatureNonce%3D15215528852396&SignatureVersion%3D1.0&Timestamp%3D2019-01-20T12%253A00%253A00Z&Version%3D2019-01-20 计算签名值。 因为AccessKeySecret = testsecret,用于计算的 Key 为testsecret&,计算得到的签名值为: yqWsF0aPGrECmuwTfALUIl0JM9M%3D 将签名作为 Signature 参数加入到 URL 请求中,最后得到的 URL 为: https://linkwan.cn-shanghai.aliyuncs.com/ ?Format=JSON &Version=2019-01-20 &Signature=yqWsF0aPGrECmuwTfALUIl0JM9M%3D &SignatureMethod=HMAC-SHA1 &SignatureNonce=15215528852396 &SignatureVersion=1.0 &AccessKeyId=testid &Timestamp=2019-01-20T12:00:00Z &RegionId=cn-shanghai &Action=GetGateway &GwEui=0000000000000000 Java 代码示例 以下为签名的Java Demo供您参考。 Config.java package aliyun.signature; /** * API 签名配置。 * * @author Alibaba Cloud * @date 2019/01/20 */ public class Config { /** * 阿里云账号的 Access Key Id。 */ public static final String ACCESS_KEY_ID = "testid"; /** * 阿里云账号的 Access Key Secret。 */ public static final String ACCESS_KEY_SECRET = "testsecret"; /** * UTF-8 字符集。 */ public static final String CHARSET_UTF8 = "utf8"; } UrlUtil.java package aliyun.signature; import java.net.URLEncoder; import java.util.Map; /** * URL 处理工具。 * * @author Alibaba Cloud * @date 2019/01/20 */ public class UrlUtil { /** * UTF-8 编码。 */ private final static String CHARSET_UTF8 = "utf8"; /** * 编码 URL。 * @param url 要编码的 URL。 * @return 编码后的 URL。 */ public static String urlEncode(String url) { if (url != null && !url.isEmpty()) { try { url = URLEncoder.encode(url, "UTF-8"); } catch (Exception e) { System.out.println("Url encoding error:" + e.getMessage()); } } return url; } /** * 规范化请求串。 * @param params 请求中所有参数的 KV 对。 * @param shouldEncodeKv 是否需要编码 KV 对中的文本。 * @return 规范化的请求串。 */ public static String canonicalizeQueryString(Map<String, String> params, boolean shouldEncodeKv) { StringBuilder canonicalizedQueryString = new StringBuilder(); for (Map.Entry<String, String> entry : params.entrySet()) { if (shouldEncodeKv) { canonicalizedQueryString.append(percentEncode(entry.getKey())) .append("=") .append(percentEncode(entry.getValue())) .append("&"); } else { canonicalizedQueryString.append(entry.getKey()) .append("=") .append(entry.getValue()) .append("&"); } } if (canonicalizedQueryString.length() > 1) { canonicalizedQueryString.setLength(canonicalizedQueryString.length() - 1); } return canonicalizedQueryString.toString(); } /** * 对原文进行百分号编码。 * @param text 原文。 * @return 编码结果。 */ public static String percentEncode(String text) { try { return text == null ? null : URLEncoder.encode(text, CHARSET_UTF8) .replace("+", "%20") .replace("*", "%2A") .replace("%7E", "~"); } catch (Exception e) { System.out.println("Percentage encoding error:" + e.getMessage()); } return ""; } } SignatureUtils.java package aliyun.signature; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URISyntaxException; import java.net.URLDecoder; import java.net.URLEncoder; import java.util.Map; import java.util.TreeMap; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; /** * API 签名工具。 * * @author Alibaba Cloud * @date 2019/01/20 */ public class SignatureUtils { private final static String CHARSET_UTF8 = "utf8"; private final static String ALGORITHM = "UTF-8"; private final static String SEPARATOR = "&"; private final static String METHOD_NAME_POST = "POST"; /** * 分解请求串中的参数。 * @param url 原始 URL。 * @return 分解后的参数名、参数值对的映射 */ public static Map<String, String> splitQueryString(String url) throws URISyntaxException, UnsupportedEncodingException { URI uri = new URI(url); String query = uri.getQuery(); final String[] pairs = query.split("&"); TreeMap<String, String> queryMap = new TreeMap<String, String>(); for (String pair : pairs) { final int idx = pair.indexOf("="); final String key = idx > 0 ? pair.substring(0, idx) : pair; if (!queryMap.containsKey(key)) { queryMap.put(key, URLDecoder.decode(pair.substring(idx + 1), CHARSET_UTF8)); } } return queryMap; } /** * 计算签名名转译成合适的编码。 * @param httpMethod HTTP 请求的 Method。 * @param parameter 原始请求串中参数名、参数值对的映射。 * @param accessKeySecret 阿里云账号的 Access Key Secret。 * @return 转译成合适编码的签名。 */ public static String generate(String httpMethod, Map<String, String> parameter, String accessKeySecret) throws Exception { String stringToSign = generateStringToSign(httpMethod, parameter); System.out.println("signString---" + stringToSign); byte[] signBytes = hmacSHA1Signature(accessKeySecret + "&", stringToSign); String signature = newStringByBase64(signBytes); if (signature == null) { return ""; } System.out.println("signature----" + signature); if (METHOD_NAME_POST.equals(httpMethod)) { return signature; } return URLEncoder.encode(signature, ALGORITHM); } /** * 计算签名中间产物 StringToSign。 * @param httpMethod HTTP 请求的 Method。 * @param parameter 原始请求串中参数名、参数值对的映射。 * @return 签名中间产物 StringToSign。 */ public static String generateStringToSign(String httpMethod, Map<String, String> parameter) throws IOException { TreeMap<String, String> sortParameter = new TreeMap<String, String>(parameter); String canonicalizedQueryString = UrlUtil.canonicalizeQueryString(sortParameter, true); if (httpMethod == null || httpMethod.isEmpty()) { throw new RuntimeException("httpMethod can not be empty"); } StringBuilder stringToSign = new StringBuilder(); stringToSign.append(httpMethod).append(SEPARATOR); stringToSign.append(percentEncode("/")).append(SEPARATOR); stringToSign.append(percentEncode(canonicalizedQueryString)); return stringToSign.toString(); } /** * 对原文进行百分号编码处理。 * @param text 要处理的原文。 * @return 处理后的百分号编码。 */ public static String percentEncode(String text) { try { return text == null ? null : URLEncoder.encode(text, CHARSET_UTF8) .replace("+", "%20") .replace("*", "%2A") .replace("%7E", "~"); } catch (Exception e) { System.out.println("Percentage encoding error:" + e.getMessage()); } return ""; } /** * HMAC-SHA1 键控散列。 * @param secret HMAC-SHA1 使用的 Secret。 * @param baseString 原文。 * @return 散列值。 */ public static byte[] hmacSHA1Signature(String secret, String baseString) throws Exception { if (secret == null || secret.isEmpty()) { throw new IOException("secret can not be empty"); } if (baseString == null || baseString.isEmpty()) { return null; } Mac mac = Mac.getInstance("HmacSHA1"); SecretKeySpec keySpec = new SecretKeySpec(secret.getBytes(CHARSET_UTF8), ALGORITHM); mac.init(keySpec); return mac.doFinal(baseString.getBytes(CHARSET_UTF8)); } /** * Base 64 编码。 * @param bytes 原文。 * @return Base 64 编码。 */ public static String newStringByBase64(byte[] bytes) throws UnsupportedEncodingException { if (bytes == null || bytes.length == 0) { return null; } return new String(Base64.encodeBase64(bytes, false), CHARSET_UTF8); } } DemoApplication.java package aliyun.signature; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; /** * API 签名 Demo 主程序。 * * @author Alibaba Cloud * @date 2019/01/20 */ public class DemoApplication { /** * 1. 需求修改 Config.java 中的 Access Key 信息。 * 2. 建议使用方法二,所有参数都需要一一填写。 * 3. "最终 Signature"才是你需要的签名最终结果。 * @param args ... */ public static void main(String[] args) throws UnsupportedEncodingException { // 方法一。 System.out.println("方法一:"); String str = "GET&%2F&AccessKeyId%3D" + Config.ACCESS_KEY_ID + "&Action%3DGetGateway&Format%3DJSON&GwEui%3D" + "0000000000000000&RegionId%3Dcn-shanghai&Signa" + "tureMethod%3DHMAC-SHA1&SignatureNonce%3D1521552" + "8852396&SignatureVersion%3D1.0&Timestamp%3D20" + "19-01-20T12%253A00%253A00Z&Version%3D2019-01-20"; byte[] signBytes; try { signBytes = SignatureUtils.hmacSHA1Signature(Config.ACCESS_KEY_SECRET + "&", str.toString()); String signature = SignatureUtils.newStringByBase64(signBytes); System.out.println("signString---" + str); System.out.println("signature----" + signature); System.out.println("最终signature:" + URLEncoder.encode(signature, Config.CHARSET_UTF8)); } catch (Exception e) { e.printStackTrace(); } System.out.println(); // 方法二。 System.out.println("方法二:"); Map<String, String> map = new HashMap<String, String>(); // 公共参数。 map.put("Format", "JSON"); map.put("Version", "2019-01-20"); map.put("AccessKeyId", Config.ACCESS_KEY_ID); map.put("SignatureMethod", "HMAC-SHA1"); map.put("Timestamp", "2019-01-20T12:00:00Z"); map.put("SignatureVersion", "1.0"); map.put("SignatureNonce", "15215528852396"); map.put("RegionId", "cn-shanghai"); map.put("Action", "GetGateway"); // 请求参数。 map.put("GwEui", "0000000000000000"); try { String signature = SignatureUtils.generate("GET", map, Config.ACCESS_KEY_SECRET); System.out.println("最终signature:" + signature); } catch (Exception e) { e.printStackTrace(); } System.out.println(); } }
保持可爱mmm 2020-03-27 16:04:20 0 浏览量 回答数 0

回答

回 1楼(细雨醉相思) 的帖子 你好,以下是我们的开发人员测试用的相关代码,供您参考。      /* * Copyright 2015 Aliyun.com All right reserved. This software is the * confidential and proprietary information of Aliyun.com ("Confidential * Information"). You shall not disclose such Confidential Information and shall * use it only in accordance with the terms of the license agreement you entered * into with Aliyun.com . */ package com.util; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.crypto.Mac; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import javax.xml.crypto.dsig.SignatureMethod; import com.alibaba.fastjson.JSON; import com.google.common.base.Splitter; import com.google.common.io.BaseEncoding; /** * 类TopSignature.java的实现描述:TODO 类实现描述 * @author */ @SuppressWarnings("restriction") public class TopSignature {     private static String accessId     = "testid";     private static String accessSecret = "testsecret";     private static String SEPARATOR = "&";     private static String ENCODE_TYPE = "utf-8";     private static String EQUAL       = "=";     public static void main(String[] args) throws UnsupportedEncodingException, InvalidKeyException,             NoSuchAlgorithmException {         String x = "TimeStamp=2014-08-15T11%3A10%3A07Z&Format=xml&AccessKeyId=testid&Action=DescribeScalingGroups&SignatureMethod=HMAC-SHA1&RegionId=cn-qingdao&SignatureNonce=1324fd0e-e2bb-4bb1-917c-bd6e437f1710&SignatureVersion=1.0&Version=2014-08-28";         Map<String, String> map = new HashMap<String, String>();         List<String> list = Splitter.on("&").splitToList(x);         for (String s : list) {             List<String> kv = Splitter.on("=").splitToList(URLDecoder.decode(s, ENCODE_TYPE));             if (kv.size() == 2) {                 map.put(kv.get(0), kv.get(1));             }         }         System.out.println(JSON.toJSONString(map, true));         String signature = sig("GET", map);         System.out.println("Signature:" + signature);         System.out.println("urlencode:" + URLEncoder.encode(signature, ENCODE_TYPE));     }     private static String sig(String method, Map<String, String> param) throws NoSuchAlgorithmException,             UnsupportedEncodingException,             InvalidKeyException {         List<String> keys = new ArrayList<String>(param.keySet());         // Step 1: canonicalize         Collections.sort(keys);         StringBuilder sb = new StringBuilder();         for (String key : keys) {             String value = param.get(key);             sb.append(SEPARATOR).append(percentEncode(key)).append(EQUAL).append(percentEncode(value));         }         String canonicalizedQueryString = sb.substring(1);         // Step 2: prepare string to sign         StringBuilder signedData = new StringBuilder();         signedData.append(percentEncode(method));         signedData.append(SEPARATOR);         signedData.append(percentEncode("/"));         signedData.append(SEPARATOR);         signedData.append(percentEncode(canonicalizedQueryString));         String stringToSign = signedData.toString();         // Step 3: sign         SecretKey key = new SecretKeySpec((accessSecret + SEPARATOR).getBytes(ENCODE_TYPE), SignatureMethod.HMAC_SHA1);         Mac mac = Mac.getInstance("HmacSHA1");         mac.init(key);         byte[] hmacValue = mac.doFinal(stringToSign.getBytes(ENCODE_TYPE));         // Step 4: base64 encode         return BaseEncoding.base64().encode(hmacValue);     }     private static String percentEncode(String s) throws UnsupportedEncodingException {         if (s == null)             return null;         return URLEncoder.encode(s, ENCODE_TYPE).replace("+", "%20").replace("*", "%2A").replace("%7E", "~");     } }
七色光 2019-12-02 02:18:17 0 浏览量 回答数 0
阿里云企业服务平台 陈四清的老板信息查询 上海奇点人才服务相关的云产品 爱迪商标注册信息 安徽华轩堂药业的公司信息查询 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 天籁阁商标注册信息 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务 北京芙蓉天下的公司信息查询