发布请求以包含“Content-Type”和 JSON

问题描述 投票:0回答:5

我将与 goo.gl 合作进行 URL 缩短。我需要提出以下要求:

POST https://www.googleapis.com/urlshortener/v1/url
Content-Type: application/json
{"longUrl": "http://www.google.com/"}

我的html:-

<form method="post" action="https://www.googleapis.com/urlshortener/v1/">
    <button type="submit"> submit </button>
</form>

如何在此处添加“内容类型”和 json?

html http post
5个回答
24
投票

浏览器不支持 JSON 作为表单提交的媒体类型(支持的类型在规范中列出)。

从网页发出此类请求的唯一方法是使用 XMLHttpRequest 对象。

Google 提供 一个 JavaScript 库(包装 XMLHttpRequest),可以与他们的 URL Shortener API 交互。


10
投票

HTML 表单不支持 JSON,必须使用 AJAX 发送 JSON。

但是,如果您只是想测试应用程序的安全性,看看它是否容易受到 CSRF 攻击,可以使用一种 hack 以纯文本形式发送 JSON 数据,如本文所述:https://systemoverlord。 com/2016/08/24/posting-json-with-an-html-form.html

HTML 表单的优点是不需要启用 JavaScript,并且不像 AJAX XMLHttpRequest 那样具有同源策略保护,因此 HTML 表单可以将数据发送到任何第三方域。 事实上,看起来也可以使用 XMLHttpRequest 向第三方域发送 GET 和 POST 请求(您只会收到一条警告,指出您无法读取响应),即使 CORS 不允许,只要您不要将 Content-Type 标头更改为“application/json”:https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS?redirectlocale=en-US&redirectslug=HTTP_access_control#Examples_of_access_control_scenarios

以下是文章中的示例:

<body onload='document.forms[0].submit()'>
  <form method='POST' enctype='text/plain'>
    <input name='{"secret": 1337, "trash": "' value='"}'>
  </form>
</body>

但是,如果您尝试将 enctype 表单参数设置为“application/json”而不是“text/plain”,它将无法被识别,并且会导致默认的“application/x-www-form-urlencoded”内容-输入 HTTP 标头。

某些应用程序会检查 Content-Type HTTP 标头是否为“application/json”,因此它将防止 CSRF 攻击(除非您安装了 Flash Player:https://www.geekboy.ninja/blog/exploiting-json -跨站点请求伪造-csrf-使用-flash/)。更好的安全性是使用真实性令牌,即使数据类型不是 JSON,这也会保护 HTTP 请求。否则,也可以在会话 ID cookie 上使用 SameSite 属性来防止 CSRF (https://www.owasp.org/index.php/SameSite)。


1
投票

使用 Ajax 请求让生活变得更加轻松。

    $.ajax({
          url: 'https://www.googleapis.com/urlshortener/v1/url',
          type: 'POST',
          data: JSON.stringify({
            longUrl: $scope.url
          }),
          contentType: 'application/json',
          success: function(got) {
            return alert("shortened url: " + got.id);
          }
    });

以上效果完美。


1
投票

可以通过 Javascript 从浏览器发出 JSON POST 请求

  • 大多数浏览器(从 2020 年开始应该支持 Fetch API)允许您使用 JSON 发出 POST 请求。 请参阅此处的 MDN 参考 - 但当然,您必须在 javascript 中执行此操作。

0
投票
@I'm to work with goo.gl for URL shortening. I need to make the following request:

Your HTML should be

<form method="post" action="https://www.googleapis.com/urlshortener/v1/" enctype="application/json">
    <button type="submit"> submit </button>
</form>

In a POST request, resulting from an HTML form submission, the Content-Type of the request is specified by the **enctype** attribute on the <form> element and as you have mentioned your content-type is Content-Type: application/json so need to add enctype="application/json" in HTML code.
© www.soinside.com 2019 - 2024. All rights reserved.