我目前正致力于与生成UPS货件的第三方API进行接口。我正在使用的一个端点返回base64编码图像和跟踪编号。我遇到的问题是base64编码的图像是一个27,000+行数而不是字符串。
我一直在和他们的程序员交谈,但他是一个.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”:false, “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-49ce-b71d-28b82966b1c9”, “ShipmentId”:“b014d267-0850-49ce-b71d-28b82966b1c9”, “TotalShipments”:“1”, “TrackingNumber”:“1Z1A39W90393227795” }
LabelImage应该是base64图像。如何以正确的格式接收它,以便我可以为客户服务人员打印图像?
答案 0 :(得分:1)
试试这段代码:
$result = createShipment($quoteId);
$base64_str = '';
foreach($result['LabelImage'] as $charCode) {
$base64_str .= chr($charCode);
}
$image = base64_decode($base64_str);
答案 1 :(得分:1)
让我们假设.net开发人员是正确的,您必须通知服务器您接受/期望ASCII编码的repsonse数据(或类似的东西)。
然后,仍有几种可能的方法可以在服务器应用程序中“触发”该行为。
按可能性/正确性的降序排列:
Accept-Charset: iso-8859-1
添加到请求标头数组中。 Content-Type: application/json; charset=iso-8859-1
,因为没有指示,否则服务器应该使用请求的编码来回答* - 但是您只能“允许”发送iso-8859-1请求中的数据也是如此。 Accept: application/json;charset=iso-8859-1
- 滥用accept标头的parameter
字段;不好,但我见过这样的实现,但是......首先尝试其他选项。 *)哎呀,或者不......在rfc2616中“14.2 Accept-Charset”另有说法:If no Accept-Charset header is present, the default is that any character set is acceptable.