相关疑难解决方法(0)

REST API设计:GET需要不应存储在Web服务器日志中的敏感参数

我正在设计一个(as-RESTful-as-possible)API,并想知道如何最好地解决以下问题:

  • 假设我们正在设计一个TLS端点来检索一些资源: GET /objects/{id}
  • 我们不希望对象{id}s存储在我们的Web服务器日志中,因此我们希望避免使用查询字符串或URI参数; 这让我们在请求体中留下了params.(假设数据是id敏感的,我们无权访问另一个非敏感的id)
  • 我知道建议不要在GET请求体中使用参数.带请求正文的HTTP GET
  • 我知道使用POST来获取数据也是值得推荐的,因为它更倾向于RPC设计风格,并且通常会让人感到困惑.

我们如何(应该)设计API GET端点以避免使用可能被记录的查询或URI参数?
在这种情况下使用POST还是有其他创造性方法可以接受吗?
(注意:此API不会向第三方公开)

api rest api-design

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

在OkHttp中使用请求正文获取请求

我正在尝试将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请求?

相关问题:

java okhttp okhttp3

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

如何在 JAX-RS 中向 GET 请求添加正文

我正在尝试使用一个 REST API,它需要一个带有 GET 请求的主体。但是由于 GET 通常没有正文,所以我找不到在我的请求中附加正文的方法。我也在构建 REST API,但教授不允许我们将方法更改为 POST(他给了我们一个我们要创建的端点列表,不多也不少)。

我正在尝试这样做:

Response r = target.request().method(method, Entity.text(body));
Run Code Online (Sandbox Code Playgroud)

我在哪里设置methodtoGETbodyto 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 请求,而不是是否应该这样做。)

java rest jax-rs

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

@FeignClient 强制 @GetMapping 和 @RequestBody POST

我有以下带有 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)

java spring-boot netflix-feign

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

如何正确解析传入的HTTP请求

我使用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服务器的实现.出于各种原因我想要自己的.是的,重新发明轮子很糟糕,我也知道.

c++ parsing http winsock

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

HTTPBuilder在GET方法上设置requestBody

使用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)

groovy get request httpbuilder

5
推荐指数
1
解决办法
2234
查看次数

这个cURL命令中的-d是什么意思?

我正在开发一个调用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上是什么意思?

谢谢

xml api rest curl get

5
推荐指数
1
解决办法
5797
查看次数

如何将参数传递给 Express post HTTP 方法?

我正在构建一个简单的 REST API(使用PouchDBVue.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)

javascript rest express pouchdb vue.js

5
推荐指数
1
解决办法
5405
查看次数

如何使用 GET 方法通过 XMLHttpRequest 传递 FormData

当方法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 请求的方式相同)?

html javascript forms ajax

5
推荐指数
1
解决办法
5398
查看次数

Retrofit 2 - 是否可以获得我正在发送和接收的 JSON 的大小?

我需要在 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)

android json retrofit

5
推荐指数
1
解决办法
9005
查看次数