如何在Rx Vert.X中结束链式请求?
HttpClient client = Vertx.vertx().createHttpClient();
HttpClientRequest request = client.request(HttpMethod.POST,
"someURL")
.putHeader("content-type", "application/x-www-form-urlencoded")
.putHeader("content-length", Integer.toString(jsonData.length())).write(jsonData);
request.toObservable().
//flatmap HttpClientResponse -> Observable<Buffer>
flatMap(httpClientResponse -> { //something
return httpClientResponse.toObservable();
}).
map(buffer -> {return buffer.toString()}).
//flatmap data -> Observable<HttpClientResponse>
flatMap(postData -> client.request(HttpMethod.POST,
someURL")
.putHeader("content-type", "application/x-www-form-urlencoded")
.putHeader("content-length", Integer.toString(postData.length())).write(postData).toObservable()).
//flatmap HttpClientResponse -> Observable<Buffer>
flatMap(httpClientResponse -> {
return httpClientResponse.toObservable();
})......//other operators
request.end();
请注意,我有。end()
作为最高请求。如何结束。flatmap
内的请求?我甚至需要结束它吗?
答案 0 :(得分:2)
有多种方法可以确保拨打request.end()
。但是我会深入研究Vert.x的文档,或者只是开源代码(如果有的话),看它是否为你调用end()。否则可能是
final HttpClientRequest request = ...
request.toObservable()
.doOnUnsubscribe(new Action0() {
@Override
public void call() {
request.end();
}
});
答案 1 :(得分:1)
我认为你可以做类似下面的代码。
主要思想是您不直接使用HttpClientRequest
客户端获得的Vertx
。相反,您创建另一个可流动的,一旦收到第一个订阅就会调用end()
。
例如,您可以通过一对自定义方法获取请求:在本例中为request1()
和request2()
。他们都使用doOnSubscribe()
来触发您需要的end()
。 Read its description on the ReactiveX page
此考试使用 vertx 和 reactivex ,我希望您可以使用此设置。
import io.reactivex.Flowable;
import io.vertx.core.http.HttpMethod;
import io.vertx.reactivex.core.Vertx;
import io.vertx.reactivex.core.buffer.Buffer;
import io.vertx.reactivex.core.http.HttpClient;
import io.vertx.reactivex.core.http.HttpClientRequest;
import io.vertx.reactivex.core.http.HttpClientResponse;
import org.junit.Test;
public class StackOverflow {
@Test public void test(){
Buffer jsonData = Buffer.buffer("..."); // the json data.
HttpClient client = Vertx.vertx().createHttpClient(); // the vertx client.
request1(client)
.flatMap(httpClientResponse -> httpClientResponse.toFlowable())
.map(buffer -> buffer.toString())
.flatMap(postData -> request2(client, postData) )
.forEach( httpResponse -> {
// do something with returned data);
});
}
private Flowable<HttpClientResponse> request1(HttpClient client) {
HttpClientRequest request = client.request(HttpMethod.POST,"someURL");
return request
.toFlowable()
.doOnSubscribe( subscription -> request.end() );
}
private Flowable<HttpClientResponse> request2(HttpClient client, String postData) {
HttpClientRequest request = client.request(HttpMethod.POST,"someURL");
// do something with postData
return request
.toFlowable()
.doOnSubscribe( subscription -> request.end() );
}
}