初次接触Yii2框架,记录一下开发中碰到的问题,Yii2框架POST请求,setHeader一直无法修改Content-Type,使用了如下代码
$this->request_header[] = 'timestamp:'.$timestamp;
$this->request_header[] = 'sign:'.$signStr;
$this->request_header[] = "Content-Type: application/json";
$result = \Yii::$app->http
->post($url)
->setData($params)
->setHeaders($this->request_header)
->send();
一直无法调通程序,日志中显示
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
查看Client源码,发现类似于设置格式的地方,
/**
* JSON format
*/
const FORMAT_JSON = 'json';
/**
* urlencoded by RFC1738 query string, like name1=value1&name2=value2
* @see http://php.net/manual/en/function.urlencode.php
*/
const FORMAT_URLENCODED = 'urlencoded';
/**
* urlencoded by PHP_QUERY_RFC3986 query string, like name1=value1&name2=value2
* @see http://php.net/manual/en/function.rawurlencode.php
*/
const FORMAT_RAW_URLENCODED = 'raw-urlencoded';
/**
* XML format
*/
const FORMAT_XML = 'xml';
/**
* CURL format
* @since 2.0.9
*/
const FORMAT_CURL = 'curl';
不过只看到了getFormatter()方法,所以尝试了一下能否修改Set
public function getFormatter($format)
{
static $defaultFormatters = [
self::FORMAT_JSON => 'yii\httpclient\JsonFormatter',
self::FORMAT_URLENCODED => [
'class' => 'yii\httpclient\UrlEncodedFormatter',
'encodingType' => PHP_QUERY_RFC1738
],
self::FORMAT_RAW_URLENCODED => [
'class' => 'yii\httpclient\UrlEncodedFormatter',
'encodingType' => PHP_QUERY_RFC3986
],
self::FORMAT_XML => 'yii\httpclient\XmlFormatter',
self::FORMAT_CURL => 'yii\httpclient\CurlFormatter',
];
if (!isset($this->formatters[$format])) {
if (!isset($defaultFormatters[$format])) {
throw new InvalidParamException("Unrecognized format '{$format}'");
}
$this->formatters[$format] = $defaultFormatters[$format];
}
if (!is_object($this->formatters[$format])) {
$this->formatters[$format] = Yii::createObject($this->formatters[$format]);
}
return $this->formatters[$format];
}
最终代码如下
$result = \Yii::$app->http
->post($url)
->setData($params)
->setFormat('json')
->setHeaders($this->request_header)
->send();
请求成功,记录一下,新手填坑