我目前正在与生成UPS发货的第三方API进行接口。我正在使用的一个端点返回base64编码的图像和跟踪号。我的问题是,base64编码的图像是作为一个27000 +行数组,而不是一个字符串。
我一直在和他们的程序员交谈,但他是一个。net家伙,只能告诉我这个问题与我接收UTF-8编码的json有关。他说:"当从JSON包接收回值时,应该有某种方法来选择ASCIIEncoding"。
下面是我使用cURL与第三方api交互的代码:
/**
* @param $url
* @param $method
* @param array $data
* @return mixed
*/
protected function callApi($url, $method, $data = array())
{
$curlObj = curl_init();
curl_setopt($curlObj, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Accept: application/json'
));
switch ($method)
{
case "POST":
curl_setopt($curlObj, CURLOPT_POST, 1);
if (!empty($data)) {
$data = json_encode($data);
curl_setopt($curlObj, CURLOPT_POSTFIELDS, $data);
}
break;
case "PUT":
curl_setopt($curlObj, CURLOPT_PUT, 1);
break;
default:
if (!empty($data))
$url = sprintf("%s?%s", $url, http_build_query($data));
}
curl_setopt($curlObj, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($curlObj, CURLOPT_USERPWD, $this->_apiUser .":" . $this->_apiPassword);
curl_setopt($curlObj, CURLOPT_URL, $url);
curl_setopt($curlObj, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($curlObj);
curl_close($curlObj);
return $result;
}
下面是专门调用这个方法来设置装运的代码:
public function createShipment($quoteId) {
$data = array('QuoteId' => $quoteId);
return json_decode($this->callApi($this->_apiUrl . 'shipment/' . $quoteId . '?sessionID=' . $this->_sessionId, 'POST', $data));
}
最后,我收到的json的一个小子集。我已经砍掉了图像数组中的所有行,除了一些行,而不是垃圾页面,而是为了清楚地了解我正在处理的内容。
{"CarrierCode":1、"CodAmount":0,"IsSmartPickUp":假的,"IsThermal":假的,"LabelImage":(71年,73年,70年,56岁的55,97年,120,5,32岁的3.231年,0,0,0,0,0,1,1,1,2,2,2,3.3.3.4,4,4,5,5,5,6,6,6,7,7,7,8,8,8,9,9,9,10,10,10,11,11,11,12,12,12,13日,13日,13日,14日,14日,14],:"QuoteId b014d267 - 0850 - 49 - ce - b71d - 28 - b82966b1c9",:"ShipmentId b014d267 - 0850 - 49 - ce - b71d - 28 - b82966b1c9","TotalShipments":"1","跟踪号码":"1 z1a39w90393227795"}
LabelImage应该是一个base64图像。我如何以正确的格式接收它,以便我可以打印出图像给我们的客户服务人员?
试试下面的代码:
$result = createShipment($quoteId);
$base64_str = '';
foreach($result['LabelImage'] as $charCode) {
$base64_str .= chr($charCode);
}
$image = base64_decode($base64_str);
让我们假设。net开发人员是正确的,您必须通知服务器您接受/期望以ASCII编码(或类似的东西)的响应数据。
然后,仍然有几种可能的方法来"在"服务器应用程序中触发该行为。
按可能性/正确性降序排列:
- 将
Accept-Charset: iso-8859-1
添加到请求头数组中。 - 将Content-Type头更改为
Content-Type: application/json; charset=iso-8859-1
,因为没有指示否则服务器应该回答请求的编码* -但然后你只"允许"在请求中发送iso-8859-1数据。 - 将接收报头改为
Accept: application/json;charset=iso-8859-1
-滥用接收报头中的parameter
字段;不是很好,但我见过这样的实现,但是…请先尝试其他选项。
*)哎呀,或者不....rfc2616中的"14.2 Accept-Charset"另有规定:If no Accept-Charset header is present, the default is that any character set is acceptable.