在这里,我们将给大家分享关于非常简单的AngularJS$httpPOST结果为“400的知识,让您更了解错误请求”和“无效的HTTP状态代码400”的本质,同时也会涉及到如何更有效地.NetHttp
在这里,我们将给大家分享关于非常简单的AngularJS $ http POST结果为“ 400的知识,让您更了解错误请求”和“无效的HTTP状态代码400”的本质,同时也会涉及到如何更有效地.Net HttpWebRequest.GetResponse() 在返回 http 状态代码 400(错误请求)时引发异常、ajax – 将数据发布到RESTful无效的HTTP状态代码405、Angular 2 – 预检的响应具有无效的HTTP状态代码401、angular – HTTP状态代码401,即使我正在发送授权请求标头的内容。
本文目录一览:- 非常简单的AngularJS $ http POST结果为“ 400(错误请求)”和“无效的HTTP状态代码400”
- .Net HttpWebRequest.GetResponse() 在返回 http 状态代码 400(错误请求)时引发异常
- ajax – 将数据发布到RESTful无效的HTTP状态代码405
- Angular 2 – 预检的响应具有无效的HTTP状态代码401
- angular – HTTP状态代码401,即使我正在发送授权请求标头
非常简单的AngularJS $ http POST结果为“ 400(错误请求)”和“无效的HTTP状态代码400”
我在Azure中托管了一个非常简单的.NET Web API,它有两种非常简单的方法:
[EnableCors(origins: "http://simpleapiearl.azurewebsites.net", headers: "*", methods: "*")]public class EnvelopesController : ApiController { // GET: api/Envelopes public IEnumerable<string> Get() { return new string[] { "value1", "value2" }; } // POST: api/Envelopes public string Post([FromBody]Envelope env) { return "rval: " + env + " (and my addition to env)"; }}
我创建了一个简单的插件来调用这些方法。在我的AngularJS代码中,我进行了两个非常简单的$
http调用。GET工作正常。但是,POST始终返回“ 400(错误请求)”,然后在WebStorm控制台中不久显示“
XMLHttpRequestion无法加载…无效的HTTP状态代码400”。
任何和所有建议表示赞赏!
编辑!!
您好,感谢您的快速回复。我只是意识到我忘了添加一些非常相关的细节。
我的POST方法的参数就是所谓的Envelope对象,其中包含两个属性:listingId (int)
和Description(string)
。当我添加urlencoded Content-Type标头,并''{"listingId":1234,"Description":"somedescription"}''
作为POST数据传递时,服务器上POST方法中的env参数为NULL(也就是说,它似乎无法解析我提供的JSON)。抱歉,原始帖子中省略了此内容。
答案1
小编典典我认为这篇文章会有所帮助。
如何在AngularJS中使用$
http发布urlencode表单数据?
默认情况下,$ http服务将通过将数据序列化为JSON然后使用内容类型“ application /
json”将其发布来转换外发请求。当我们想将值作为FORM发布时,我们需要更改序列化算法并使用内容类型“ application / x-www-
form-urlencoded”发布数据。
这是您的修改后的plnkr。您的代码缺少将JSON转换为编码URL的转换。
http://plnkr.co/edit/4aeEDz73qgHSfOv1sBgn?p=preview
$http({ method: ''POST'', url: ''http://simpleApiEarl.azurewebsites.net/api/envelopes'', data: env, headers: {''Content-Type'': ''application/x-www-form-urlencoded''}, transformRequest: function(obj) { var str = []; for(var p in obj) str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); return str.join("&"); } }).
.Net HttpWebRequest.GetResponse() 在返回 http 状态代码 400(错误请求)时引发异常
我的情况是,当我从服务器获取 HTTP 400 代码时,服务器告诉我我的请求出了什么问题是一种完全合法的方式(使用 HTTP 响应内容中的消息)
但是,当状态码为 400 时,.NET HttpWebRequest 会引发异常。
我该如何处理?对我来说,400 是完全合法的,而且很有帮助。HTTP 内容包含一些重要信息,但异常使我偏离了我的道路。
ajax – 将数据发布到RESTful无效的HTTP状态代码405
function WishList() { } WishList.prototype.addToWishList = function(redirectURL,postURL,userObj) { $.ajax({ type: "POST",url: postURL,data: JSON.stringify(userObj),dataType: 'json',contentType: "application/json",success: function(data){alert(data);},failure: function(errMsg) { alert(errMsg); } } This is my object: var user1 = { ID:1,Sex:1,Name:"titi",Company:"ABC",Address:"Phnom Penh",Email:"test.abc@gmail.com",Phone:"011123456",WebAccount:"test.abc@gmail.com",Password:"123456",GroupCustomerID:125,Stars:1,IsVIP:0,PriceLevel:1,LastDateSale:"\/Date(-62135596800000)\/",TotalCredit:150.12,AgingData:null,TotalRedeemPoint:1000.00,RedeemData:null,ExchangeRate:155.00,HistoryData:null }; Calling function : $(document).ready(function () { var myWishList = new WishList(); $('#addToWishList').click(function(){ myWishList.addToWishList('http://www.blahblahblah.com','http://blahblah/Website/Products/Product.svc/Wishlist/',user1); }); });
然后我的控制台出错了:
“NetworkError:在Firefox中不允许405方法和无效的HTTP状态代码405,XMLHttpRequest无法在chrome中加载url.
注意:当我使用Chrome的Rest Client发布到Web服务时,它可以正常工作.
非常感谢任何帮助,谢谢.
http://praneeth4victory.wordpress.com/2011/09/29/405-method-not-allowed/
看起来他们可以在IE中使用它,但与其他浏览器有一些问题.也许这些改变将有助于更好地访问服务.
这篇文章很好地解释了它的错误和部分,所以如果上面的链接没有帮助,这个可以帮助你进一步诊断问题.
http://www.checkupdown.com/status/E405.html
好的最后编辑,只是想确保你有足够的信息,希望能解决你的问题,这里有一篇关于潜在问题的好文章,我相信你有…
http://www.d-mueller.de/blog/cross-domain-ajax-guide/
Angular 2 – 预检的响应具有无效的HTTP状态代码401
但不幸的是他们都没有帮助我:-(.
这是我的问题:我尝试从我的localhost连接到服务器上的REST服务.它适用于FF REST插件,但我的应用程序导致以下错误:
>选项http://…/my_REST_Service/ 401(未经授权)
> XMLHttpRequest无法加载http://…/my_REST_Service/.预检的响应具有无效的HTTP状态代码401
我如何尝试获取我想要的数据:
@Injectable() export class ModelsComponent implements OnInit { private restRoot = 'http://.../my_REST_Service'; private data; constructor(private http: Http) { } ngOnInit() { this.getModels().subscribe(res => { this.data = res; console.log(this.data); }); } authHeaders() { let username: string = 'xxxx'; let password: string = 'xxxx'; let token: string = btoa(username + ":" + password); let headers: Headers = new Headers(); headers.append('Access-Control-Expose-Headers','Authorization'); headers.append('Authorization','Basic ' + token); headers.append("Access-Control-Allow-Origin","http://localhost:4200/"); headers.append("Access-Control-Allow-Methods","*"); headers.append("Access-Control-Allow-Headers","Accept,Accept-Charset,Accept-Encoding,Accept-Language,Authorization,Connection,Content-Type,Cookie,DNT,Host,Keep-Alive,Origin,Referer,User-Agent,X-CSRF-Token,X-Requested-With"); headers.append("Access-Control-Allow-Credentials","true"); return headers; } getModels(): Observable<any> { return this.http.get(this.restRoot,{ headers: this.authHeaders(),withCredentials: true <- from a similar issue }).map(res => res.json()); } }
我的服务器配置如下:
Header set Access-Control-Allow-Origin "http://localhost:4200" Header set Access-Control-Allow-Headers "Accept,X-Requested-With" Header set Access-Control-Allow-Methods "*" Header set Access-Control-Allow-Credentials "true" Header set Access-Control-Expose-Headers "Authorization" <- from a similar issue
我知道还有其他相同/类似的问题.但我仍然不知道该做什么或怎么做.
如果有人可以帮我解决我的代码,我真的很感激!
解决方法
它没有说明你在Access-Control-Allow-Thing中提到的任何事情.
>浏览器正在发出OPTIONS请求,询问是否允许跨源请求.
>回复显示“您的用户名和密码错误”.
由于浏览器未收到发出交叉原始请求的权限:它尚未发送用户名和密码.
您需要在服务器上找到执行授权的代码,并从该测试中排除OPTIONS请求.任何人都应该能够提出OPTIONS请求,而不仅仅是拥有用户名和密码的人.
angular – HTTP状态代码401,即使我正在发送授权请求标头
在那里我尝试通过在我的Angualr代码中传递如下的JWT令牌来执行POST请求
save(jobId: number,taskId: number,note: Note) { return this.http.post(environment.APIENDPOINT + '/jobs/' + jobId + '/tasks/' + taskId + '/notes',note,this.setHeaders()).map((response: Response) => response.json()); }
private setHeaders() { // create authorization header with jwt token let currentUser = JSON.parse(localStorage.getItem('currentUser')); console.log("Current token---"+ currentUser.token); if (currentUser && currentUser.token) { let headers = new Headers(); headers.append('Content-Type','application/json'); headers.append('authorization','Bearer '+ currentUser.token); let r = new RequestOptions({ headers: headers }) return r; } }
但是在服务器端它返回状态码401.问题是在Springboot端它检查授权头如下,它返回null
String authToken = request.getHeader("authorization ");
然后我查看了请求标头,它在Access-Control-Request-Headers下有如下的授权标头.但它对服务器端是不可见的.
然后我进一步阅读并发现这可能是CORS配置的问题.所以我修改了我的CORS配置过滤器以使addExposedHeader如下所示
@Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); config.addAllowedOrigin("*"); config.addAllowedHeader("*"); config.addExposedHeader("authorization"); config.addAllowedMethod("OPTIONS"); config.addAllowedMethod("GET"); config.addAllowedMethod("POST"); config.addAllowedMethod("PUT"); config.addAllowedMethod("DELETE"); //config.addExposedHeader("Content-Type"); source.registerCorsConfiguration("/**",config); return new CorsFilter(source); }
服务器仍然抱怨它无法找到Authorization标头.我在这里错过了什么吗?感谢你的帮助
解
在阅读下面的sideshowbarker评论后,我能够理解这个问题背后的基础知识.
在我的项目中,我有一个JWT令牌过滤器,在里面它始终检查Authorization标头.然后我将其修改如下,现在它按预期工作
protected void doFilterInternal(HttpServletRequest request,HttpServletResponse response,FilterChain chain) throws servletexception,IOException { try { if ("OPTIONS".equalsIgnoreCase(request.getmethod())) { response.setStatus(HttpServletResponse.SC_OK); }else{ String authToken = request.getHeader(this.tokenHeader); jWTTokenAuthenticationService.parseClaimsFromToken(authToken); -- } chain.doFilter(request,response); }Catch(AuthenticationException authEx){ SecurityContextHolder.clearContext(); if (entryPoint != null) { entryPoint.commence(request,response,authEx); } }
}
那是因为发生的事情是这样的:
>您的代码告诉您的浏览器它想要使用Authorization标头发送请求.
>您的浏览器说,好的,带有Authorization标头的请求要求我执行CORS预检OPTIONS,以确保服务器允许使用Authorization标头的请求.
>您的浏览器在没有Authorization标头的情况下将OPTIONS请求发送到服务器,因为OPTIONS检查的全部目的是查看是否可以包含该标头.
>您的服务器看到OPTIONS请求,但不是以指示它允许请求中的Authorization标头的方式响应它,而是由于它缺少标头而拒绝它使用401.
>您的浏览器需要对CORS预检做出200或204的响应,而是获得401响应.所以你的浏览器就在那里停止,从不尝试从你的代码中发出POST请求.
更多细节:
问题屏幕截图中的Access-Control-Request-Headers和Access-Control-Request-Method请求标头表明浏览器正在执行CORS preflight OPTIONS request.
在您的请求中存在Authorization和Content-Type:application / json请求标头是您的浏览器执行CORS预检的原因 – 在您的代码中尝试POST请求之前向服务器发送OPTIONS请求.因为OPTIONS预检失败,浏览器就会停在那里,从不尝试POST.
因此,您必须弄清楚发送请求的服务器上当前服务器端代码的哪一部分导致它需要OPTIONS请求的授权,并进行更改,以便它在没有授权的情况下以200或204成功响应响应OPTIONS被要求.
有关为特定的Spring服务器执行此操作的特定帮助,请参阅以下答案:
> Disable Spring Security for OPTIONS Http Method
> Spring CorsFilter does not seem to work still receiving a 401 on preflight requests
> Response for preflight has invalid HTTP status code 401 – Spring
> AngularJS & Spring Security with ROLE_ANONYMOUS still returns 401
我们今天的关于非常简单的AngularJS $ http POST结果为“ 400和错误请求”和“无效的HTTP状态代码400”的分享就到这里,谢谢您的阅读,如果想了解更多关于.Net HttpWebRequest.GetResponse() 在返回 http 状态代码 400(错误请求)时引发异常、ajax – 将数据发布到RESTful无效的HTTP状态代码405、Angular 2 – 预检的响应具有无效的HTTP状态代码401、angular – HTTP状态代码401,即使我正在发送授权请求标头的相关信息,可以在本站进行搜索。
本文标签: