Laravel中RajaOngkir接口返回数据的目标对象提取问题
问题:无法从第三方运费API提取正确的数据对象
我最近在做一个基于RajaOngkir的运费计算配送功能,所有编码、价格这类数据都存在第三方平台,本地数据库没存。现在遇到个麻烦事——我没法从API返回的结果里提取到需要的数据对象!下面是我的代码和调试情况:
控制器代码
public function index() { $province = RajaOngkir::Provinsi()->all(); // 这部分返回的数据是正常的(对应我截图里的dd结果) $cost = RajaOngkir::Cost([ 'origin' => 501, // 出发城市ID 'destination' => 114, // 目标城市ID 'weight' => 1000, // 重量(单位:克) 'courier' => 'jne', // 快递公司编码(jne/tiki/pos) ])->get(); return view('welcome', compact('province', 'cost')); }
Blade视图代码
@foreach($cost as $option) {{$option['code']}} <br> {{$option['name']}} @endforeach
调试情况
我试着在循环里加了{{dd($option)}}查看单条数据的结构,结果发现循环返回的内容和调试看到的结构完全对不上,就是拿不到我要的code和name字段。
可能的解决方案
RajaOngkir的Cost API返回的是嵌套层级结构,你直接拿到的$cost其实是包含顶层响应节点的完整数据,而不是直接的快递选项列表。你需要先定位到正确的数据层级再进行遍历。
步骤1:先确认完整的响应结构
先在控制器里打印整个$cost的结构,搞清楚数据嵌套关系:
public function index() { $province = RajaOngkir::Provinsi()->all(); $cost = RajaOngkir::Cost([ 'origin' => 501, 'destination' => 114, 'weight' => 1000, 'courier' => 'jne', ])->get(); dd($cost); // 打印完整响应,确认层级 return view('welcome', compact('province', 'cost')); }
根据RajaOngkir官方的返回格式,快递选项列表通常在$cost['rajaongkir']['results'][0]['costs']这个层级里(results里的第一个元素对应你指定的快递公司,costs就是具体的配送服务选项)。
步骤2:提取正确的数据集
修改控制器代码,把真正的配送选项数组提取出来再传给视图:
public function index() { $province = RajaOngkir::Provinsi()->all(); $response = RajaOngkir::Cost([ 'origin' => 501, 'destination' => 114, 'weight' => 1000, 'courier' => 'jne', ])->get(); // 提取配送服务选项列表(根据实际打印的结构调整层级) $cost = $response['rajaongkir']['results'][0]['costs']; return view('welcome', compact('province', 'cost')); }
步骤3:调整视图的字段访问
RajaOngkir的costs数组里,每个选项的编码是service字段,名称是description字段,所以视图要改成:
@foreach($cost as $option) {{$option['service']}} <br> {{$option['description']}} @endforeach
如果你的SDK返回的是对象而不是数组,那就要用对象属性访问的方式,比如$option->service和$option->description。
内容的提问来源于stack exchange,提问作者mafortis
相关产品推荐
相关产品推荐

