【问题标题】:post request with json data cross domain使用 json 数据跨域发布请求
【发布时间】:2024-01-02 01:05:01
【问题描述】:

我已经阅读教程两天了,我真的不明白我的选择是什么。我有一台带有 HMI 的机器运行 Web 服务器(我不知道那是什么类型的 Web 服务器)。我可以使用 json 数据通过 POST 请求访问 HMI 标签值。 请求示例如下所示

$( document ).ready(function() {      
    var data0 = {"getTags":["Start_dav","CutON","run_rot_actual"],"includeTagMetadata":true};     
    var json = JSON.stringify(data0 );

           $.ajax({
                url: "http://ipaddress/tagbatch",
                type: "POST",
                dataType: "json",
                data: json,

响应是json数据。

问题当然出在跨域策略上。我无法控制机器,也没有设置 CORS 的选项。我已阅读有关代理、iframe 和 yql 解决方案的信息,但据我了解,我无法使用这些解决方法发送 json 数据。有没有办法用json跨域发送post请求?

感谢您的帮助

【问题讨论】:

    标签: json ajax post cross-domain httprequest


    【解决方案1】:

    我找到了解决方案。我正在使用 php curl 发送请求。

    这是工作代码:

    $data = array("getTags" => array("Var1","Var2"), "includeTagMetadata" => false);                                                                    
    $data_string = json_encode($data);
    $agent= 'Mozilla/5.0 (Windows; U;Windows NT 5.1; ru; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9';
    //open connection
    $ch = curl_init();
    $f = fopen('request.txt', 'w'); //writes headers to this file
    //set the url, number of POST vars, POST data
    curl_setopt($ch,CURLOPT_URL,"domainipaddress");
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); 
    curl_setopt($ch,CURLOPT_POSTFIELDS,$data_string);
    $tmpfname = dirname(__FILE__).'/cookie.txt'; //saves the cookie from server
    curl_setopt($ch, CURLOPT_COOKIEJAR, $tmpfname);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $tmpfname);
    curl_setopt($ch, CURLOPT_ENCODING, '');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER , false);
    curl_setopt($ch, CURLOPT_USERAGENT, $agent);
    curl_setopt( $ch, CURLOPT_AUTOREFERER, true );
    curl_setopt( $ch,  CURLOPT_VERBOSE,  1 ); 
    curl_setopt( $ch,  CURLOPT_STDERR,  $f );
    curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
    curl_setopt($ch, CURLOPT_FORBID_REUSE, false);                                                                    
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                        
        'Content-Type: application/json',                                                                                
        'Content-Length: ' . strlen($data_string),
           'Connection: keep-alive',
           "Keep-Alive: 300"
        )                                                                       
    );  
    
    //execute post
    $result = curl_exec($ch);
    $headers = curl_getinfo($ch);
    fclose($f);
    

    【讨论】: