【问题标题】:How do I inject new request header with json data in proxy request flow?如何在代理请求流中注入带有 json 数据的新请求标头?
【发布时间】:2014-08-08 04:33:26
【问题描述】:

我正在尝试使用 JS 策略在代理请求流中注入一个新的请求标头,以发送到后端服务器。当我查看调试跟踪时,我看到请求头中的 json 数据被扭曲了。

我正在尝试注入一些字符串,例如

{"scope":"","time_till":2264,"id_1":"hUXLXVqpA1J4vA9sayk2UttWNdM","custom_data":{"c_id":"test_data"}}

但是当我查看跟踪窗口时,我看到了这个

{"scope":"","time_till":2264,id_1":"hUXLXVqpA1J4vA9sayk2UttWNdM,"custom_data":{"c_id":"test_data"}} 

我做错了什么?

var obj = {"scope":"","time_till":2264,"id_1":"hUXLXVqpA1J4vA9sayk2UttWNdM","custom_data":{"c_id":"test_data"}};
var header_str = JSON.stringify(obj);
context.setVariable('json-header',header_str);
request.headers['x-json-hedar']= header_str;

【问题讨论】:

    标签: apigee


    【解决方案1】:

    我测试了您的代码,它似乎可以工作。这是一个示例响应,我将标头字符串设置为响应:

    HTTP/1.1 200 OK
    User-Agent: curl/7.30.0
    Accept: */*
    x-json-header: {"scope":"","time_till":2264,"id_1":"hUXLXVqpA1J4vA9sayk2UttWNdM","custom_data":{"c_id":"test_data"}}
    Content-Length: 0
    

    这似乎只是 Apigee 调试会话/跟踪工具的问题,因为标头值设置正确。以下是显示此标头值的调试会话的 JSON 下载:

    {
        "name": "x-json-header",
        "value": "{\"scope\":\"\",\"time_till\":2264,id_1\":\"hUXLXVqpA1J4vA9sayk2UttWNdM,\"custom_data\":{\"c_id\":\"test_data\"}}"
    }
    

    您可以看到传递给 UI 以显示调试信息的值具有格式错误的 json:

    id_1\":\"hUXLXVqpA1J4vA9sayk2UttWNdM,

    【讨论】:

    • 谢谢。我将检查我的后端服务器以查看是否按预期接收值。
    【解决方案2】:

    这似乎不是 Apigee 调试/跟踪 UI 的问题。我看到格式错误的 JSON 流向我的后端服务。

    这是我要发送的标题 -

    {"timeStamp":"2349218349381274","latitude":"34.589","longitude":"-37.343","clientIp":"127.0.0.0","deviceId":"MOBILE_TEST_DEVICE_AGAIN","macAddress":"23:45:345:345","deviceType":"phone","deviceOS":"iOS","deviceModel":"iPhone 5S","connection":"5G","carrier":"Vodafone","refererURL":"http://www.google.com","xforwardedFor":"129.0.0.0","sessionId":"kfkls498327ksdjf","application":"mobile-app","appVersion":"7.6.5","serviceVersion":"1.0","userAgent":"Gecko"}
    

    但 Apigee 读取标题如下。请注意某些字段中缺少的起始引号。

    {"timeStamp":"2349218349381274",latitude":"34.589,longitude":"-37.343,clientIp":"127.0.0.0,deviceId":"MOBILE_TEST_DEVICE_AGAIN,macAddress":"23:45:345:345,deviceType":"phone,deviceOS":"iOS,deviceModel":"iPhone 5S,connection":"5G,carrier":"Vodafone,refererURL":"http://www.google.com,xforwardedFor":"129.0.0.0,sessionId":"kfkls498327ksdjf,application":"mobile-app,appVersion":"7.6.5,serviceVersion":"1.0,"userAgent":"Gecko"}
    

    标头用于对解析它的后端服务的服务调用。没错,我得到了以下错误 -

    com.fasterxml.jackson.core.JsonParseException: Unexpected character ('l' (code 108)):      was expecting double-quote to start field name
    at [Source: java.io.StringReader@22549cdc; line: 1, column: 35]
        at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1378)
        at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:599)
        at com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:520)
        at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._handleUnusualFieldName(ReaderBasedJsonParser.java:1275)
        at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._parseFieldName(ReaderBasedJsonParser.java:1170)
        at com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextToken(ReaderBasedJsonParser.java:611)
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:301)
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121)
        at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2796)
        at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1942)
    

    【讨论】:

    • 我看到了不同的行为,我看到所有标头都作为请求正文传递。很奇怪。
    【解决方案3】:

    在将 JSON 添加到上下文变量时遇到奇怪的行为,例如:

     var header_str = JSON.stringify(obj);
     context.setVariable('json-header',header_str);
    

    我很欣赏这是一个示例,因此您可能没有包含问题的全部范围,但这通常可以正常工作(现在它不会首先添加到变量中):

    request.headers['x-json-header'] = JSON.stringify(obj);
    

    如果您可以从 JavaScript 发送请求,这样的代码也可以工作

    var headers = {"Accept": "application/json", "Accept-Language": "en"};
    var sessionRequest = new Request(url, 'POST', headers, body);
    var exchange = httpClient.send(sessionRequest);
    exchange.waitForComplete()
    if (exchange.isSuccess()){
        var responseObj = exchange.getResponse().content.asJSON;
        if (responseObj.error){
            request.content += JSON.stringify(responseObj);
        }
    }
    

    此外,我成功地使用了 AssignMessage 策略来构建请求,然后使用 Callout 策略来读取存储的请求,然后发出该请求并将结果存储在响应对象中,然后可以由 Extract 读取变量政策。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      • 1970-01-01
      • 2021-06-01
      • 1970-01-01
      相关资源
      最近更新 更多