这两个电话有什么区别?我的最终目标是通过网络
Accept: application/json发送,而不是附加到一些默认的其他MIME类型集.
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Accept", "application/json");
Run Code Online (Sandbox Code Playgroud)
与
client.DefaultRequestHeaders
.Accept
.Add(new MediaTypeWithQualityHeaderValue("application/json"));
Run Code Online (Sandbox Code Playgroud)
我的CLR是.NET Core 2.0.
嗅探电线显示没有区别:
# just .Add("Accept"...
~ % nc -l 8000
GET / HTTP/1.1
Connection: Keep-Alive
Accept: application/json
[...]
# with MediaTypeWithQualityHeaderValue
~ % nc -l 8000
GET / HTTP/1.1
Connection: Keep-Alive
Accept: application/json
[...]
Run Code Online (Sandbox Code Playgroud)
那么,除了这种奇怪的命名之外,没有什么可以在这里获得的吗?
c# httpclient dotnet-httpclient http-accept-header .net-core-2.0
在喷涂中,我想根据给定的Accept标题响应不同的内容类型.我在rompetroll的问题中看到了一些建议,但我想听听是否有任何规范的方法(即简单或已经实现).
从本质上讲,我想象的应该是:
path("somepath") {
get {
// Find whatever we would like to return (lazily)
...
// Marshall resource and complete depending on the `Accept` header
...
}
}
Run Code Online (Sandbox Code Playgroud)
提前致谢.
我正在尝试设置我的api,以便根据Accept标头响应XML或JSON.
我正在关注Shawn W的教程:https://wildermuth.com/2016/03/16/Content_Negotiation_in_ASP_NET_Core
它说要添加一个包: "Microsoft.AspNet.Mvc.Formatters.Xml": "6.0.0-rc1-final"
但我无法找到它而是安装:
Microsoft.AspNetCore.Mvc.Formatters.Xml
他说要将它添加到Startup中的配置服务部分:
// Add framework services.
services
.AddMvc(options => {
options.RespectBrowserAcceptHeader = true;
options.InputFormatters.Add(new XmlSerializerInputFormatter());
options.OutputFormatters.Add(new XmlSerializerOutputFormatter());
}).AddJsonOptions(options => {
// Force Camel Case to JSON
options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
});
Run Code Online (Sandbox Code Playgroud)
然后浏览器自动接收XML,因为默认情况下它使用Accept:text/xml标头,我在浏览器中不使用XML或使用邮递员.无论我将Accept头设置为什么,我都会得到Json.
我试过戴上[Produces("application/xml")]我的控制器,它返回一个空白的200 OK页面.
如何让我的api默认返回Json,如果存在Accept,则返回XML?
编辑1:
我正在使用它作为我的http获取代码:
[HttpGet]
public IActionResult Get() {
var invoices = context.Invoices.ToList();
var mappedInvoices = mapper.Map<List<DomainModels.Invoice>, List<Invoice>>(invoices);
return Ok(mappedInvoices);
}
Run Code Online (Sandbox Code Playgroud)
而我正试图归还这个DTO:
public class Invoice : TrackedObject {
public DateTime Date { get; set; } …Run Code Online (Sandbox Code Playgroud) xml content-negotiation asp.net-web-api http-accept-header asp.net-core
虽然可以通过 Javascript 获取浏览器的 User-Agent navigator.userAgent,但是否同样可以Accept在不执行 HTTP 请求的情况下获取浏览器的标头?
我有一些前端 javascript 向我的后端 rails 服务器发出异步 http 请求。在前端,我没有使用 XHR(我使用axios,尽管这与问题并不完全相关)。
在请求中,我设置了以下内容来告诉服务器我正在发送 JSON 并确保我得到 JSON:
const config = {
headers: {
"Content-Type": "application/json",
"Accept": "application/json"
}
};
Run Code Online (Sandbox Code Playgroud)
在我的后端 Rails 控制器中,如果检查请求,我可以验证Accept标头:
> request.headers
"HTTP_ACCEPT"=>"application/json, text/plain, */*"
Run Code Online (Sandbox Code Playgroud)
然而 ActionPack/Rails 仍然不尊重这一点并默认为format存在:html
> request.format
=> #<Mime::Type:0x00007fe223919f80 @hash=-1773238723920954657, @string="text/html", @symbol=:html, @synonyms=["application/xhtml+xml"]>
Run Code Online (Sandbox Code Playgroud)
这是为什么?
我知道我可以附加.json到我的请求 URL 以“强制”它指定该格式,但这是唯一的选择吗?我可以轻松地附加它,但它似乎是特定于 Rails 的实现,而不是真正的“正确”方法。
此外,该方法的源代码request.format明确设置:json为 XHR 请求的格式 - rails 目前是否只尊重 XHR 请求?
谢谢!
我正在尝试将一个接受标头添加到使用"jsonp"的jQuery AJAX GET请求中dataType,但由于某种原因它无效.到目前为止,这是我的代码.
var e4json = JSON.stringify( {
"thomas_smith106" : "Daniel244",
"transaction_type" : "34",
"transaction_tag" : "902006933",
"authorization_num" : "ET4653",
"amount" : "15.75"
} );
$.ajax ({
url: "https://api.demo.globalgatewaye4.firstdata.com",
type: "GET",
headers : {
'accepts' : 'application/json'
},
data: e4json,
dataType: "jsonp",
success: function (response) {
alert('Successfuly called the e4 gateway api');
}
});
Run Code Online (Sandbox Code Playgroud)
我尝试了很多东西,但似乎没有任何工作.我查看了jQuery网站上的文档,但我找不到任何好的例子.
这是我的请求标题.我需要接受标头为'application/json'.
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Cookie:_fd_session=d69310c5cd4a02a4700b5ba63f0d0c9b
Host:api.demo.globalgatewaye4.firstdata.com
Referer:http://localhost:8080/smart-two-site/customerinfo.html
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36 …Run Code Online (Sandbox Code Playgroud) 我正在开发一个ASP.Net Web API 2 RESTful Web服务,用于从我的数据库导入和导出数据.对于我的导出方法,客户端有几个选项可以导出不同格式的数据(例如pdf,xml等).我正在尝试确定我的界面的最佳设计,以便客户端通知服务提供数据的格式.
据我所知,我的2个最佳选择是使用带有媒体类型字符串的Accept Header或向客户端可以在查询字符串中提供format参数的方法添加参数.如果我选择使用Accept Header,则可能涉及使用自定义媒体类型字符串.
在我看来,使用Accept Header将更符合HTTP标准和RESTful实践,但在查询字符串中使用format参数将更容易在服务端和客户端上实现.
任何人都可以解释这两种设计的一些优点或缺点是什么?
rest web-services http-headers query-string http-accept-header
RFC 7231 - HTTP/1.1语义和内容,5.3内容协商没有定义如何指定接受具有接受头字段中的正文部分的特定内容类型的多部分/相关内容类型.
例如,如何用text/html正文部分表达对多部分/相关内容的接受
Accept: multipart/related;type=text/html
Run Code Online (Sandbox Code Playgroud)
要么
Accept: multipart/related,text/html
Run Code Online (Sandbox Code Playgroud)
如果你想为不同的html风格指定优先级?
Accept: multipart/related;type=text/html;q=0.7,
multipart/related;type=text/html;level=1,
multipart/related;type=text/html;level=2;q=0.4
Run Code Online (Sandbox Code Playgroud)
要么
Accept: multipart/related,text/html;q=0.7,
text/html;level=1,
text/html;level=2;q=0.4
Run Code Online (Sandbox Code Playgroud)
什么是对的?都?
我正在使用 spring 来构建我的网络应用程序。
在我的自定义WebMvcConfigurationSupport类中,我设置基本ContentNegotiationConfigurer如下:
@Override
public void configureContentNegotiation(final ContentNegotiationConfigurer configurer) {
configurer
.favorPathExtension(false)
.favorParameter(true)
.parameterName("mediaType")
.ignoreAcceptHeader(false)
.useJaf(false)
.defaultContentType(MediaType.APPLICATION_XML)
.mediaType("json", MediaType.APPLICATION_JSON)
.mediaType("xml", MediaType.APPLICATION_XML);
}
Run Code Online (Sandbox Code Playgroud)
我无法设置ignoreAcceptHeader为true,因为我的一些客户依赖此标头进行响应。
但是,当我尝试使用无效Accept标头Accept: :*/*(请注意,额外的冒号)访问我的 API 时,spring 会重定向到错误页面/error,并显示以下日志:
@Override
public void configureContentNegotiation(final ContentNegotiationConfigurer configurer) {
configurer
.favorPathExtension(false)
.favorParameter(true)
.parameterName("mediaType")
.ignoreAcceptHeader(false)
.useJaf(false)
.defaultContentType(MediaType.APPLICATION_XML)
.mediaType("json", MediaType.APPLICATION_JSON)
.mediaType("xml", MediaType.APPLICATION_XML);
}
Run Code Online (Sandbox Code Playgroud)
我可以改变这种行为吗?我想Accept完全忽略标题而不是跳转到错误页面。那可能吗?
我对RFC 2616的解读没有回答我的问题:
服务器应该如何解释多个Accept,Accept-Encoding,Accept-Language等标题?
当然,这通常应该是罕见的,但是我可以假设每个HTTP客户端实际上都应该做到这一点.
想象一下,HTTP请求包括以下内容:
Accept-Language: en
Accept-Language: pt
Run Code Online (Sandbox Code Playgroud)
服务器应该:
Accept-Language: en, pt吗?en)?pt)?选项#1对我来说似乎是最自然的,最有可能是客户意味着什么,并且即使不是客户意味着什么,也最不可能完全打破期望.
但是有没有关于如何处理这些情况的实际规则(理想情况下由RFC指定)?
我怎么能理解这个记录:
Accept: application/vnd.my.api+json
Run Code Online (Sandbox Code Playgroud)
我的意思是,这个"+"符号是否是标准化的(无论如何,我没有在规范中找到它),或者它只是一个惯例?
谢谢.
http ×5
http-headers ×4
ajax ×1
asp.net-core ×1
c# ×1
get ×1
httpclient ×1
java ×1
javascript ×1
jquery ×1
json ×1
jsonp ×1
media-type ×1
mime-types ×1
multipart ×1
query-string ×1
rest ×1
routing ×1
scala ×1
spray ×1
spring ×1
spring-mvc ×1
web-services ×1
xml ×1