我正在尝试将一些数据发送到需要“传输编码:分块”标头的 Web 服务。它适用于普通的 POST 请求。但是一旦我添加标题,我总是得到:
由于以下情况,无法传送内容:收到来自客户端的无效请求
这是发送请求的部分:
std::vector<std::wstring> m_headers;
m_headers.push_back(TEXT("Transfer-encoding: chunked"));
std::wstring m_verb(TEXT("POST"));
std::vector<unsigned __int8> m_payload;
HINTERNET m_connectionHandle = WinHttpConnect(m_http->getSessionHandle(), hostName.c_str(), m_urlParts.nPort, 0);
if (!m_connectionHandle) {
std::cout << "InternetConnect failed: " << GetLastError() << std::endl;
return;
}
__int32 requestFlags = WINHTTP_FLAG_SECURE | WINHTTP_FLAG_REFRESH;
HINTERNET m_requestHandle = WinHttpOpenRequest(m_connectionHandle, m_verb.c_str(), (path + extra).c_str(), NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, requestFlags);
if(!m_requestHandle) {
std::cout << "HttpOpenRequest failed: " << GetLastError() << std::endl;
return;
}
for(auto header : m_headers) {
if(!WinHttpAddRequestHeaders(m_requestHandle, (header + TEXT("\r\n")).c_str(), -1, WINHTTP_ADDREQ_FLAG_ADD)) { …
Run Code Online (Sandbox Code Playgroud) 我在使用winsock读取一些分块的HTTP响应数据时遇到了麻烦.我发送请求很好并获得以下回复:
HTTP/1.1 200 OK
Server: LMAX/1.0
Content-Type: text/xml; charset=utf-8
Transfer-Encoding: chunked
Date: Mon, 29 Aug 2011 16:22:19 GMT
Run Code Online (Sandbox Code Playgroud)
使用winsock recv.在这一点上,它只是挂起.我让听众在一个无限循环中运行,但没有任何东西被拾起.
我认为这是一个C++问题,但它也可能与我通过stunnel推送连接以将其包装在HTTPS中的事实有关.我有一个测试应用程序使用C#中的一些库,它通过stunnel完美地工作.我很困惑为什么我的循环在初始recv之后没有收到C++分块数据.
这是有问题的循环...它是在上面的chunked ok响应之后调用的...
while(true)
{
recvBuf= (char*)calloc(DEFAULT_BUFLEN, sizeof(char));
iRes = recv(ConnectSocket, recvBuf, DEFAULT_BUFLEN, 0);
cout << WSAGetLastError() << endl;
cout << "Recv: " << recvBuf << endl;
if (iRes==SOCKET_ERROR)
{
cout << recvBuf << endl;
err = WSAGetLastError();
wprintf(L"WSARecv failed with error: %d\n", err);
break;
}
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我有一个 .NET 客户端应用程序,它使用第三方库通过 http 访问服务器。该库抛出以下错误:
The server committed a protocol violation. Section=ResponseBody Detail=Response chunk format is invalid
Run Code Online (Sandbox Code Playgroud)
该软件已经安装了数十次,所以我认为这一定是客户系统中的问题,我怀疑是之间的代理。
我已经使用 Fiddler 来获得第一个提示。在嗅探 Fiddler 时注意到违反协议:
Illegal chunked encoding. 'MIME-Version: 1.0' is not a hexadecimal number.
Run Code Online (Sandbox Code Playgroud)
Fiddler 显示以下响应:
MIME-Version: 1.0
Content-Type: Multipart/Related; boundary=MIME_boundary_RsidtvFKHs9ymusS/NI6l56qcD8r76ye; type=text/xml
--MIME_boundary_RsidtvFKHs9ymusS/NI6l56qcD8r76ye
Content-Type: text/xml; charset=UTF-8
Content-Transfer-Encoding: 8bit
Content-ID: <osci@message>
Content-Length: 1545
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ soapMessageEncrypted.xsd http://www.w3.org/2000/09/xmldsig# oscisig.xsd http://www.w3.org/2001/04/xmlenc# oscienc.xsd"><soap:Body><xenc:EncryptedData MimeType="Multipart/Related"><xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc"></xenc:EncryptionMethod><ds:KeyInfo><xenc:EncryptedKey><xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5"></xenc:EncryptionMethod><ds:KeyInfo><ds:X509Data><ds:X509Certificate>MIID0jCCArqgAwIBAgIJAMg6MGbE+zZRMA0GCSqGSIb3DQEBDQUAMIGJMQswCQYDVQQGEwJERTEf
MB0GA1UECAwWTWVja2xlbmJ1cmctVm9ycG9tbWVybjERMA8GA1UEBwwIU2Nod2VyaW4xLDAqBgNV
BAoMI0NvbXB1dGVyLUJlcm
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,响应意外停止。
有谁知道问题可能是什么或如何解决?
任何人都可以帮助我为什么java代码有问题并一次打印所有数据而不是将每个块作为javascript代码打印
Java代码:
import org.glassfish.jersey.client.ChunkedInput;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.Response;
public class RunClient {
public static void main(String args[]) throws InterruptedException {
Client client = ClientBuilder.newClient();
//2 is to increase amount of data and 3(seconds) is for time b/w chunked output ,can be changed
final Response response = client.target("http://jerseyexample-ravikant.rhcloud.com/rest/jws/streaming/2/3").request()
.get();
final ChunkedInput<String> chunkedInput = response.readEntity(new GenericType<ChunkedInput<String>>() {
});
String chunk;
while ((chunk = chunkedInput.read()) != null) {
System.err.println("Next chunk received: " );
System.out.println(chunk);
}
}
}
Run Code Online (Sandbox Code Playgroud)
JavaScript :(打开页面 …
我正在尝试连接到Twitter流API端点.它看起来像URLSession
支持流式传输URLSessionStreamTask
,但我无法弄清楚如何使用API.我也找不到任何示例代码.
我尝试测试以下内容,但没有记录网络流量:
let session = URLSession(configuration: .default, delegate: self, delegateQueue: nil)
let stream = session.streamTask(withHostName: "https://stream.twitter.com/1.1/statuses/sample.json", port: 22)
stream.startSecureConnection()
stream.readData(ofMinLength: 0, maxLength: 100000, timeout: 60, completionHandler: { (data, bool, error) in
print("bool = \(bool)")
print("error = \(String(describing: error))")
})
stream.resume()
Run Code Online (Sandbox Code Playgroud)
我也实现了委托方法(包括URLSessionStreamDelegate
),但它们没有被调用.
如果某个代码发布了如何为chunked
来自流端点的响应打开持久连接的示例,那将非常有用.此外,我正在寻求不涉及第三方库的解决方案.类似于/sf/answers/663165121/但使用URLSession等效更新的响应将是理想的.
注意:上面的示例代码中省略了授权信息.
我应该从返回带有 Transfer-Encoding: chunked 的 json 的服务器流式传输一个端点。
我有以下代码,但我无法读取响应。我尝试了 responseBody.streamBytes() 并将输入流转换为 String 但我无法在主线程中执行此操作。我怎么能阅读回复?
@Streaming
@GET("stream/status")
Observable<ResponseBody> streamStatus();
Observable<ResponseBody> observable = ApiClientHelper.getClient().streamStatus();
observable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<ResponseBody>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(final ResponseBody responseBody) {
//DON'T KNOW HOW TO READ DATA
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
Run Code Online (Sandbox Code Playgroud)
编辑:
使用 CURL 的服务器响应:
@Streaming
@GET("stream/status")
Observable<ResponseBody> streamStatus();
Observable<ResponseBody> observable = ApiClientHelper.getClient().streamStatus();
observable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<ResponseBody>() {
@Override
public …
Run Code Online (Sandbox Code Playgroud) 如果未发送Transfer-Encoding: chunked
标头而是您收到标头,如何确定内容数据长度?
我想发送分块的HTTP主体来测试我自己的HTTP服务器.所以我写了这个python代码:
import http.client
body = 'Hello World!' * 80
conn = http.client.HTTPConnection("some.domain.com")
url = "/some_path?arg=true_arg"
conn.request("POST", url, body, {"Transfer-Encoding":"chunked"})
resp = conn.getresponse()
print(resp.status, resp.reason)
Run Code Online (Sandbox Code Playgroud)
我希望HTTP请求的主体是transferrd chunked,但我使用Wireshark捕获网络包,HTTP请求的主体不会被转移.
如何通过python中的http.client lib传递分块体?
我创建了一个HTTP端点(Java中的REST,Spring Framework,Apache Tomcat),其中HTTP响应的标题为"Transfer-Encoding:chunked".我不知道它是由servlet还是服务器创建的.
我不希望端点响应该标头.是否可以强制它以便不发送标题?
我正在研究类似REST的API,它将支持某些资源上的批量操作.由于完成此类请求可能需要一些时间,因此我希望在分块响应中返回操作的状态.媒体类型应为JSON.如何使用JAX-RS?
(我知道有StreamingOutput,但它需要手动序列化数据.)