UPS跟踪API-JSON主体格式?

9
根据 UPS 开发者工具包文档中的“Tracking Web Services Developers Guide - January 04, 2016”版本,最新的跟踪 API 可以通过 REST / JSON 访问。然而,在他们的 PDF 文档及互联网上,很少有关于 JSON 方面的信息。我无法确定正确的消息体,每次都会收到“请求格式不正确或操作未定义,请检查错误后重新提交。”的错误信息。虽然有多年关于 XML / SOAP 方面的信息,但我想在这个特定项目中使用 JSON。是否有人熟悉该 API 的这一新功能,知道 JSON 消息体应该是什么样子?JSON 能够正常验证,但明显不是 UPS 寻找的内容。

{
 "UPSSecurity": {
  "UsernameToken": {
   "Username": " userHere",
   "Password": " passHere"
  }
 },
 "ServiceAccessToken": {
  "AccessLicenseNumber": "licNoHere"
 },
 "Request": {
  "RequestOption": "15"
 },
 "InquiryNumber": "1Z12345E0291980793",
 "TrackingOption": "02"
}

3个回答

14

UPS支持回答我的问题并发布答案。

将以下JSON作为请求主体内容POST到以下API端点:

https://onlinetools.ups.com/json/Track

{
  "Security": {
    "UsernameToken": {
      "Username": "ups_username_here",
      "Password": "ups_password_here"
    },
    "UPSServiceAccessToken": {
      "AccessLicenseNumber": "ups_access_license_number_here"
    }
  },
  "TrackRequest": {
    "Request": {
      "RequestAction": "Track",
      "RequestOption": "activity"
    },
    "InquiryNumber": "1Z202Y36A898759591"
  }
}


但是你如何首先发出请求呢? - djack109
@djack109 我在答案中添加了API端点和POST方法。 - Dan
谢谢。但是你如何实际获取数据到该URL?如果是POST数据,那么表单字段名称是什么,如果是GET(URL)数据,查询字符串是什么? - djack109
没有表单字段。一般来说,POST只是表示您在HTTP请求的正文中发送了一些数据。它可以是XML、JSON或您正在上传的任意文件的内容,但由于url编码的表单数据非常流行,因此许多工具(例如Postman)使其看起来像使用表单字段名称和值进行POST是其自己的特殊事情和/或唯一的做POST的方法。这不是真的。我希望这可以帮助到您! - leoger
@djack109 只需要想象HTTP请求就像(讽刺地)邮件或包裹一样。 有一个地址(URL),然后是其中的内容(标头,正文等)。 当您学习如何发送表格之前,了解什么是HTTP请求有时会感到困惑。 当您设置一个表格并通过ajax或传统的HTML表格发送它时,浏览器就像“好吧,我将从用户那里获取这些信息,将其捆绑成一个包裹,并将其发送到此URL”。 像常规邮件或包裹一样,有许多不同的方法来打包和发送JSON,XML等。 http://rve.org.uk/dumprequest - John Rausch

3
https://www.ups.com/track/api/Track/GetStatus上,您可以发布类似以下JSON格式的内容:
{
  "Locale": "da_DK",
  "TrackingNumber": ["enter your number here" ]
}

您将获得一个漂亮的json结构,显示包裹的当前和以前的位置。

如果您发布多个跟踪号码,则只会获得每个包裹的摘要。


这对我们来说一直运作得非常完美,直到2020年9月15日UPS服务器开始响应HTTP 401“未经授权”的错误。 - Chris78
2
但是这里有解决方案: 首先进行GET请求并从Cookie jar中提取名为“X-XSRF-TOKEN-ST”的Cookie的值。现在将该值添加为“X-XSRF-TOKEN”到您的POST请求的标头中,然后应该可以正常工作。 (请注意Cookie名称(...-ST)与请求标头中的名称之间的差异。) - Chris78

2
以下是我使用cURL制作请求的PHP代码:
```php

这里是我使用cURL制作请求的PHP代码:

```
<?php

$url = 'https://wwwcie.ups.com/rest/Track'; // TEST
// $url = 'https://onlinetools.ups.com/rest/Track'; // PROD

$ups_array = array(
    'UPSSecurity' => array(
        'UsernameToken' => array(
            'Username' => 'ups_username_here',
            'Password' => 'ups_password_here'
        ),
        'ServiceAccessToken' => array(
            'AccessLicenseNumber' => 'ups_access_license_number_here'
        )
    ),
    'TrackRequest' => array(
        'Request' => array(
            'RequestOption' => 1,
            'TransactionReference' => array(
                'CustomerContext' => 'Test 001'
            )
        ),
        'InquiryNumber' => 'ups_package_tracking_number_here' //'1ZE1XXXXXXXXXXXXXX'
    )
);

$params = json_encode($ups_array);  // TURN THE ARRAY INTO JSON

$results_json = scrape_page($url, $params);  // POST TO THE API

$results = json_decode($results_json, true);  // DECODE THE JSON AND TURN IT INTO AN ARRAY

print "<PRE><FONT COLOR=RED>"; print_r($results); print "</FONT></PRE>";

接下来是实际的cURL函数:

function scrape_page($url, $params) {

    $headers = array();
    $headers[] = 'Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept';
    $headers[] = 'Access-Control-Allow-Methods: POST';
    $headers[] = 'Access-Control-Allow-Origin: *';
    $headers[] = 'Content-Type: application/json';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,5);
    curl_setopt($ch, CURLOPT_TIMEOUT, 45);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
    $response = curl_exec($ch);

    // CHECK TO SEE IF WE GOT AN ERROR  
    // IF SO, FORMAT IT LIKE THIS   ::28::Operation timed out afterseconds  
    if ((curl_errno($ch)) && (curl_errno($ch) != 0)) {
        $response = "::".curl_errno($ch)."::".curl_error($ch);
    }

    // SEND THE RESPONSE BACK TO THE SCRIPT
    return $response;

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接