相关疑难解决方法(0)

App Engine:400 - 您的客户发出了格式错误或非法的请求

在过去的3到4周内,我一直在遇到此错误,向app引擎发出请求.某些请求 - 特别是HTTP DELETE请求,从谷歌服务器返回此错误.

其他人报告了同样的错误 - 我可以找到3个结果

  1. 它是由过时的cookie引起的 - 清除你的cookie并运行良好的gmail帮助 -
  2. 它是由格式错误的网址引起的 - 只有我能找到的与urlfetch()相关的案例 - 网址中的空格 - App引擎组#1,App Engine组#2
  3. 没有决议 - 零星的behaiour,IE只.App Engine Group#3,App Engine Group#4

我现在在每个浏览器中都会一直得到这种行为.我可以完全清除Chrome,Firefox,Safari中的缓存/ cookie等,重新启动浏览器并仍然可靠地在相同的请求中得到此错误,因此我认为其cookie不相关.在任何情况下,我都可以发出GET,POST和PUT请求同一个cookie没问题.

鉴于它在特定的DELETE请求中可靠地发生,格式错误的URL看起来最有可能,但是我的URL非常简单,并且在开发服务器上工作正常

Firebug将请求标题显示为(我已经将密钥包含在内,因为它们包含标识数据,但是通过从密钥中心删除字符来实现这一点 - 不是为了保证我不会无意中删除任何前导或尾随空格)

    Request URL:http://my-app.appspot.com/agprhcjgLEgVLbm93dCItX0RrbV9Ea25vd3RfbmV0X19wccxDA/Task.xml
    Request Method:DELETE
    Status Code:400 Bad Request

    Request Headers
    Accept:*/*
    Cache-Control:max-age=0
    Content-Type:application/x-www-form-urlencoded
    Origin:http://my-app.appspot.com
    Referer:http://my-app.appspot.com/
    User-Agent:Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4
    X-Requested-With:XMLHttpRequest

    Form Data
    entity_key:agprdC1hcjYLEgVLbm93dCIrX09Ea25vd3RfbmV0X19wMQw

    Response Headers
    Content-Length:1350
    Content-Type:text/html; charset=UTF-8
    Date:Fri, 30 Jul …
Run Code Online (Sandbox Code Playgroud)

google-app-engine

17
推荐指数
2
解决办法
3万
查看次数

如何使Apache Tomcat接受DELETE方法

我正在开发一个RESTful Web服务项目,我正在使用Apache Tomcat和JAX-RS.

我想接受来自客户端的DELETE请求,但每当我从Advanced REST客户端Chrome插件发送DELETE请求时,它都会给出响应代码403 Forbidden.

那么我怎样才能让Apche Tomcat接受DELETE请求呢?

java jax-rs http-status-code-403 tomcat7 http-delete

12
推荐指数
2
解决办法
2万
查看次数

GET/DELETE背后的原因不能在webapi中有正文

为什么HttpMethods如GETDELETE不能包含身体

public Task<HttpResponseMessage> GetAsync(Uri requestUri);
public Task<HttpResponseMessage> DeleteAsync(string requestUri);
Run Code Online (Sandbox Code Playgroud)

同样在Fiddler中,如果我提供一个身体,背景会变成红色.但它仍然会在身体上执行.

小提琴图像

所以作为替代方案,我SendAsync()之所以使用,是因为它接受HttpRequestMessage哪些内容HttpMethod以及内容.

// other codes
Category category = new Category(){ Description = "something" };
string categoryContent = JsonConvert.SerializeObject(category);
string type = "application/json";

HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Delete, "-page-")
HttpContent content = new StringContent(categoryContent, Encoding.UTF8, type);
HttpClient client = new HttpClient();

message.Content = content;
await client.SendAsync(message, HttpCompletionOption.ResponseHeadersRead);
// other codes
Run Code Online (Sandbox Code Playgroud)

我错过了别的什么吗?

c# asp.net-web-api

11
推荐指数
1
解决办法
6213
查看次数

嵌套关系是否应反映在JSON API的URL中?

我正在尝试遵循JSON API.我需要公开对嵌套资源的CRUD访问:产品评论.

在使用JSON API之前,我希望有一个这样的REST接口:

GET    /products/:product_id/reviews     - list reviews for a product
POST   /products/:product_id/reviews     - add a review for a product
PATCH  /products/:product_id/reviews/:id - update a review for a product
DELETE /products/:product_id/reviews/:id - delete a review for a product
Run Code Online (Sandbox Code Playgroud)

在规范中看到一些像这样的嵌套结构:

例如,照片评论的网址将为:

/photos/1/comments

但我不确定这种结构是否适合所有行动.

一方面,POST /products/:product_id/reviews如果我要在评论数据下指定POST主体中的产品,那么创建似乎是多余的relationships.

另一方面,如果在删除评论时指定产品ID很有用(可能不是),那么这DELETE /products/:product_id/reviews/:id似乎是唯一理智的方式; 人们争论是否允许请求正文进行DELETE请求.

我可以为一些请求而不是其他请求嵌套:

GET    /products/:product_id/reviews  - list reviews for a product
POST   /products/:product_id/reviews  - add a review for a product
PATCH  /reviews/:id                   - …
Run Code Online (Sandbox Code Playgroud)

json-api

11
推荐指数
1
解决办法
993
查看次数

REST API,每个资源有多个命令

我有一个关于REST API设计的问题.这是一个简单的(可能太简单)API:

GET /ecommerce/order/123

POST /ecommerce/order (create a new order)

PUT /ecommerce/order/123 (update an existing order)

DELETE /ecommerce/order/123 (cancel order)
Run Code Online (Sandbox Code Playgroud)

但是,如果我希望客户输入订单被取消的原因怎么办?我需要将发布数据发送到API,但这不适用于DELETE.为了迎合这一点,我必须将DELETE更改为PUT.然后我会发布两个不同的资源进行更新和取消.

另一种解决方案是更改API:

GET /ecommerce/order/123

POST /ecommerce/order/create (create a new order)

PUT /ecommerce/order/update/123 (update an existing order)

DELETE /ecommerce/order/cancel/123 (cancel order)
Run Code Online (Sandbox Code Playgroud)

我不确定哪个是最好的选择.

关于REST API如何处理单个资源的多个命令有一个更普遍的问题.

任何输入将不胜感激!我很快就会在练习中阅读REST,但这个问题正在扼杀我.

api rest http

10
推荐指数
1
解决办法
3946
查看次数

如何在Jersey客户端的DELETE请求中发送封装数据?

我在Jersey 2.x中有以下服务器端代码:

@Path("/store/remove/from/group")
@DELETE
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.TEXT_PLAIN)
public Response removeStoresFromGroup(@FormParam("storeName") List<String> storeNames, @FormParam("groupName") String groupName) {
    //......
}
Run Code Online (Sandbox Code Playgroud)

在客户端,我想使用Jersey 2.x客户端向上述Web服务发送删除请求.但是,从Jersey客户端API的文档中,我没有找到如何在DELETE请求中包含以下数据:

WebTarget webTarget = client.target("/store/remove/from/group");
MultivaluedMap<String, String> formData = new MultivaluedHashMap<String, String>();
List<String> storeName = new ArrayList<String>();
storeName.add("Store1");
storeName.add("Store2");
storeName.add("Store3");

formData.addAll("storeName", storeName);
formData.add("groupName", "Group A");

Response response = webTarget.request().accept(MediaType.TEXT_PLAIN).delete();   //The delete() method doesn't take any entity body in the request.
Run Code Online (Sandbox Code Playgroud)

从Jersey客户端API,SyncInvoker该类不支持将delete实体主体作为其参数的方法.所以我只能使用POST或PUT将数据发送到服务器,如下所示(但不是DELETE):

Response response = webTarget.request().accept(MediaType.TEXT_PLAIN).post(Entity.form(formData)); 
Run Code Online (Sandbox Code Playgroud)

但我想使用DELETE请求,因为请求正在删除一些资源.如何通过Jersey客户端发送带有一些实体数据的DELETE请求?

java rest jax-rs jersey

10
推荐指数
3
解决办法
2万
查看次数

如何使用HTTPoison在Elixir中执行DELETE?

我想使用HTTPoison Library在Elixir中执行以下命令.

$ curl -X DELETE -H "expired: 1442395800" -H "signature: ******************" -d '{"api_key":"***************","delete_path":"*******","expired":"****"}' https://cdn.idcfcloud.com/api/v0/caches
{"status":"success","messages":"We accept the cache deleted successfully."}
Run Code Online (Sandbox Code Playgroud)

当我检查的文件如何DELETEHTTPoison

def delete!(url, headers \\ [], options \\ []),   do: request!(:delete, url, "", headers, options)
Run Code Online (Sandbox Code Playgroud)

只有urlheader需要.那么我应该把请求体(json体)放在curl哪里?

在Elixir,我试过了

req_body = "{\"api_key\":\"#{api_key}\",\"delete_path\":\"#{delete_path}\",\"expired\":\"#{expired}\"}"

url = "https://cdn.idcfcloud.com/api/v0/caches"                                                                                           

response = HTTPoison.delete!(url, header, [req_body])
Run Code Online (Sandbox Code Playgroud)

但似乎行不通.有人能说出正确的方法吗?

curl elixir http-delete

9
推荐指数
1
解决办法
721
查看次数

有没有办法允许Google App Engine通过DELETE请求发送正文或有效负载?

我正在尝试与需要将XML数据包含在HTTP DELETE请求正文中的API进行交互.我在AppEngine中使用urlfetch,并且对DELETE请求简单地忽略了有效负载.

阅读本文后:实体主体是否允许HTTP DELETE请求?,我意识到标准可能不允许DELETE请求的正文内容,这就是为什么urlfetch正在剥离正文.

所以我的问题是:当urlfetch忽略有效负载时,是否有某种解决方法可以在app引擎中附加正文内容?

google-app-engine http httpwebrequest

7
推荐指数
1
解决办法
1026
查看次数

ServiceStack DELETE请求是默认对象,POST工作正常

我有一个来自Javascript客户端的DTO.当我尝试发送deleteFromService请求对象是空的(看起来它只是刚刚编辑).如果我将方法更改为postToService请求对象,则填充正确.

我使用的是3.9 API.我在这里不知所措.

服务:

public object Post(Order request)
{
    return _orderRepository.InsertOrder(request);
}

public object Delete(Order request)
{
    _orderRepository.DeleteOrder(request.Uuid);
    return true;
}
Run Code Online (Sandbox Code Playgroud)

JS:

//Fails
serviceClient.deleteFromService("order", order, function () { }, deleteFailed);
//Works
serviceClient.postToService("order", order, function () { }, deleteFailed);
Run Code Online (Sandbox Code Playgroud)

更新:

我在ServiceStack源代码中发现了这个问题.它像处理GET一样处理DELETE并创建请求对象而不是正文,就像它对POST一样.

if (httpMethod == HttpMethods.Get || httpMethod == HttpMethods.Delete || httpMethod == HttpMethods.Options)
{
    try
    {
        return KeyValueDataContractDeserializer.Instance.Parse(queryString, operationType);
    }
}
Run Code Online (Sandbox Code Playgroud)

这样做的问题是,ServiceStack JS客户端使用与POST相同的逻辑创建DELETE请求,通过填充您将其发送到正文的数据(技术上是jQuery XHR dataprop),这意味着服务器无法使用获取客户端发送的消息.

我看对了吗?JS客户端的删除是否被破坏?

c# servicestack

7
推荐指数
1
解决办法
1436
查看次数

Restangular删除身体数据

下面是我的restangular删除请求,我打算根据用户选择传递一组id来删除

var deleteIds = [1,5,10]
Restangular.all('url').customDELETE(deleteIds);
Run Code Online (Sandbox Code Playgroud)

我希望这个deleteIds在body params中传递.我如何将数组作为主体发送,以便我可以看到请求有效负载.

angularjs restangular

6
推荐指数
1
解决办法
1196
查看次数