Base64图像以JSON

时间:2015-09-08 21:58:11

标签: php json image base64

我目前正致力于与生成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图像。如何以正确的格式接收它,以便我可以为客户服务人员打印图像?

2 个答案:

答案 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数据(或类似的东西)。
然后,仍有几种可能的方法可以在服务器应用程序中“触发”该行为。

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

  1. Accept-Charset: iso-8859-1添加到请求标头数组中。
  2. 将Content-Type标头更改为Content-Type: application/json; charset=iso-8859-1,因为没有指示,否则服务器应该使用请求的编码来回答* - 但是您只能“允许”发送iso-8859-1请求中的数据也是如此。
  3. 将Accept标头更改为Accept: application/json;charset=iso-8859-1 - 滥用accept标头的parameter字段;不好,但我见过这样的实现,但是......首先尝试其他选项。
  4. *)哎呀,或者不......在rfc2616中“14.2 Accept-Charset”另有说法:If no Accept-Charset header is present, the default is that any character set is acceptable.