在Postman中使用body参数调用Put方法时出现错误“405 Method Not Allow”(405方法不允许)

jmo0nnb3  于 2022-11-07  发布在  Postman
关注(0)|答案(2)|浏览(749)

我试图通过Postman调用Put方法,但总是得到错误:
“405方法不允许”和“消息”:“要求的资源不支援http方法'PUT'。”
我使用DocumentDB和C#。以下是我的代码:

[Route("multilanguage/Resources/{id}/{Language}")]
[HttpPut]
public async Task<IHttpActionResult> UpdateResource(string Id, string Language, string text)
{
    client = new DocumentClient(new Uri(EndPoint), AuthKey);
    var collectionLink = UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId);

    var query = new SqlQuerySpec("SELECT * FROM MultiLanguage as m where m.id = @pmId", 
    new SqlParameterCollection(new SqlParameter[] { new SqlParameter { Name = "@pmId", Value = Id } }));

    Document doc = client.CreateDocumentQuery<Document>(
            collectionLink, query).AsEnumerable().FirstOrDefault();

    List<Models.Translations> d = doc.GetPropertyValue<List<Models.Translations>>("Translations");
    Models.Translations temp = d.Find(p => p.Language == Language);

    temp.Content = text;
    temp.LastModified = DateTimeOffset.Now;
    temp.ModifiedBy = "admin";
    doc.SetPropertyValue("Translations", d);

    Document updated = await client.ReplaceDocumentAsync(doc);

    return Ok();
}

当我通过Postman调用Put方法时,我调用了“"。2”和“En”是我代码中的前两个参数。我还在Postman请求正文中指定了“text”参数值,其类型为x-www-form-urlencoded:key = text,value = Test!这个put方法应该将临时内容值更新为“Test!"。但是,它总是失败,并出现上面提到的错误。
我错过什么了吗?

hs1ihplo

hs1ihplo1#

405错误当执行一个PUT请求到web api是一个众所周知的主题。你可以在thisthis SO问题中找到许多解决方案。
对于控制器的设计:
PUT被设计成有一个主体,就像POST一样,在您的情况下,您应该发送主体中的所有参数。
您应该创建一个包含要发送到服务器的对象的类:

public class resourceClass
{
    public string Id { get; set; }
    public string Language { get; set; }
    public string text { get; set; }
}

然后指定不带属性routing的route,并从请求正文中获取对象

[Route("multilanguage/Resources/PutResource")]
[HttpPut]
public async Task<IHttpActionResult> UpdateResource([FromBody] resourceClass obj)
{
    client = new DocumentClient(new Uri(EndPoint), AuthKey);
    var collectionLink = UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId);

    var query = new SqlQuerySpec("SELECT * FROM MultiLanguage as m where m.id = @pmId", 
    new SqlParameterCollection(new SqlParameter[] { new SqlParameter { Name = "@pmId", Value = Id } }));

    Document doc = client.CreateDocumentQuery<Document>(
            collectionLink, query).AsEnumerable().FirstOrDefault();

    List<Models.Translations> d = doc.GetPropertyValue<List<Models.Translations>>("Translations");
    Models.Translations temp = d.Find(p => p.Language == Language);

    temp.Content = text;
    temp.LastModified = DateTimeOffset.Now;
    temp.ModifiedBy = "admin";
    doc.SetPropertyValue("Translations", d);

    Document updated = await client.ReplaceDocumentAsync(doc);

    return Ok();
}

从客户端,您可以将对象添加到内容类型application/json的PUT请求中,如下所示

var data = {
    Id: clientId,
    Language: clientLanguage,
    text: clientText
};

在将json添加到http请求时,不要忘记将其字符串化

data: JSON.stringify(data),

然后将在“"处到达PUT控制器。

14ifxucb

14ifxucb2#

检查您发布数据的URL,在我的情况下,URL是不正确的,因为我得到了这些错误,还验证在正文中,您应该选择原始,并将文本更改为JSON,如果您将JSON作为数据传递。

相关问题