我正在设计一个(as-RESTful-as-possible)API,并想知道如何最好地解决以下问题:
GET /objects/{id}{id}s存储在我们的Web服务器日志中,因此我们希望避免使用查询字符串或URI参数; 这让我们在请求体中留下了params.(假设数据是id敏感的,我们无权访问另一个非敏感的id)我们如何(应该)设计API GET端点以避免使用可能被记录的查询或URI参数?
在这种情况下使用POST还是有其他创造性方法可以接受吗?
(注意:此API不会向第三方公开)
我正在尝试将OkHttp 3.6.0与Elasticsearch一起使用,而我却不得不向Elasticsearch Multi GET API发送请求.
它需要向请求主体发送HTTP GET请求.不幸的是,如果我自己尝试构建请求,OkHttp不支持开箱即用并抛出异常.
RequestBody body = RequestBody.create("text/plain", "test");
// No RequestBody supported
Request request = new Request.Builder()
.url("http://example.com")
.get()
.build();
// Throws: java.lang.IllegalArgumentException: method GET must not have a request body.
Request request = new Request.Builder()
.url("http://example.com")
.method("GET", requestBody)
.build();
Run Code Online (Sandbox Code Playgroud)
有没有机会在OkHttp中使用请求主体建立GET请求?
相关问题:
我正在尝试使用一个 REST API,它需要一个带有 GET 请求的主体。但是由于 GET 通常没有正文,所以我找不到在我的请求中附加正文的方法。我也在构建 REST API,但教授不允许我们将方法更改为 POST(他给了我们一个我们要创建的端点列表,不多也不少)。
我正在尝试这样做:
Response r = target.request().method(method, Entity.text(body));
Run Code Online (Sandbox Code Playgroud)
我在哪里设置methodtoGET和bodyto my get body。但是,使用这种方法我得到一个例外:
javax.ws.rs.ProcessingException: RESTEASY004565: A GET request cannot have a body.
Run Code Online (Sandbox Code Playgroud)
有没有办法用 JAX-RS 做到这一点?我们学会了使用 JAX-RS,所以我更喜欢使用它的解决方案,因为我不确定我的教授会允许我们使用任何其他 REST 客户端。我目前正在使用 WildFly 服务器提供的 RESTEasy。
(这不是带有请求正文的HTTP GET的副本,因为我问的是如何在 JAX-RS 中创建带有正文的 GET 请求,而不是是否应该这样做。)
我有以下带有 GET 方法的 REST 控制器,该方法具有 BODY,可与测试和邮递员一起正常工作
@RestController
@RequestMapping(value = "/xxx")
public class Controller {
@GetMapping({"/find"})
public LocalDateTime findMax(@RequestBody List<ObjectId> ids) {
//return sth
}
}
Run Code Online (Sandbox Code Playgroud)
但是当使用 FeignClient 调用服务时, GET 请求会生成一个 POST 请求(@GetMapping 注解被忽略)
@FeignClient
public interface CoveragesServiceResource extends CoveragesService {
@GetMapping({"/find"})
LocalDateTime findMax(@RequestBody List<ObjectId> ids);
}
Run Code Online (Sandbox Code Playgroud)
这给出了一个错误:
Request method 'POST' not supported
Run Code Online (Sandbox Code Playgroud) 我使用WinSck创建了一个C++应用程序,它有一个小的(只需处理我需要的一些功能)http服务器实现.这用于使用http请求与外界通信.它有效,但有时请求处理不正确,因为解析失败.现在我非常确定请求是否正确形成,因为它们是由主要的Web浏览器发送的,例如firefox/chrome或perl/C#(具有http modules/dll).
经过一些调试后,我发现问题实际上是在接收消息时.当消息进入的不仅仅是一个部分(在一次recv()调用中没有读取)时,有时解析失败.我已经经历了很多关于如何解决这个问题的尝试,但似乎没有什么可靠的.
我现在做的是我读取数据,直到我找到"\r\n\r\n"指示标题结束的序列.如果WSAGetLastError()在找到此类序列之前报告了除10035之外的其他内容(连接已关闭/失败),则会丢弃该消息.当我知道我有整个标题时,我会解析它并查找有关体长的信息.但是我不确定这些信息是否是强制性的(我认为不是),如果没有这样的信息我应该怎么做 - 这是否意味着没有身体?另一个问题是,我不知道我是否应该寻找一个"\r\n\r\n"身体后(如果它的长度大于零).
有人知道如何可靠地解析http消息吗?
注意:我知道那里有http服务器的实现.出于各种原因我想要自己的.是的,重新发明轮子很糟糕,我也知道.
使用cURL我可以发送一个正文的GET请求.例:
curl -i -X GET http://localhost:8081/myproject/someController/l2json -H "content-type: application/json" -d "{\"stuff\":\"yes\",\"listThing\":[1,2,3],\"listObjects\":[{\"one\":\"thing\"},{\"two\":\"thing2\"}]}"
Run Code Online (Sandbox Code Playgroud)
为了清晰起见,这是合理格式的JSON:
{"stuff":"yes",
"listThing":[1,2,3],
"listObjects":[{"one":"thing"},{"two":"thing2"}]}
Run Code Online (Sandbox Code Playgroud)
通常-d会告诉cURL发送一个POST,但我已经确认它-X GET正在覆盖它并且它正在发送GET.是否可以使用HTTPBuilder复制它?
我已经做好了:
def http = new HTTPBuilder( 'http://localhost:8081/' )
http.post(path:'/myproject/myController/l2json', body:jsonMe, requestContentType:ContentType.JSON) { resp ->
println "Tweet response status: ${resp.statusLine}"
assert resp.statusLine.statusCode == 200
}
Run Code Online (Sandbox Code Playgroud)
哪个有效,但如果我.post改为.get我得到错误:
Cannot set a request body for a GET method. Stacktrace follows:
Message: Cannot set a request body for a GET method
Line | Method
->> 1144 | setBody in groovyx.net.http.HTTPBuilder$RequestConfigDelegate …Run Code Online (Sandbox Code Playgroud) 我正在开发一个调用RESTful api的程序.api的所有文档都是cURL命令,但我无法生成cURL命令,所以我需要翻译它们并以不同的方式提出请求.这是他们为我想要进行的查询提供的示例代码.
curl -u '{userEmail}:{userApiToken}' -v -X GET -H 'Content-Type: application/xml' -o 'result.xml' -d '<request><layout>1</layout><searchmode>Cany</searchmode><searchvalue>aaron</searchvalue><filtermode></filtermode><filtervalue></filtervalue><special></special><limit>100</limit><start></start><sortfield></sortfield><sortdir></sortdir></request>' https://secure.website.com/contacts `
Run Code Online (Sandbox Code Playgroud)
我已经阅读了cURL文档,并了解除-d之外的所有标志.我得到它的参数是搜索参数的xml,但是-G在GET cURL上是什么意思?
谢谢
我正在构建一个简单的 REST API(使用PouchDB和Vue.js)。现在,我可以创建projects几个字段:
服务器.js:
var express = require('express')
var PouchDB = require('pouchdb')
var app = express()
var db = new PouchDB('vuedb')
app.post('/projects/new', function(req, res) {
var data = {
'type': 'project',
'title': '',
'content': '',
'createdAt': new Date().toJSON()
}
db.post(data).then(function (result) {
// handle result
})
})
Run Code Online (Sandbox Code Playgroud)
客户端.js:
// HTML
<input type="text" class="form-control" v-model="title" placeholder="Enter title">
<input type="text" class="form-control" v-model="content" placeholder="Enter content">
<button class="btn btn-default" v-on:click="submit">Submit</button>
// JS
submit () {
this.$http.post('http://localhost:8080/projects/new').then(response => { …Run Code Online (Sandbox Code Playgroud) 当方法senderform为 POST 时,一切正常。但是,一旦我将方法更改为 GET,我就不会在服务器上收到任何内容。
function ajaxSubmit(destinationElement, senderform) {
var xmlreq = new XMLHttpRequest();
var params = new FormData(senderform);
xmlreq.open(senderform.method, senderform.action, true);
if (/\/content\.php$/.test(senderform.action))
xmlreq.onreadystatechange = receiveTable;
else xmlreq.onreadystatechange = receiveText;
xmlreq.send(params);
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以在 Action 地址的末尾手动附加键值对,但问题是我不知道哪个表单将与哪些字段一起传递。
如果可能的话,我更喜欢原生 javaScript。
如何使用 XMLHttpRequest 和来自 senderform 的键值对发送 GET 请求,该键值对指向表单元素(与它已经适用于 POST 请求的方式相同)?
我需要在 Android 应用程序上构建流量监视器,并且需要存储通过改造发送和接收的所有 json 的大小。使用日志我可以看到它的实际大小,但我还没有找到一种方法来获取此信息以便保存它。我也无法获得response.raw,因为它已经被解析到我的类中。有什么办法可以实现这一点吗?
编辑:将 vadkou 答案标记为最佳答案。
我没有创建新的拦截器,而是传递了 lamda 表达式:
httpClient.addInterceptor( chain -> {
okhttp3.Request request = chain.request();
okhttp3.Response response = chain.proceed(request);
if(request.body()!=null) {
long requestLength = request.body().contentLength();
Log.e("SERVICE GENERATOR", " CONTENT LENGTH" + requestLength);
}
long responseLength = response.body().contentLength();
Log.e("SERVICE GENERATOR", " RESPONSE LENGTH" + responseLength);
return response;
});
Run Code Online (Sandbox Code Playgroud)