首页 > 解决方案 > 在 Laravel 5.7 中使用 Guzzle 6 在 Sage API 3.1 上工作时缺少请求正文

问题描述

根据 SAGE API 3.1手册,要创建发票,您必须通过以下内容:

POST /sales_invoices
Content-Type: application/json
Accept: */*

{
  "sales_invoice": {
    "contact_id": "14d93840783b11e8990a122c8428e4b2",
    "date": "2018-06-24",
    "invoice_lines": [
      {
        "description": "A Minimal Invoice Item",
        "ledger_account_id": "4195173e75db11e8990a122c8428e4b2",
        "quantity": "1",
        "unit_price": "0.99",
        "tax_rate_id": "584793ca75db11e8990a122c8428e4b2"
      }
    ]
  }
}

好吧,在我的代码上

$client = new Client();

$endpoint = $this->endpoint.'/'.$this->action; // https://api.accounting.sage.com/v3.1/sales_invoices

$response = $client->post($endpoint, [
                'headers' => [
                    'Accept' => 'application/json',
                    'Authorization' => 'Bearer '.$this->token // My token valid
                ],
                'form_params' => $this->params
            ]);

我的参数

"sales_invoice" => array:3 [
    "contact_id" => "a39b46d1cb8a4f5a9048c32f7895147c"
    "date" => "2018-03-04"
    "invoice_lines" => array:1 [
      0 => array:5 [
        "description" => "Factura creada por error"
        "ledger_account_id" => "49131457ee4f11e8ae720268dc652fba"
        "quantity" => "1"
        "unit_price" => "0"
        "tax_rate_id" => "ES_EXEMPT"
      ]
    ]
  ]
]

并且 Guzzle 扩展错误显示sales_invoice[invoice_lines]缺失值的问题。

[{
    "$severity": "error",
    "$dataCode": "Validation",
    "$message": "sales_invoice[invoice_lines] is invalid",
    "$source": "sales_invoice[invoice_lines]"
}, {
    "$severity": "error",
    "$dataCode": "Validation",
    "$message": "sales_invoice[invoice_lines] is invalid",
    "$source": "sales_invoice[invoice_lines]"
}, {
    "$severity": "error",
    "$dataCode": "Validation",
    "$message": "sales_invoice[invoice_lines] is invalid",
    "$source": "sales_invoice[invoice_lines]"
}, {
    "$severity": "error",
    "$dataCode": "Validation",
    "$message": "sales_invoice[invoice_lines][0][description] is missing",
    "$source": "sales_invoice[invoice_lines][0][description]"
}, {
    "$severity": "error",
    "$dataCode": "Validation",
    "$message": "sales_invoice[invoice_lines][0][ledger_account_id] is missing",
    "$source": "sales_invoice[invoice_lines][0][ledger_account_id]"
}, {
    "$severity": "error",
    "$dataCode": "Validation",
    "$message": "sales_invoice[invoice_lines][0][unit_price] is missing",
    "$source": "sales_invoice[invoice_lines][0][unit_price]"
}]

这段代码有什么问题?

标签: laravelguzzle6

解决方案


与其通过 发送它form_params,不如将有效负载发送为json

$response = $client->post($endpoint, [
    'headers' => [
         'Authorization' => 'Bearer '.$this->token // My token valid
    ],
    'json' => $this->params
]);

内容类型标头application/json会自动添加。


推荐阅读