当我想在zf2客户端代码中使用“application / json”时,接受请求标头是“text / html,application / xhtml ...(etc)”

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当我想在zf2客户端代码中使用“application / json”时,接受请求标头是“text / html,application / xhtml ...(etc)”相关的知识,希望对你有一定的参考价值。

我有一个完整的API设置,我设置的zf2客户端理论上工作,但无论如何,我似乎无法从我的客户端向API发送JSON请求。每当我测试它时,我会不断收到以下标题,这反过来会返回406错误:

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.5
Connection: keep-alive
Host: zf2-client.local
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:43.0) Gecko/20100101 Firefox/43.0 Firephp/0.7.4
x-insight: activate

现在这是我正在使用的类,以下是我的请求设置方法。我已经做了一些试验以获得标题,但它们只是不起作用,我无法弄清楚为什么。正如我所说的那样,我消耗的API通常会返回一个非常精细的json脚本,但是现在看来标题使得我无法获得必要的信息。

protected static function doRequest($url, array $postData = null, $method = Request::METHOD_GET)
{
    $client = self::getClientInstance();
    $client->setUri($url);
  /*
 Third attempt Also Didn't work

 $client
     ->setHeaders([
     'Content-Type' => 'application/json',
     ])
     ->setOptions(['sslverifypeer' => false])
     ->setMethod('POST')
     ->setRawBody(Json::encode($params));
   */
  $client->setMethod($method);


  /* 
 seccond attempt still not working

 $client->setHeaders(array(
 ZendHttpHeaderAccept::fromString('Accept: application/json'),
 'Accept-Encoding' => 'json',
 'X-Powered-By: Zend Framework',
 ));
  */

  //first attempt at adding a working application/json header      
  // $acceptHeader = ZendHttpHeaderAccept::fromString('Accept: application/json');
  //$client->getHeaders()->addHeader($acceptHeader);

    if ($postData !== null) {
        $client->setParameterPost($postData);
    }

    $response = $client->send();

    if ($response->isSuccess()) {
        return JsonDecoder::decode($response->getBody(), Json::TYPE_ARRAY);
    } else {
        $logger = new Logger;
        $logger->addWriter(new Stream('data/logs/apiclient.log'));
        $logger->debug($response->getBody());
        return FALSE;
    }
}

欢迎任何和所有帮助。谢谢你的时间和精力:)

答案

The 406 response code表示您已使用服务器无法满足的Accept标头发出请求。

由于您正在使用提供json响应的Rest API,因此您很可能需要发送包含Accept媒体类型的application/json标头:

Accept: application/json

或者将其添加到当前接受标头中的媒体类型列表中。

Accept: application/json,text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

由于您未在客户端提供任何详细信息,因此我无法帮助您。为您的问题添加所有相关详细信息以获得完整答案非常重要。我可以举个例子,以防你使用XMLHttpRequest

var xhr = new XMLHttpRequest();
xhr.setRequestHeader ("Accept", "application/json");

您也可以在像PostMan这样的工具中测试它。

更新:

我注意到在ZF2中向标题添加标题时与您的问题类似的问题。你能做的就是这样尝试一次:

// get the headers from your client
$headers = $client->getHeaders();
// add the new accept header
$headers->addHeader($acceptHeader);
// set new headers object with the added accept header.
$client->setHeaders($headers);

我必须同意你的问题的评论,看来你正在处理的这个请求来自浏览器,而不是来自你的客户端对象。如果是这种情况,您应该在浏览器端添加accept-header。

以上是关于当我想在zf2客户端代码中使用“application / json”时,接受请求标头是“text / html,application / xhtml ...(etc)”的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 ZF2 FormElementManager 将 Doctrine ObjectManager 传递给表单

如何从 zf2 框架应用程序启动 REST 客户端

检索表单时更改 ZF2 表单行为

ZF2 : 来自路由的参数在提交表单后被清除

如何将 ZF2 单元/应用程序模块测试合并到单个调用中?

ZF2中获取mysql表字段名