【问题标题】:Can't hit Web API from php无法从 php 访问 Web API
【发布时间】:2018-07-25 07:07:24
【问题描述】:

我正在尝试调用它

    [Route("CreateHL7TestFile")]
    [HttpPost]
    public IActionResult CreateHL7TestFile([FromBody] JObject data)
    {
     // Code here
     }

来自使用 cUrl 的 php 函数。当我尝试在不传递任何数据的情况下调用 API 时,它工作正常。当我尝试添加无法访问 API 的“$data”时。当我使用来自 Postman 的数据调用 API 时,它也可以正常工作。所以我假设我的错误是在 php 方面?

我的php函数长这样。

  public function CallAPI($method, $url, $data = false)
  {         
   $data = array("value1" => "some value");

 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_POST, 1);
 curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
  curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
 curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('test1' => 'value1', 'test2' => 'value2')));

 $result = curl_exec($ch);

 print_r($result);
 curl_close($ch); 

}

http://localhost:50999/api/ParticipantAPI/CreateHL7TestFile

任何帮助将不胜感激。 谢谢, 亚当

【问题讨论】:

  • 你能用邮递员显示你发送的内容吗?如果它是一个body,它必须是key value
  • 我实际上有一个我打算传递的数组,但我只想让一个值首先工作。我的价值是我从 Postman 传入的只是 { "HL7":"TEST" } 即使我使用 $dat = array("HL7" => "TEST"); 创建 php 数组时也是如此。我还是打不中。
  • 有没有更好的方法让我接受 Web API 端的调用?
  • 查看我的回答朋友,看看是否有帮助,api 看起来不错,这取决于您是否期望某种类型或结构。
  • @brachen33 显示被调用的 URL 并在 minimal reproducible example 中显示动作控制器,可用于重现问题

标签: php json asp.net-core-webapi


【解决方案1】:

在 asp.net-core 服务器上使用合适的模型来绑定传入的数据

public class MyData {
    public string value1 { get; set;}
}

并相应地更新操作

[Route("CreateHL7TestFile")]
[HttpPost]
public IActionResult CreateHL7TestFile([FromBody] MyData data) {
    // Code here
}

参考以下文章POSTing JSON Data With PHP cURL

在 PHP 端尝试以下操作

$data = array("value1" => "some value");                                                                    
$data_string = json_encode($data);                                                                                   

$ch = curl_init($url);                                                                      
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                     
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);                                                                  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                                                                      
curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
    'Content-Type: application/json',                                                                                
    'Content-Length: ' . strlen($data_string))                                                                       
);                                                                                                                   

$result = curl_exec($ch);

print_r($result);
curl_close($ch); 

对于您的实际请求,相应地重构预期的数据模型。

【讨论】:

    【解决方案2】:

    试试这样的:

    public function CallAPI($method, $url, $data = false)
       {         
         $ch = curl_init();
         curl_setopt($ch, CURLOPT_URL, $url);
         curl_setopt($ch, CURLOPT_POST, 1);
         curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('test1' => 'value1', 'test2' => 'value2')));
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
         $result = curl_exec($ch);
    
         print_r($result);
         curl_close($ch); 
    }
    

    http://php.net/manual/en/function.http-build-query.php

    如果您想发送 json,那么我认为您必须设置标头,例如:

    public function CallAPI($method, $url, $data = false)
       {         
         $dat = array("TEST1","TEST2");     
         $data = json_encode($dat);        
         $ch = curl_init();
         curl_setopt($ch, CURLOPT_URL, $url);
         curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
         curl_setopt($ch, CURLOPT_POST, 1);
         curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
         $result = curl_exec($ch);
    
         print_r($result);
         curl_close($ch);     
    }
    

    【讨论】:

    • 还是什么都没有。我的 $result 只是返回为 true,但它没有达到它,因为它没有达到 API 中的断点。
    • 你尝试过哪些?第一个应该工作。添加 curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));到我的第一个例子
    猜你喜欢
    • 1970-01-01
    • 2022-10-31
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    相关资源
    最近更新 更多