我有一个Maven Java项目,它使用Mashape Unirest将HTTP请求发送到其他URL.我目前正在编写一个使用Unirest发送普通HTTP请求的集成测试(使用TestNG).当我通过Maven(通过Failsafe插件)运行集成测试时,请求成功发送.但是,当我尝试通过Eclipse运行集成测试时,我继续收到以下错误:
FAILED: getCurrentTimeTest
java.lang.NoSuchFieldError: INSTANCE
at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:52)
at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:56)
at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<clinit>(DefaultHttpRequestWriterFactory.java:46)
at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:72)
at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:84)
at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<clinit>(ManagedHttpClientConnectionFactory.java:59)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$InternalConnectionFactory.<init>(PoolingHttpClientConnectionManager.java:487)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:147)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:136)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:112)
at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:726)
at com.mashape.unirest.http.options.Options.refresh(Options.java:41)
at com.mashape.unirest.http.options.Options.<clinit>(Options.java:27)
at com.mashape.unirest.http.HttpClientHelper.prepareRequest(HttpClientHelper.java:141)
at com.mashape.unirest.http.HttpClientHelper.requestAsync(HttpClientHelper.java:80)
at com.mashape.unirest.request.BaseRequest.asStringAsync(BaseRequest.java:56)
at ...
Run Code Online (Sandbox Code Playgroud)
我还能够使用基本的Java应用程序脚本重现此错误.
我确保我在pom.xml文件中使用的依赖项是最新的和最好的,如下所示:
<dependency>
<groupId>com.mashape.unirest</groupId>
<artifactId>unirest-java</artifactId>
<version>1.3.5</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.2</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpasyncclient</artifactId>
<version>4.0</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.3.2</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20140107</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.3.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我还检查了源代码 …
我正在使用Unirest库从Mashape API中检索JSON.我使用以下代码进行调用:
HttpResponse<JsonNode> request = Unirest.get(URL)
.header("X-Mashape-Authorization", MASHAPE_AUTH)
.asJson();
Run Code Online (Sandbox Code Playgroud)
这将以HttpResponse<JsonNode>
我不熟悉的形式返回我的JSON .
从阅读有限的文档,似乎我必须调用getBody()
响应对象,以获得一个JsonNode对象.我仍然不知道如何处理JsonNode对象.
开始解析这些数据的最佳方法是什么?
编辑: 如果它有助于提供示例,我想要解析的JSON看起来像这样:
{
"success": "1",
"error_number": "",
"error_message": "",
"results": [
{
"name": "name1",
"formatedName": "Name 1"
},
{
"name": "testtesttest",
"formatedName": "Test Test Test"
},
{
"name": "nametest2",
"formatedName": "Name Test 2"
},
{
"name": "nametest3",
"formatedName": "Name Test 3"
}
]
}
Run Code Online (Sandbox Code Playgroud) 我需要对执行补丁程序的Web应用程序执行请求.我正在向这个请求提供它请求我的参数,但我不知道如何从我在补丁请求之前执行的登录请求中传递凭据.我正在尝试从登录响应的标题中获取cookie数据并将其作为简单字符串提供给补丁请求,但我不确定它是否是正确的方法.基本上我正在做的就是这个.
HttpResponse<JsonNode> respuesta = Unirest.post(urlLogin)
.headers(headers)
.fields(fields)
.asJson();
JSONObject body = respuesta.getBody().getObject();
Headers headerBody = respuesta.getHeaders();
String tmp = headerBody.get("set-cookie").get(0);
this.cookie = "sd-touch-mode=false; ".concat(tmp.replace(";Path=/;HttpOnly",""));
Map<String,String> cabeceras = new HashMap<String, String>();
cabecera.put("Cookie", this.cookie);
HttpResponse<JsonNode> respuesta = Unirest.post(urlFixpack)
.headers(headers)
.fields(fields)
.asJson();
Run Code Online (Sandbox Code Playgroud)
我对获取和设置cookie数据的方式感到不舒服,但我没有在文档中找到任何正确的方法.
请有人帮帮我.
谢谢.
我正在使用Unirest(java版本)来发出GET和POST请求.但是我在访问SSL加密站点时遇到问题,因为我的程序在公司网络后面,网络管理员为我设置了防火墙映射.例如foobar.com
映射到56.1.89.12:4444
.但是当我向地址发出请求时,我将收到以下ssl证书错误:
com.mashape.unirest.http.exceptions.UnirestException: javax.net.ssl.SSLException: hostname in certificate didn't match: <56.1.89.12> != <www.foobar.com>
at com.mashape.unirest.http.HttpClientHelper.request(HttpClientHelper.java:131)
at com.mashape.unirest.request.BaseRequest.asString(BaseRequest.java:52)
Run Code Online (Sandbox Code Playgroud)
我看到Unirest
有使用自定义的高级配置httpclient
.所以我使用
Unirest.setHttpClient(MyHttpClient.makeClient());
HttpResponse<String> res = null;
try {
res = Unirest.get(urlstr).asString();
} catch (UnirestException e) {
e.printStackTrace();
}
String jsonstr = res.getBody();
Run Code Online (Sandbox Code Playgroud)
所述makeClient
的方法MyHttpClient
为:
public static HttpClient makeClient(){
SSLContextBuilder builder = new SSLContextBuilder();
CloseableHttpClient httpclient = null;
try {
// builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
builder.loadTrustMaterial(null, new TrustStrategy(){
public boolean isTrusted(X509Certificate[] chain, String authType)
throws CertificateException …
Run Code Online (Sandbox Code Playgroud) 我可以使用Unirest来获取我自己的类的对象,如下所示:
HttpResponse<Item> itemResponse = Unirest.get("http://localhost:8080/item").asObject(Item.class);
Run Code Online (Sandbox Code Playgroud)
我也可以将类型参数设置为List
,这确实给了我一个哈希映射列表,但我想得到一个项目列表.这可能吗?
我们使用Unirest作为REST客户端.下面是我们调用REST服务的示例代码
HttpResponse<JsonNode> response = Unirest
.post(url)
.header(HEADER_CONTENT_TYPE, HEADER_VALUE_APPLICATON_JSON)
.body(payload)
.asJson();
Run Code Online (Sandbox Code Playgroud)
当REST服务返回json时,这是绝对的.如果出现错误,我使用的REST服务不会返回json响应.相反,它返回html错误页面.
由于Unirest试图将html转换为json,因此遇到以下问题
Caused by: com.mashape.unirest.http.exceptions.UnirestException: java.lang.RuntimeException: java.lang.RuntimeException: org.json.JSONException: A JSONArray text must start with '[' at 1 [character 2 line 1]
at com.mashape.unirest.http.HttpClientHelper.request(HttpClientHelper.java:143)
at com.mashape.unirest.request.BaseRequest.asJson(BaseRequest.java:68)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我们只是得到这个InvalidJsonException并且实际的html错误页面丢失了.我们需要在出现错误时在我们的应用程序中显示html错误页面.
在这种情况下,我们如何才能获得原始的REST服务错误?
从 openfire rest api 获取用户实体时,我收到以下错误消息。(我正在用 openfire Restapi 端点包装我的 Api 端点。)
“错误”:“内部服务器错误”,“异常”:“org.springframework.http.converter.HttpMessageNotWritableException”,“消息”:“无法编写 JSON:找不到类 java.io.ByteArrayInputStream 的序列化程序,也未发现任何属性创建 BeanSerializer(为了避免异常,禁用 SerializationFeature.FAIL_ON_EMPTY_BEANS);嵌套异常是 com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class java.io.ByteArrayInputStream 并且没有发现创建 BeanSerializer 的属性(为了避免异常,禁用SerializationFeature.FAIL_ON_EMPTY_BEANS)(通过参考链:com.mashape.unirest.http.HttpResponse[\"rawBody\"])", "path": "/usersInfo/user2"
代码如下。
String host ="http://abdul01anpi01:9090" ;
String userEndPoint = "/plugins/restapi/v1/users" ;
String apiURL = host+userEndPoint ;
HttpResponse<JsonNode> response =null;
response = Unirest.get(apiURL +"/{username}").header("accept", "application/json").header("Content-Type", "application/json").routeParam("username",String.valueOf(username)).asJson();
Run Code Online (Sandbox Code Playgroud)
响应的预期输出如下。
{
"username": "user2",
"name": "user2",
"properties": null
}
Run Code Online (Sandbox Code Playgroud)
请建议,任何帮助表示赞赏。
我的网络应用程序似乎内存不足,我认为这是由于线程泄漏。线程似乎一直在等待,并且越来越大,直到内存达到堆大小的顶部。在空闲且不使用 Web 应用程序时,Web 应用程序的本地 Tomcat 服务器上的线程大小会增加。我对线程泄漏没有很好的理解,但我确信线程应该被释放以释放分配的内存。
我进行了线程转储,其中很多线程都在 com.mashape.unirest.http.utils.SyncIdleConnectionMonitorThread 上等待,如下所示。
"Thread-124" - Thread t@378
java.lang.Thread.State: TIMED_WAITING
at java.lang.Object.wait(Native Method)
- waiting on <44c53e01> (a com.mashape.unirest.http.utils.SyncIdleConnectionMonitorThread)
at com.mashape.unirest.http.utils.SyncIdleConnectionMonitorThread.run(SyncIdleConnectionMonitorThread.java:22)
Locked ownable synchronizers:
- None
"Thread-122" - Thread t@371
java.lang.Thread.State: TIMED_WAITING
at java.lang.Object.wait(Native Method)
- waiting on <3212c7ae> (a com.mashape.unirest.http.utils.SyncIdleConnectionMonitorThread)
at com.mashape.unirest.http.utils.SyncIdleConnectionMonitorThread.run(SyncIdleConnectionMonitorThread.java:22)
Locked ownable synchronizers:
- None
Run Code Online (Sandbox Code Playgroud)
任何解决此问题的有用提示将不胜感激。
我正在使用 unirest 上传这样的文件
unirest.put(fullUri)
.auth({
user: self.userName,
pass: self.password
})
.header('X-Checksum-Sha1', sha1Hash)
.header('X-Checksum-Md5', md5Hash)
.send(fs.readFileSync(filePath))
.end(function (response) {
Run Code Online (Sandbox Code Playgroud)
这适用于较小的文件,但对于大文件,我收到 ERR_FS_FILE_TOO_LARGE 错误。我已经尝试过max_old_space_size
但没有成功。看起来我可以通过流式传输文件来解决这个问题,但是我在 unirest js 库中找不到一个 api 来做到这一点。
Unirest关于代理设置的文档提及使用:
Unirest.setProxy(new HttpHost("127.0.0.1",8000));
由于我正在使用的代理需要身份验证,我还需要指定凭据,但我不知道如何.