加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 强制服务返回json而不是默认的html

发布时间:2020-12-13 16:00:11 所属栏目:PHP教程 来源:网络整理
导读:我希望能够在php中编写相当于此curl命令的代码: curl -F out=json --form-string 'content=!DOCTYPE htmlhtmlheadtitlecheck it/title/headbody/body/html' http://validator.w3.org/nu/ 这个curl命令按预期返回json. 也许我在这里遗漏了他们的文档: https
我希望能够在php中编写相当于此curl命令的代码:

curl -F out=json --form-string 'content=<!DOCTYPE html><html><head><title>check it</title></head><body></body></html>' http://validator.w3.org/nu/

这个curl命令按预期返回json.
也许我在这里遗漏了他们的文档:
https://github.com/validator/validator/wiki/Service:-Input:-POST-body和https://github.com/validator/validator/wiki/Service%3A-HTTP-interface

我现在的问题是Web服务返回html而不是json.
虽然我将标题接受设置为json但它不起作用.我还试图设置accept和Content-Type,但是这会触发来自Web服务的错误,说明无效输入.以下是我需要您帮助的代码:

$html = "<!DOCTYPE html><html><head><title>test</title></head><body></body></html>";
$endPoint = "http://validator.w3.org/nu/";
$timeout = 5000;
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$endPoint);
curl_setopt($ch,CURLOPT_TIMEOUT_MS,$timeout);
curl_setopt($ch,CURLOPT_POST,true);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);  
curl_setopt($ch,CURLOPT_BINARYTRANSFER,true);
//curl_setopt($ch,CURLOPT_HTTPHEADER,array('Accept: application/json','Content-Type: application/json'));
curl_setopt($ch,array('Accept: application/json'));
curl_setopt($ch,CURLOPT_POSTFIELDS,array('content' => $html,'out' => 'json'));
$output = curl_exec($ch);
if(curl_errno($ch))
{
    echo curl_error($ch);
}
curl_close($ch);    
error_log(__FILE__. ": " . __LINE__ . ": " . var_export($output,true));
echo $output;

阅读Ignacio问题后,我将从w3c文档页面更新此信息:

在他们的文档中他们说html字符串应该在http体中发送,在他们的java库中他们使用这个:

String response = null;
String source = "your html here";
HttpResponse<String> uniResponse = Unirest.post("http://localhost:8080/vnu")
    .header("User-Agent","Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/41.0.2272.101 Safari/537.36")
    .header("Content-Type","text/html; charset=UTF-8")
    .queryString("out","gnu")
    .body(source)
    .asString();
response = uniResponse.getBody();

这可能是你的暗示吗?只是为了让你知道我试过了两个

http://validator.w3.org/nu/?out=json

http://validator.w3.org/nu/

端点(作为上面php脚本中$endPoint变量的值).

解决方法

要获得您要查找的结果,您必须将数据作为multipart / form-data发送(您可以查看 validator page或curl发送的请求,以查看数据是作为multipart / form-data发送的)为此,以此为例:

$url = 'http://validator.w3.org/nu/';
$html = '<!DOCTYPE html><html><head><title>test</title></head><body></body></html>';

$boundary = 'your-boundary'; 

$body = '--' . $boundary . "rn";
// set the "out" as "json"
$body .= 'Content-Disposition: form-data; name="out"' . "rn" . "rn";
$body .= 'json' . "rn";
$body .= "--" . $boundary ."rn";
// set the "content"
$body .= 'Content-Disposition: form-data; name="content"' . "rn" . "rn";
$body .= $html . "rn";
$body .= "--" . $boundary . "--" . "rn" . "rn";

$ch = curl_init();
curl_setopt($ch,$url);
curl_setopt($ch,array('Content-Type: multipart/form-data; boundary='.$boundary));
curl_setopt($ch,$body);

echo curl_exec($ch);
curl_close($ch);

然后你会得到这样的东西:

{
    "messages": [{
            "type": "info","message": "The Content-Type was “text/html”. Using the HTML parser."
        },{
            "type": "info","message": "Using the schema for HTML with SVG 1.1,MathML 3.0,RDFa 1.1,and ITS 2.0 support."
        }],"source": {
        "type": "text/html","encoding": "utf-8","code": "<!DOCTYPE html><html><head><title>test</title></head><body></body></html>"
    }
}

希望能有所帮助.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读