当前位置: 首页 > 知识库问答 >
问题:

无法发送json作为狂饮邮件体

白星渊
2023-03-14

这是为了与ecomdash api一起使用,因为使用此方法时,所有json字符串都必须用方括号括起来,就像有一个产品数组一样。因此,对于一系列产品来说,json_encode确实可以像预期的那样工作,但如果只更新一个产品,则必须手动在json周围添加方括号。因此,在设置请求时,必须使用body而不是json。这是最后一段有效的代码。

$data[] = array("Sku" => "067567", "Quantity" => 21, "WarehouseId" => 28345);
    $dataJson = json_encode($data);

    //put square brackets in if only one product is being updated
    if(count($data) == 1) {
      $dataJson = '['.$dataJson.']';
    }

    $headers = $this->auth;
    $headers['Content-Type'] = 'application/json';
    $params = array('headers' => $headers,
                    'json' => $data);

    $response = $this->client->request('POST', 'inventory/updateQuantityOnHand', array('headers' => $headers, 'body' => $dataJson));

    var_dump(json_decode($response->getBody(), true));
    die();
  }

我已经到处搜索,尝试了一百万件事,但我一直得到相同的错误时,试图发送json作为一个POST请求与狂饮。

我发送的标题只是我正在使用的api的凭据,它们正在处理其他请求,所以我不认为它们是问题。

以下是我使用过的一些代码。

$data = array("Sku" => "067567", "Quantity" => 10, "WarehouseId" => 
  28345);
$dataJson = json_encode($data, JSON_FORCE_OBJECT);
$headers = $this->auth;
$headers['Content-Type'] = 'application/json';
$params = array('headers' => $headers,
                'body' => $dataJson);

$response = $this->client-
   >post('inventory/updateQuantityOnHand',$params);



$data = array("Sku" => "067567", "Quantity" => 10, "WarehouseId" => 
  28345);
$headers = $this->auth;
$headers['Content-Type'] = 'application/json';
$params = array('headers' => $headers,
                'json' => $data);

$response = $this->client-
  >post('inventory/updateQuantityOnHand',$params);

我得到的错误是

致命错误:未捕获的GuzzleHttp\异常\客户端异常:客户端错误:POSThttps://ecomdash.azure-api.net/api/inventory/updateQuantityOnHand导致400错误请求响应:{"Message":"您的请求的正文丢失或无效","ExceptionMessage":"您的请求的正文丢失或无效","ExceptionType":"System. Invalid操作异常","StackTrace":null}(截断...)在 /Applications/MAMP/htdocs/sunglasses/libraries/vendor/guzzlehttp/guzzle/src/Exception/RequestEStack跟踪:#0 /Applications/MAMP/htdocs/sunglasses/libraries/vendor/guzzlehttp/guzzle/src/Middleware.php(65):GuzzleHttp\异常\请求异常::create(Object(GuzzleHttp\Psr7\Request), Object(GuzzleHttp\Psr7\响应))#1 /Applications/MAMP/htdocs/sunglasses/libraries/vendor/guzzlehttp/promises/src/Promise.php(203): GuzzleHttp\Middleware::GuzzleHttp{关闭}(Object(GuzzleHttp\Psr7\响应))#2 /Applications/MAMP /htdocs/sunglasses/libraries/vendor/guzzlehttp/promises/src/Promise.php(156): GuzzleHttp\Promis在 /Applications/MAMP/htdocs/sunglasses/libraries/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php111行

来自调试标志的信息

> POST /api/inventory/updateQuantityOnHand HTTP/1.1
Host: ecomdash.azure-api.net
User-Agent: GuzzleHttp/6.2.1 curl/7.52.1 PHP/7.1.8
Content-Type: application/json
ecd-subscription-key: *****************
Ocp-Apim-Subscription-Key: ****************
Content-Length: 50

* upload completely sent off: 50 out of 50 bytes
< HTTP/1.1 400 Bad Request
< Cache-Control: no-cache
< Pragma: no-cache
< Content-Length: 199
< Content-Type: application/json; charset=utf-8
< Expires: -1
< Request-Context: appId=cid-v1:6baf8227-a96f-4757-ac3b-a170d33a7b16
< Set-Cookie: ARRAffinity=5b826c9996f848edeab28288985b46ca9013ce4aef93b8f195bc66f2f91c578c;Path=/;HttpOnly;Domain=ecomdashapi.azurewebsites.net
< X-AspNet-Version: 4.0.30319
< X-Powered-By: ASP.NET
< Date: Wed, 07 Feb 2018 17:02:00 GMT
< 
* Curl_http_done: called premature == 0
* Connection #0 to host ecomdash.azure-api.net left intact

我使用的是Guzzle 6.2.1版

提前谢谢你的帮助,这真让我难受。

共有2个答案

司徒寒
2023-03-14
$client = new Client();
$URI = 'complete_url';
$params['headers'] = ['Content-Type' => 'application/json'];
$params = [
    'json' => [
       'kay1' => 'val1',
       'kay2' => 'val2',
     ]
    ];
$response = $client->post($URI, $params);
echo "<pre>";print_r(json_decode($response->getBody(),true));
echo "DONE!";
楚俊迈
2023-03-14

这是与ecomdash应用编程接口一起使用的,因为当使用这种方法时,所有JSON字符串都必须用方括号括起来,就像有一个产品数组一样。因此,这实际上与json_encode数组产品的预期效果一样,但是只有一个产品正在更新,您必须手动在JSON周围添加方括号。因此,在设置请求时,您必须使用正文而不是JSON。这是工作的最终代码

$data[] = array("Sku" => "067567", "Quantity" => 21, "WarehouseId" => 28345);
$dataJson = json_encode($data);

//put square brackets in if only one product is being updated
if(count($data) == 1) {
  $dataJson = '['.$dataJson.']';
}

$headers = $this->auth;
$headers['Content-Type'] = 'application/json';

$response = $this->client->request('POST', 'inventory/updateQuantityOnHand', array('headers' => $headers, 'body' => $dataJson));

var_dump(json_decode($response->getBody(), true));
    // die()
    die();
}
 类似资料:
  • 我想向Guzzle Http请求添加一些数据。有文件名、文件内容和带有授权密钥的头。 但我得到错误 可捕获的致命错误:传递给guzzle http \ PSR 7 \ multipart stream::add element()的参数2必须是数组类型,字符串给定,在vendor \ guzzle http \ PSR 7 \ src \ multipart stream . PHP的第70行调用

  • 我得到错误时,尝试发送邮件与YII::$app- 预期响应代码250,但得到代码535,消息535-5.7.8 用户名和密码不接受。 在535 5.7.8了解更多https://support.google.com/mail/?p=BadCredentials59sm3639427wrc.23- 以下是config/common.php文件中的参数: 我已经在雅虎账户设置中启用了“允许使用不太安全

  • 我的: 但是邮件不会发送到该地址,在控制台中,当我单击时,正在打印,但它不会发送任何电子邮件。 我用的是Django 1.3.7和Python 2.6。 不知道是版本的问题还是什么逻辑问题。

  • 我有这个发邮件的密码 此代码为除之外的任何邮件提供商发送邮件。 这可能是什么原因

  • 我目前有一个邮件服务器正在运行。我可以通过 mywebsite.com/roundcube/ 从这个网站我可以发送和接收电子邮件适当。日志显示所有的邮件进出都很好。我从这里发到我的gmail账户,然后又发回来。 然而,我真正想做的是使用javax mail从java发送一些邮件。

  • 我正在尝试使用从hotmail帐户发送邮件。 到目前为止,我还使用gmail帐户测试了我的代码,一切都很好,但使用hotmail没有任何特别的工作,我收到了。 这是我用来发送邮件的代码: 如您所见,我创建了一个PropertiesFactory,以便为我使用的每个特定邮件主机创建Properties对象的特定实例。在代码中有HotmailProperties结构的工厂。 开始调试会话时,我检查了u