【问题标题】:How do I present data as part url param, part json object?如何将数据呈现为部分 url 参数、部分 json 对象?
【发布时间】:2014-03-28 07:59:05
【问题描述】:

我们有一个名为 Create 的 API 方法,它以 JSON 格式接收以下数据

 {data: 
      {
        "token":"73264280-be3f-4f5b",
        "BuildingDisplay":"Fire Station 21 Fairburn - 19 East Broad St.",
        "CallerEmail":"Jim.Parker@yahoo.com",
        "CallerFax":"",
        "CallerFirstName":"Jim",
        "CallerLastName":"Parker",
        "CallerMiddleInitial":"",
        "CallerOtherPhone":"",
        "CallerState":"",
        "CallerWorkPhone":"918-354-2874"}}

有人可以说明如何让 API 接收以下格式的数据:

http://folder/users/Create?data={"BuildingDisplay":"Fire Station 21 Fairburn - 19 East Broad St.",
        "CallerEmail":"Jim.Parker@yahoo.com",
        "CallerFax":"",
        "CallerFirstName":"Jim",
        "CallerLastName":"Parker",
        "CallerMiddleInitial":"",
        "CallerOtherPhone":"",
        "CallerState":"",
        "CallerWorkPhone":"918-354-2874"}&token=73264280-be3f-4f5b

非常感谢。

 $.ajax({
 type: "POST",
 url: "proxyCheck.php",
 data: '{data: ' + JSON.stringify(myData) + '}',
 contentType: "application/json;charset=utf-8",
 dataType: "json",
 async: false,
 success: function (response) {
 alert("Record has been added successfully.");
 window.location.reload();
 }
 });
  return false;
 }

//然后是proxyCheck.php:

  <?php

 //DESCRIPTION: Allow Ajax scripts to request content from a web service they otherwise may not be able to. 

 $ch = curl_init("http://Users/Services/Create");
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt ($ch, CURLOPT_POSTFIELDS, $_POST);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $output = curl_exec($ch);
    curl_close($ch);
    echo $output
  ?>

【问题讨论】:

  • 为什么不在 HTTP POST 正文中获取 JSON 数据参数?为什么需要 HTTP GET?
  • @AlexP,我以为我在使用 POST 方法?
  • 那么你的问题是如何通过jquery跨域请求提交这些数据?当您在 URL 中编写此 JSON 数据时,您实际上是在尝试通过 GET 提交它。使用jsonp,您可以使用 GET 而不会感到头疼。对于 POST,您需要使服务器支持 CORS。
  • @ALexP,我很抱歉我太担心过于冗长而失去我的听众,以至于我没有提供所有需要的信息。我们有一个名为 proxyCheck.php 的文件。该文件有助于解决跨域问题。因此,ajax 将 json 数据发布到 proxyCheck.php,而 proxyCheck.php 又将数据发布到 Create API 方法。我已经更新了上面的代码,看看我们是如何做到的。
  • 只要有条理并包含相关代码和标签,就不用担心太罗嗦了。例如,jsonp 与此问题无关。我认为当您从 POST(从 Ajax 获得)获取参数并将其转换为后续 GET 请求时,您需要专注于您的 PHP 代码。顺便问一下,Create 服务不能从 POST 正文中提取所有这些参数吗?

标签: php jquery ajax api jsonp


【解决方案1】:

我认为这样可以解决问题:

$.ajax({
  type: "POST",
  url: "proxyCheck.php",
  data: {data: JSON.stringify(myData)},
  contentType: "application/json;charset=utf-8",
  dataType: "json",
  async: false,
  success: function (response) {
    alert("Record has been added successfully.");
    window.location.reload();
  }
});

编辑: 澄清一下,如果你想要 URL 中的参数,你需要使用type: "GET"。 对于 JSON,您将值字符串化,但您希望 ajax data 参数像往常一样成为对象。 jQuery 将遍历 data 中的所有键并将它们附加到查询字符串中。

请注意,您可以打包到查询字符串中的数据量有一些上限,但我认为您在现代浏览器的上限范围内。

第二次编辑:代理使用 POST,所以它必须是 POST。

【讨论】:

  • 不幸的是,它不起作用。这是您的解决方案显示的内容:proxyCheck.php?{data:%20{%22Token%22:%226f44bba1-69ab-4c92-93e5-537fff732548%22,%. First, this is not JSON formatted. Second, it needs pass these values to the Create method so the Create method receives the data in the following format: Create?data={"name": "john doe", etc}&token=aaaaaaaa`
  • 抱歉,我相信我误读了重定向层。您显示带有查询字符串 (GET) 的 URL,但您似乎两次都引用 POST。您的代理需要 POST 吗?
  • 我已经测试了data: { data: JSON.stringify(myData) },并且按照我的预期格式化了数据。根据 $_POST,看来您至少需要 POST 到代理,但您提供的 API 示例建议 API 使用 GET。
  • 如果API需要get,你不会使用CURLOPT_POSTFIELDS,你需要将数据连接到URL上,像这样:`curl_init("Users/Services/Create?" . $ _POST);
  • 当我使用 ff 测试你的时,proxyCheck.php 文件显示我之前发布的数据,其中包含一堆 %22 等。因此,API 返回以下错误:` {" Value":null,"Status":2,"Message":"No auth token provided."}` 所以,它没有看到令牌。
猜你喜欢
  • 2020-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
相关资源
最近更新 更多