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

San*_*ngh 15 html post http

我将使用goo.gl进行URL缩短.我需要提出以下要求:

POST https://www.googleapis.com/urlshortener/v1/url
Content-Type: application/json
{"longUrl": "http://www.google.com/"}
Run Code Online (Sandbox Code Playgroud)

我的HTML: -

<form method="post" action="https://www.googleapis.com/urlshortener/v1/">
    <button type="submit"> submit </button>
</form>
Run Code Online (Sandbox Code Playgroud)

我如何在这里添加'content-type'和json?

Que*_*tin 22

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

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

Google提供了一个JavaScript库(包装XMLHttpRequest),可以与其URL Shortener API进行交互.


bap*_*ptx 7

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

但是,如果您只是想测试应用程序的安全性,看它是否容易受到CSRF攻击,那么就会发现将JSON数据作为纯文本发送,如本文所述:https://systemoverlord.com/ 2016/08/24 /张贴-JSON-与-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? redlocale = en-US & redctsctsg/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>
Run Code Online (Sandbox Code Playgroud)

但是,如果您尝试将enctype表单参数设置为"application/json"而不是"text/plain",则它将无法识别,并且将导致默认的"application/x-www-form-urlencoded"Content-Type HTTP标头.

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