首页app软件Python FedEx追踪脚本PHP转换:正确处理POST请求体格式

Python FedEx追踪脚本PHP转换:正确处理POST请求体格式

圆圆2025-08-27 00:00:14次浏览条评论

Python FedEx追踪脚本PHP转换:正确处理POST请求体格式本教程旨在将Python FedEx追踪脚本转换为PHP时遇到的常见问题,特别是关于POST请求体格式的正确处理。通过分析Python请求库与PHP请求库在发送表单数据和 JSON 数据时的差异,本文将详细指导如何正确构建请求参数,避免“UNSUPPORTED.ACTION”错误,从而成功实现 FedEx 包裹追踪功能。理解 Python 与 PHP 的 POST 请求体差异

在将 python 脚本转换为涉及 php 时,尤其是与 api 事务的 post 请求,一个常见的陷阱是对请求体(请求) python的requests库在处理data参数时,默认将其作为application/x-www-form-urlencoded类型发送,即使data参数的值本身是一个json字符串。而如果使用json参数,则将整个请求体序列化为json,并设置content-type:application/json。

原始Python脚本通过requests.post('...', data={...})发送请求。关键在于,data字典中的'data'键对应的值是通过json.dumps()函数序列化后的JSON字符串。这意味着整个POST请求的结构是:POST /trackingCal/track HTTP/1.1Content-Type: application/x-www-form-urlencodeddata=7B22TrackPackagesRequest223A7B...7D7Damp;action=trackpackagesamp;locale=en_USamp;format=jsonamp;version=99登录后复制

可以,外层是一个URL编码的表单数据,其中一个字段的值是经过JSON编码的字符串。错误的PHP转换尝试及其原因

初次尝试将Python逻辑转换为PHP时,开发者可能会倾向于将整个请求参数进行JSON编码,并设置Content-Type:应用程序/json。

例如:lt;?php// ...$headers = ['Content-Type' =gt; 'application/json'];$data = [ 'data' =gt; [ /* ... 完整的请求结构 ... */ ], 'action' =gt; 'trackpackages', 'locale' =gt; 'en_US', 'format' =gt; 'json', 'version' =gt; 99];$response = Requests::post($url, $headers, json_encode($data));// ...?gt;登录后复制

这种行为会导致整个请求体被发送为一个单一的JSON对象,例如:

立即学习“PHP免费学习笔记(深入)”;{ quot;dataquot;: { quot;TrackPackagesRequestquot;: { /* ... */ } }, quot;actionquo​​t;: quot;trackpackages";, quot;localequot;: quot;en_USquot;, quot;formatquot;: quot;jsonquo​​t;, quot;versionquo​​t;: 99}登录后复制

这与FedEx API所期望的application/x-www-form-urlencoded格式(其中data字段的值为JSON字符串)不符。,API会返回{"CALError": {"code":"UNSUPPORTED.ACTION", "message":"不是受支持的操作",...}}错误,表明它无法解析这种格式的请求。正确的PHP实现方式

要正确表示Python脚本转换为PHP,我们模拟需要Python requests库的行为:将外层参数作为application/x-www-form-urlencoded发送,但其中data字段的值需要是JSON编码的字符串。

PHP的Requests库(或cURL)在发送POST请求时,如果第三个参数是一个关联队列,就会默认将其作为application/x-www-form-urlencoded类型发送。因此,我们只需要保证data数组中的data键对应的值是经过json_encode()处理的字符串即可。

以下是修改后的PHP代码示例:lt;?php//引入Composer自动加载文件,确保Requests库可用$dir = __DIR__;include $dir .'/vendor/autoload.php';//示例追踪号$tracking_number = '123456789'; //请替换为实际的追踪号// FedEx追踪API的URL$url = 'https://www.fedex.com/trackingCal/track';//请求头:对于application/x-www-form-urlencoded,通常不需要显式设置Content-Type,//请求库会根据$data参数的类型自动处理。

$headers = []; // 构建POST请求的数据体$data = [ // 'data'字段的值必须是JSON编码的字符串 quot;dataquot; =gt; json_encode([ quot;TrackPackagesRequestquot;=gt; [ quot;appTypequot; =gt; quot;wtrkquot;, quot;uniqueKeyquot; =gt; quot;quot;, quot;processingParametersquot; =gt; [ quot;anonymousTransactionquo​​t;=gt;true,quot;clientIdquot;=gt;quot;WTRKquot;,quot;returnDetailedErrorsquot;=gt;true,quot;returnLocalizedDateTimequot;=gt;false],quot;trackingInfoListquot;=gt;[[quot;trackNumberInfoquot;=gt;[quot;trackingNumberquot;=gt;$tracking_number, quot;trackingQualifier"; =gt; quot;quot;, quot;trackingCarrier";=gt;";quot;]]]]]),quot;actionquo​​t;=gt;quot;trackpackagesquot;,quot;localequot;=gt;quot;en_USquot;,quot;formatquot;=gt;quot;jsonquo​​t;,quot;versionquo​​t;=gt;99];//发送POST请求//请求::post()方法传入$data队列自动编码为 application/x-www-form-urlencoded$response = Requests::post($url, $headers, $data);// 打印响应内容,通常需要进一步解析JSONprint_r($response-gt;body); // 访问响应体内容// 示例:解析JSON响应// $decoded_response = json_decode($response-gt;body, true);// if (isset($decoded_response['TrackPackagesResponse']['packageList'][0])) {// $fedex_st

atus = $decoded_response['TrackPackagesResponse']['packageList'][0]['keyStatus'];// $fedex_details = $decoded_response['TrackPackagesResponse']['packageList'][0]['statusWithDetails'];// $delivery_date = $decoded_response['TrackPackagesResponse']['packageList'][0]['displayActDeliveryDt'];// $delivery_time = $decoded_response['TrackPackagesResponse']['packageList'][0]['displayActDeliveryTm'];// echo quot;FedEx 状态: quot; . $fedex_status . quot;\nquot;;// echo quot;详细信息: quot; . $fedex_details . quot;\nquot;;// echo quot;递送日期: quot; . $delivery_date . quot;\nquot;;// echo quot;送货时间: quot; . $delivery_time . quot;\nquot;;// } else {// echo quot;错误或未找到跟踪信息。\nquot;;// print_r($decoded_response);// }?gt;登录后复制

代码解析:$headers = [];: 移除了'Content-Type' =gt; 'application/json'头。当您向Requests::post()方法提交一个关联队列作为请求体时,它会默认将其编码为application/x-www-form-urlencoded,并自动设置正确的Content-Type头。"data" =gt; json_encode([...]):这是最关键的。我们不再对整个$数据队列进行json_encode,而是只对data键对应的值(即TrackPackagesRequest的完整结构)进行json_encode。这样,外部的$数据队列仍然被Requests库编码为可以数据的表单,而内部的数据字段则包含正确的JSON字符串。$response = Requests::post($url, $headers, $data);:Requests库会负责将$data迁移转换为key1=value1amp;key2=value2的形式,并自动设置Content-Type:application/x-www-form-urlencoded。

注意事项与总结API文档是金标准:在进行API集成或跨语言转换时,始终优先查看API的官方文档,了解其期望的请求体格式(application/x-www-form-urlencoded、application/json、multipart/form-data等)和Content-Type头。库行为差异:不同的HTTP客户端库在处理请求体参数时可能有不同的默认行为。Python的请求库区分数据和json参数,而PHP的请求库则主要通过第三个参数的类型来判断。调试是关键:当遇到API错误时,仔细检查请求发送的实际内容(使用代理工具如Wireshark、Fiddler或Burp Suite,或库自带的调试功能)与API所需的格式是否一致,是问题的最有效方法。编码:本例展示了一种预览编码的:场景外层是URL编码的表单数据,内层某些字段的值是JSON编码的字符串。理解这种结构对于处理复杂API至关重要。

通过以上,PHP脚本将能够以与原始Python脚本简短的请求格式与FedEx修改API进行交互,从而成功获取包裹追踪信息。本案例也强调了在跨语言移植API调用逻辑时,深入理解HTTP请求协议和各语言HTTP客户端库的细节是多么重要。

以上就是Python FedEx追踪脚本转换PHP:正确处理POST请求体格式的详细内容,更多请关注乐哥常识网其他相关文章!

Python Fed
实现滚动吸顶效果:让Aside元素在容器内保持可见
相关内容
发表评论

游客 回复需填写必要信息