Base64图像在JSON中遇到数组


Base64 image coming across as array in JSON

我目前正在与生成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编码(或类似的东西)的响应数据。
然后,仍然有几种可能的方法来"在"服务器应用程序中触发该行为。

按可能性/正确性降序排列:

  1. Accept-Charset: iso-8859-1添加到请求头数组中。
  2. 将Content-Type头更改为Content-Type: application/json; charset=iso-8859-1,因为没有指示否则服务器应该回答请求的编码* -但然后你只"允许"在请求中发送iso-8859-1数据。
  3. 将接收报头改为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.