FOSRest Symfony POST 使用 json
FOSRest Symfony POST using json
我是 symfony 框架的新手。我正在尝试使用 FOSRest 包创建 Web 服务,但是当我尝试使用 json.
为一个实体实现 POST 方法时遇到了问题
测试:
public function testJsonPostNewTesteAction(){
$this->client->request(
'POST',
'/api/teste/new',
array(),
array(),
array(
'Content-Type' => 'application/json',
'Accept' => 'application/json'
),
'{"Teste":{"title":"O teu title"}}'
);
$response = $this->client->getResponse();
$this->assertJsonResponse($response, Codes::HTTP_CREATED);
}
控制器:
/**
*
* @Config\Route(
* "/teste/new",
* name="postTestNew"
* )
* @Config\Method({"POST"})
*
* @param Request $request the request object
*
* @return View|Response
*/
public function postNewTeste(Request $request){
return $this->processFormTest($request);
}
/**
* Method for create the process form to Advertisements
*
* @param Request $request
*
* @return mixed
*/
private function processFormTest(Request $request){
$form = $this->createForm(
new TesteType(),
new Teste()
);
$form->bind($request);
//$from->handleRequest($request);
if ($form->isValid()) {
$test = $form->getData();
return $test;
}
return View::create($form, Codes::HTTP_BAD_REQUEST);
}
问题是当我使用 handleRequest() 时,方法 isValid() returns false 因为表单没有提交。所以我尝试将 handleRequest 更改为绑定方法。在最后一种情况下,方法 isValid() returns 为真,但方法 getData() returns 为空对象。
不知道是不是class下面的格式问题
输入表格:
/**
* The constant name to that type
*/
const TYPE_NAME = "Teste";
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options){
parent::buildForm($builder, $options);
$builder->add("title", ValidationType::TEXT);
}
/**
* {@inheritdoc}
*/
public function setDefaultOptions(OptionsResolverInterface $resolver){
$resolver->setDefaults(
array(
'csrf_protection' => false,
'cascade_validation' => true,
'data_class' => 'oTeuGato\DatabaseBundle\Entity\Teste'
)
);
}
/**
* Returns the name of this type.
*
* @return string The name of this type
*/
public function getName(){
return AdvertisementType::TYPE_NAME;
}
我需要 POST 两种方式的实体。有人对我的问题有什么建议吗?
感谢您的耐心等待!
我不完全确定,但我认为这是因为您发送的数据是:'Content-Type' => 'application/json'
代替'Content-Type' => 'application/x-www-form-urlencoded'
或者至少我认为这就是 handleRequest 没有执行它的原因。
表单绑定也有同样的问题,我发现解决它的唯一方法是将空字符串设置为表单 getName
函数:
/**
* Returns the name of this type.
*
* @return string The name of this type
*/
public function getName(){
return '';
}
我建议您在绑定数据时使用 handleRequest
方法,因为 bind
方法已弃用:
private function processFormTest(Request $request){
$form = $this->createForm(
new TesteType(),
new Teste()
);
$from->handleRequest($request);
if ($form->isValid()) {
$test = $form->getData();
return $test;
}
return View::create($form, Codes::HTTP_BAD_REQUEST);
}
它看起来更像是一种 hack,但似乎是目前唯一的方法:
https://github.com/FriendsOfSymfony/FOSRestBundle/issues/585
我是 symfony 框架的新手。我正在尝试使用 FOSRest 包创建 Web 服务,但是当我尝试使用 json.
为一个实体实现 POST 方法时遇到了问题测试:
public function testJsonPostNewTesteAction(){
$this->client->request(
'POST',
'/api/teste/new',
array(),
array(),
array(
'Content-Type' => 'application/json',
'Accept' => 'application/json'
),
'{"Teste":{"title":"O teu title"}}'
);
$response = $this->client->getResponse();
$this->assertJsonResponse($response, Codes::HTTP_CREATED);
}
控制器:
/**
*
* @Config\Route(
* "/teste/new",
* name="postTestNew"
* )
* @Config\Method({"POST"})
*
* @param Request $request the request object
*
* @return View|Response
*/
public function postNewTeste(Request $request){
return $this->processFormTest($request);
}
/**
* Method for create the process form to Advertisements
*
* @param Request $request
*
* @return mixed
*/
private function processFormTest(Request $request){
$form = $this->createForm(
new TesteType(),
new Teste()
);
$form->bind($request);
//$from->handleRequest($request);
if ($form->isValid()) {
$test = $form->getData();
return $test;
}
return View::create($form, Codes::HTTP_BAD_REQUEST);
}
问题是当我使用 handleRequest() 时,方法 isValid() returns false 因为表单没有提交。所以我尝试将 handleRequest 更改为绑定方法。在最后一种情况下,方法 isValid() returns 为真,但方法 getData() returns 为空对象。
不知道是不是class下面的格式问题
输入表格:
/**
* The constant name to that type
*/
const TYPE_NAME = "Teste";
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options){
parent::buildForm($builder, $options);
$builder->add("title", ValidationType::TEXT);
}
/**
* {@inheritdoc}
*/
public function setDefaultOptions(OptionsResolverInterface $resolver){
$resolver->setDefaults(
array(
'csrf_protection' => false,
'cascade_validation' => true,
'data_class' => 'oTeuGato\DatabaseBundle\Entity\Teste'
)
);
}
/**
* Returns the name of this type.
*
* @return string The name of this type
*/
public function getName(){
return AdvertisementType::TYPE_NAME;
}
我需要 POST 两种方式的实体。有人对我的问题有什么建议吗?
感谢您的耐心等待!
我不完全确定,但我认为这是因为您发送的数据是:'Content-Type' => 'application/json'
代替'Content-Type' => 'application/x-www-form-urlencoded'
或者至少我认为这就是 handleRequest 没有执行它的原因。
表单绑定也有同样的问题,我发现解决它的唯一方法是将空字符串设置为表单 getName
函数:
/**
* Returns the name of this type.
*
* @return string The name of this type
*/
public function getName(){
return '';
}
我建议您在绑定数据时使用 handleRequest
方法,因为 bind
方法已弃用:
private function processFormTest(Request $request){
$form = $this->createForm(
new TesteType(),
new Teste()
);
$from->handleRequest($request);
if ($form->isValid()) {
$test = $form->getData();
return $test;
}
return View::create($form, Codes::HTTP_BAD_REQUEST);
}
它看起来更像是一种 hack,但似乎是目前唯一的方法: https://github.com/FriendsOfSymfony/FOSRestBundle/issues/585