9

我尝试连接到 Yahoo 网络服务。我通过axis2生成了类。我现在面临的问题是,Web 服务在标头中需要一个特定的键值对,而我绝对不能这样做。我在网上搜索并发现了不同的可能性——它们都不适合我。最有希望的是几乎在本页末尾的帖子,Claude Coulombe 建议更改生成的存根的代码,但这也失败了。谁能告诉我如何解决这个问题?

编辑

使用 Options 的建议方式产生了以下异常:

Exception in thread "main" org.apache.axis2.AxisFault: Address information does not exist in the Endpoint Reference (EPR).The system cannot infer the transport mechanism.

这是我的代码:

val stub = new IndexToolsApiServiceStub("https://api.web.analytics.yahoo.com/IndexTools/services/IndexToolsApiV3")

val client = stub._getServiceClient
val options = new Options
val list = new ArrayList[Header]()
val header = new Header
header.setName("YWA_API_TOKEN")
header.setValue("NOTtheREALvalue")
list.add(header)
options.setProperty(HTTPConstants.HTTP_HEADERS, list)
client.setOptions(options)
stub._setServiceClient(client)
4

6 回答 6

6

您可能想使用Axis2's Options

// Create an instance of org.apache.axis2.client.ServiceClient
ServiceClient client = ...

// Create an instance of org.apache.axis2.client.Options
Options options = new Options();

List list = new ArrayList();

// Create an instance of org.apache.commons.httpclient.Header
Header header = new Header();

// Http header. Name : user, Value : admin
header.setName("user");
header.setValue("admin");

list.add(header);
options.setProperty(org.apache.axis2.transport.http.HTTPConstants.HTTP_HEADERS, list);

client.setOptions(options);

这是该代码的参考

于 2012-08-22T12:37:49.150 回答
2

是否要向 SOAP 请求或响应添加 HTTP 标头并不重要。无论哪种方式,您都应该使用 MessageContext。假设 msgContext 是您的 Axis2 请求/响应消息上下文对象 (org.apache.axis2.context.MessageContext),下面的代码可以解决问题,使用它,您可以添加 HTTP 标头。

`//Instantiate an Options object from org.apache.axis2.client.Options
 Options options = new Options();
 //Instantiate an ArrayList of type NamedValue from org.apache.axis2.context.NamedValue
 List<NamedValue> namedValuePairs = new ArrayList<NamedValue>();
 //Add as much as headers you want using below code
 namedValuePairs.add(new NamedValue("sample", "value"));
 //Finally add namedValuePairs to options, and add options to msgContext
 options.setProperty(org.apache.axis2.transport.http.HTTPConstants.HTTP_HEADERS, namedValuePairs);
 msgContext.setOptions(options);`
于 2016-05-21T21:58:12.320 回答
1

实际上,您只需从 中检索选项引用,ServiceClient而不是替换选项对象。然后添加你想要的属性:

ServiceClient sc = awst._getServiceClient();
Options ops = sc.getOptions();
于 2013-02-27T16:24:21.813 回答
0

我也有同样的问题,解决方案是巴比图里卡:添加标题选项而不

   // Create an instance of org.apache.axis2.client.Options
Options options = new Options();

此页面具有误导性:参考

于 2014-01-15T10:32:33.837 回答
0

两个月前我找到了解决这个问题的方法。您无法使用 Axis2 设置自定义标题。所以我回到了旧的 Axisversion,在那里你可以做到。自己设置 Http-header 不是好的做法,而且大多是不必要的。最重要的是,它不是 SOAP 规范的一部分。这就是为什么你不能用 Axis2 做到这一点的原因。

于 2013-01-08T07:19:10.437 回答
0

解决方案 -

    MyStub stub = new MyStub();
    ServiceClient serviceClient = stub._getServiceClient();
    Options options = serviceClient.getOptions();
    List<NamedValue> namedValuePairs = new ArrayList<NamedValue>();
    namedValuePairs.add(new NamedValue("Authorization", "Basic JSDFANSKMSLAWQEINCCAKNASKNAS2371BASCKA="));
options.setProperty(org.apache.axis2.transport.http.HTTPConstants.HTTP_HEADERS, namedValuePairs);

只需要在选项上设置一个额外的属性,不要像下面这样创建一个新的选项变量,这对我来说没有帮助。

Options options = new Options();

另外,HTTPConstants.AUTHENTICATE直接设置也不行(如下设置)

clientOptions.setProperty(HTTPConstants.AUTHENTICATE, auth);
于 2021-11-24T09:25:06.013 回答