我正在为我们的应用程序开发一个新的RESTful Web服务.
在某些实体上执行GET时,客户端可以请求实体的内容.如果他们想要添加一些参数(例如排序列表),他们可以在查询字符串中添加这些参数.
或者,我希望人们能够在请求正文中指定这些参数. HTTP/1.1似乎没有明确禁止这一点.这将允许他们指定更多信息,可以更容易指定复杂的XML请求.
我的问题:
我刚刚在我的.NET 2.0应用程序中运行此异常(ProtocolViolationException)(在Windows Mobile 6标准仿真器上运行).令我困惑的是,据我所知,我没有添加任何内容正文,除非我无意中以某种方式完成了它.我的代码如下(非常简单).还有什么我需要做的是说服.NET这只是一个http GET吗?
谢谢,布莱恩
//run get and grab response
WebRequest request = WebRequest.Create(get.AbsoluteUri + args);
request.Method = "GET";
Stream stream = request.GetRequestStream(); // <= explodes here
XmlTextReader reader = new XmlTextReader(stream);
Run Code Online (Sandbox Code Playgroud) 可能重复:
带请求正文的HTTP GET
我在这里看过几个不提倡通过HTTP GET发送内容的讨论.可以通过客户端(Web浏览器)发送的数据大小有限制.处理GET数据也取决于服务器.请参阅 以下资源部分.
但是,我被要求测试使用RestTemplate通过HTTP GET发送内容的可能性.我在春季论坛上几乎没有讨论,但没有回答.(请注意通过http Post发送数据工作正常).这里的讨论建议使用POST.
dev env - JBoss AS 5.1,Spring 3.1.3
客户
@Test
public void testGetWithBody()
{
// acceptable media type
List<MediaType> acceptableMediaTypes = new ArrayList<MediaType>();
acceptableMediaTypes.add(MediaType.TEXT_PLAIN);
// header
HttpHeaders headers = new HttpHeaders();
headers.setAccept(acceptableMediaTypes);
// body
String body = "hello world";
HttpEntity<String> entity = new HttpEntity<String>(body, headers);
Map<String, Object> uriVariables = new HashMap<String, Object>();
uriVariables.put("id", "testFile");
// Send the request as GET
ResponseEntity<String> result = restTemplate.exchange(
"http://localhost:8080/WebApp/test/{id}/body",
HttpMethod.GET, entity, String.class, …Run Code Online (Sandbox Code Playgroud) 我被指派为应用程序开发WebAPI控制器(我之前从未使用过的东西).一切都很顺利,有一些基本的请求,如GetAllUsers(int id)只是出于测试原因 - 配置本身很好.
现在这是问题所在.我有一种方法
GetAllItems(Carrier carrier),其中Carrier是一个具有许多不同参数的类.由于我们已经在数据库中有一些Carrier实例用于测试目的,我尝试过查询数据库,根据ID(GUID)属性选择Carrier实例,但没有结果.
有没有办法在输入参数是对象时测试GET请求,而不是手动测试单个值(例如int ID),测试方法或某种测试输入参数?
编辑:感谢大家的反馈,我的问题的解决方案实际上比我预期的更容易解决.我绝对乐意给予好评的是你,虽然很遗憾我的名声太低这样做(我是新来的StackOverflow),所以我必须要回到在不久的将来的某个时候这样做.干杯:)
有没有办法通过"GET"查询web api,但是参数中有复杂的对象?
到目前为止我看到的所有例子似乎都表明我必须使用"POST".但我不想使用"POST",因为这是一个查询,同时我不想要一个带有16个参数的函数,因为它只是尖叫脆弱.
public Product Get(int id, string name, DateTime createdBy, string stockNumber, ... )
{
...
}
Run Code Online (Sandbox Code Playgroud)
我希望将上述内容转化为:
public Product Get(ProductQuery query)
{
...
}
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?你如何使HttpClient与上述服务一起工作.