Jersey WebResource –标头不附加

昨天我在使用Jersey WebResource类进行HTTP调用时遇到了一个奇怪的问题:似乎我设置的标头在执行HTTP调用时被忽略了。 提前阅读。

我试图实现的目标是调用REST Api从我们的应用程序中获取一些数据。 为此,我使用了Jersey客户端 ,显然,我还必须转发接收到的授权令牌,以便在目标应用程序上对用户进行身份验证。 不了解详细的Jersey Api,我做了以下事情(不完全是,但根据本文内容进行了说明):

WebResource resource = Client.create(new DefaultClientConfig()).resource("http://myapp.org/api/v1/data");
resource.accept(MediaType.APPLICATION_JSON);
resource.type(MediaType.APPLICATION_JSON);
resource.header(HttpHeaders.AUTHORIZATION, "Negotiate " + token);return resource.get(String.class);

但是, Negotiate令牌没有附加,至少在我收到“ 401授权被拒绝”响应时,我明确注意到了这一点。 在我的Apache上记录HTTP请求进一步强调了我的假设。

作为尝试,我将代码稍微重写为以下内容

return Client.create(new DefaultClientConfig()).resource("http://myapp.org/api/v1/data").accept(MediaType.APPLICATION_JSON).type(MediaType.APPLICATION_JSON).header(HttpHeaders.AUTHORIZATION, "Negotiate " + token).get(String.class);

..嘿,它成功了! WTF? 这到底是怎么回事

建造者模式

最初看起来很疯狂,但是当您看看如何在com.sun.jersey.api.client.WebResource类上实现accept(...)时,这将变得更加清晰:

...
@Override
public Builder accept(String... types) {return getRequestBuilder().accept(types);
}
...

每次您都会获得一个新的Builder对象! 这就是为什么它不起作用。 因此,您不必像上面的错误版本那样编写它:

WebResource resource = Client.create(new DefaultClientConfig()).resource("http://myapp.org/api/v1/data");WebResource.Builder builder = resource.accept(MediaType.APPLICATION_JSON);
builder.type(MediaType.APPLICATION_JSON);
builder.header(HttpHeaders.AUTHORIZATION, "Negotiate " + token);return builder.get(String.class);

注意,第一个调用resource.accept()返回Builder对象,随后对type()header()任何调用都直接在该Builder实例上进行。

您甚至可以反转调用顺序,例如先调用resource.type(..) ,然后accept等等。 为什么? 因为WebResource.BuilderWebResource本身都实现相同的接口RequestBuilder ,只是WebResource的实现创建了一个新的Builder对象,而Builder的实现实际上将传递的信息添加到了元数据集合中。

结论

Builder模式是通过隐藏实现细节(尤其是在Java中)来简化对象实例创建的一种通用方法。 通常,您调用一系列向您的对象添加信息的方法,以最终调用build()方法,该方法返回所需的实例。 WebResource类完全隐藏了这一点。 现在,由于已经很长时间没有使用Java进行编码了,所以我不确定WebResource实现Builder模式的方式是否是常见的方式,但是我发现它会分心,并且可能导致讨厌的错误。 至少,我花了几个小时才能弄清楚为什么我的身份验证方案不起作用。

翻译自: https://www.javacodegeeks.com/2015/05/jersey-webresource-header-dont-get-appended.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358716.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动态规划 dynamic programming

动态规划dynamic programming June,7, 2015 作者:swanGooseMan 出处:http://www.cnblogs.com/swanGooseMan/p/4556588.html 声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 &…

Bash脚本教程之脚本入门

目录 Shebang 行 执行权限和路径 env 命令 注释 脚本参数 shift 命令 getopts 命令 配置项参数终止符 --

php m pi 2,PHP学习(2)

PHP 的自定义常量自定义常量需要我们使用define()函数去定义,用法为define(name,value,case_insensitive)其中case_insensitive为可选参数,规定常量是否区分大小写,值为true(不敏感)或者false(默认,敏感)例子:define(&…

Bash脚本教程之read命令

目录 用法 参数 IFS 变量 用法 有时,脚本需要在执行过程中,由用户提供一部分数据,这时可以使用read命令。它将用户的输入存入一个变量,方便后面的代码使用。用户按下回车键,就表示输入结束。 read命令的格式如下。 read [-options] [variable...] 上面语法中,optio…

利用Vulnhub复现漏洞 - JBoss JMXInvokerServlet 反序列化漏洞

JBoss JMXInvokerServlet 反序列化漏洞 Vulnhub官方复现教程漏洞原理 复现过程启动环境端口设置浏览器设置BurpSuit设置 复现漏洞序列化数据生成发送POCEXP Vulnhub官方复现教程 https://vulhub.org/#/environments/jboss/JMXInvokerServlet-deserialization/ 漏洞原理 这…

linux mysql 安装启动失败,Linux服务器一键安装包的mysql启动失败

Linux服务器上用一键安装包配置的环境,启动mysql失败,提示如下错误信息:排查方法:1、查看服务器的磁盘空间是否正常,登录服务器执行命令df -h查看磁盘空间,如果服务器的系统盘或者数据盘空间满了&#xff0…

Ubuntu 安装mysql和简单操作

ubuntu上安装mysql非常简单只需要几条命令就可以完成。 1. sudo apt-get install mysql-server2. apt-get isntall mysql-client3. sudo apt-get install libmysqlclient-dev安装过程中会提示设置密码什么的,注意设置了不要忘了,安装完成之后可以使用如…

卖家工具箱源码_我的测试和代码分析工具箱

卖家工具箱源码上周,我们在LINEAS成立了一个“测试技能小组”,该小组用于交换有关测试的知识。 各种各样的问题反复出现的一个问题是:有哪些工具可以测试和分析代码? 因此,这是我对此的个人回答,按照我倾向…

Bash脚本教程之条件判断

目录 if 结构 test 命令 判断表达式 文件判断 字符串判断 整数判断 正则判断 test 判断的逻辑运算

matlab工序能力分析,《MATLAB编程与系统仿真》课程考核说明

《MATLAB编程与系统仿真》课程考核说明1、考核方式及考核时间综合性仿真及报告书(60%)实验成绩(30%)平时成绩(10%),其中实验成绩包括实验和报告。《MATLAB编程与系统仿真》课程是一门实践性比较强的课程,采用传统的试卷考核方式无法体现学生对MATLAB的掌…

在BurpSuite中安装Jython环境

在BurpSuite中安装Jython环境 下载模块 下载地址 https://www.jython.org/download.html 下载 Jython Standalone版本的 打开burp 第一个框子是刚刚下载jar包 第二个时候python的模块文件地址 要到 lib\site-packages里面 成功 转载于:https://blog.csdn.net/w…

在Spring Framework中通过JNDI进行配置

从某个时候开始,应用程序必须是可配置的。 自第一个版本0.9起,Spring Framework就为该问题提供了一个很好的辅助工具,该类为PropertyPlaceholderConfigurer类,而从Spring Framework 3.1起为PropertySourcesPlaceholderConfigurer类…

Bash脚本教程之循环

目录 while 循环 until 循环 for...in 循环 for 循环 break,continue select 结构 Bash 提供三种循环语法for、while和until。 while 循环 while循环有一个判断条件,只要符合条件,就不断循环执行指定的语句。 while condition; docommands done上面代码中,只要满足…

hdu5247 找连续数

Problem Description小度熊拿到了一个无序的数组,对于这个数组,小度熊想知道是否能找到一个k 的区间,里面的 k 个数字排完序后是连续的。现在小度熊增加题目难度,他不想知道是否有这样的 k 的区间,而是想知道有几个这样…

matlab dtft的函数,DTFT的Matlab矩阵计算的理解

其实是早应该想到的,今天写程序的时候想到了。然后,跟同学说起来,说,原来国外的教材很多都是矩阵的形式来表示离散傅里叶变换的。但是国内的教材没有这么表达。一个是,自己看的东西还是少了,一个是&#xf…

xss测试工具(xsstrike基于python)

xsstrike很强 项目地址: https://github.com/s0md3v/XSStrike安装: git clone https://github.com/s0md3v/XSStrike.git使用文档: https://github.com/s0md3v/XSStrike/wiki/Usageusage: xsstrike.py [-h] [-u TARGET] [--data DATA] [-t …

Bash脚本教程之函数

目录 简介 参数变量 return 命令 全局变量和局部变量,local 命令 简介 函数(function)是可以重复使用的代码片段,有利于代码的复用。它与别名(alias)的区别是,别名只适合封装简单的单个命令,函数则可以封装复杂的多行命令。 函数总是在当前 Shell 执行,这是跟脚本…

dcc garch matlab,如何用Eviews或者MATLAB实现DCC-garch模型?

可以在软件中查到说明文件:以下为说明文件的内容In the first box, you should either enter the name of your group or specify the returns as separate series (transforming expressions like dlog() are also allowed). If you wish to use exogenous variabl…

二维GROUP BY

上午参加了个计算机英语三级考试,回来后BA同事让帮忙统计数据。可能刚考完试思维比较混乱, 整理了好大一会没有想明白怎么写。 最后挣扎了快一个小时终于想起来,记下来留个备份; select store_no, brand_code, count(distinct t.d…

Spring Integration Jdbc RowMapper示例

JDBC入站通道适配器的基本功能是执行SQL查询,提取数据并将以Message形式封装的结果集传递到本地通道。 您可以在JDBC入站通道适配器的示例中阅读有关此内容的更多信息。 有效负载的类型由行映射策略决定。 默认情况下会产生类型为List的有效负载,其中每…